mysql操作
Posted 沐茈静
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql操作相关的知识,希望对你有一定的参考价值。
- 连接服务器:
shell>mysql -u 用户名 -p Enter password: 或者 shell>mysql -u 用户名 -p 密码
- 断开连接
mysql> QUIT
- 多行语句以分号“;”表结束,一条长的语句可以写在不同的行,只要在最后加分号即可。若不想执行输入的 语句则可以使用‘\\c’
- 不区分大小写
- 查看当前已存在的数据库
mysql> show databases ;
- 创建新数据库
mysql> create database abc; Query OK, 1 row affected (0.00 sec)
注:abc为自己创建的数据库名 - 创建表:
格式: mysql> create table 表名( 字段1 数据类型 , 字段2 数据类型 , ...... 字段n 数据类型 , );
注:创建表之前,需要先选择数据库,如
mysql> use test1; 结果:Database changed 否则显示:1046 - No database selected
下面的范例都是使用如下表:
表1:
学生表student
Sno学号,sname姓名,difdate出生日期, grade年级
表2:
课程表 course
cno课程号,名字cname
表3:
成绩单score
sno学号 cno课程号 score成绩
mysql> create table student( sno varchar(20) not null default '', sname varchar(30), difdate date, grade varchar(10) )ENGINE=InnoDB DEFAULT CHARSET=utf8; create table course( cno varchar(20) not null default '', cname varchar(20) )ENGINE=InnoDB DEFAULT CHARSET=utf8; create table score( sno varchar(20) not null default '', cno varchar(20) , score double )ENGINE=InnoDB DEFAULT CHARSET=utf8; 结果: Query OK, 0 rows affected Query OK, 0 rows affected Query OK, 0 rows affected
- 为了避免中文乱码需以下两步:a.创建数据库时设置编码格式utf-8
b.然后创建表时设置编码格式mysql> CREATE DATABASE test1 CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
create table student( sno varchar(20) not null default, sname varchar(30), difdate date, grade varchar(10) )ENGINE=InnoDB DEFAULT CHARSET=utf8;
- 向表中添加一个或多个记录
注:mysql中的插入日期格式为‘YYYY-MM-DD’,而oracle中 格式为‘DD-M月-YYYY’;字符、汉字、日期需要用单引号; 格式: 1.插入部分字段 mysql>insert into 表名 (字段1,字段2……字段n) values(字段1值,字段2值,……) 2.插入全部的字段,可以省略字段名,如: mysql>insert into 表名 values(字段1值,字段2值,……)
范例:插入值
*表1 mysql> insert into student values('1','李丽','1993-02-03','2007'); insert into student values('2','王明','1993-04-02','2008'); insert into student values('3','李云','1994-03-12','2009'); insert into student values('4','李四','1992-02-13','2007'); insert into student values('5','王五','1992-04-13','2010'); insert into student values('6','赵六','1992-03-28','2009'); insert into student values('7','张三','1992-08-03','2008'); *表2 mysql>insert into course(cno,cname) values('1','语文'); insert into course(cno,cname) values('2','大学英语'); insert into course(cno,cname) values('3','数学'); insert into course(cno,cname) values('4','物理'); insert into course(cno,cname) values('5','生物'); *表3 mysql>insert into score (sno,cno,score) values('1','1',69); insert into score (sno,cno,score) values('1','2',40); insert into score (sno,cno,score) values('1','3',67); insert into score (sno,cno,score) values('1','4',79); insert into score (sno,cno,score) values('1','5',89); insert into score (sno,cno,score) values('2','1',97); insert into score (sno,cno,score) values('2','2',69); insert into score (sno,cno,score) values('2','3',39); insert into score (sno,cno,score) values('2','4',90); insert into score (sno,cno,score) values('2','5',99); insert into score (sno,cno,score) values('3','1',99); insert into score (sno,cno,score) values('3','2',69); insert into score (sno,cno,score) values('3','3',39); insert into score (sno,cno,score) values('3','4',69); insert into score (sno,cno,score) values('3','5',99); insert into score (sno,cno,score) values('4','1',99); insert into score (sno,cno,score) values('4','2',69); insert into score (sno,cno,score) values('4','3',39); insert into score (sno,cno,score) values('4','4',69); insert into score (sno,cno,score) values('4','5',99); insert into score (sno,cno,score) values('5','1',79); insert into score (sno,cno,score) values('5','2',70); insert into score (sno,cno,score) values('5','3',39); insert into score (sno,cno,score) values('5','4',69); insert into score (sno,cno,score) values('5','5',99); insert into score (sno,cno,score) values('6','1',99); insert into score (sno,cno,score) values('6','2',69); insert into score (sno,cno,score) values('6','3',39); insert into score (sno,cno,score) values('6','4',69); insert into score (sno,cno,score) values('6','5',80); insert into score (sno,cno,score) values('7','1',39); insert into score (sno,cno,score) values('7','2',69); insert into score (sno,cno,score) values('7','3',89); insert into score (sno,cno,score) values('7','4',64); insert into score (sno,cno,score) values('7','5',59);
- 单表查询
范例:查询每个表的内容
*表1 mysql> select * from student ; 结果: +-----+-------+------------+-------+ | sno | sname | difdate | grade | +-----+-------+------------+-------+ | 1 | 李丽 | 1993-02-03 | 2007 | | 2 | 王明 | 1993-04-02 | 2008 | | 3 | 李云 | 1994-03-12 | 2009 | | 4 | 李四 | 1992-02-13 | 2007 | | 5 | 王五 | 1992-04-13 | 2010 | | 6 | 赵六 | 1992-03-28 | 2009 | | 7 | 张三 | 1992-08-03 | 2008 | +-----+-------+------------+-------+ 7 rows in set *表2 mysql> select * from course; 结果: +-----+----------+ | cno | cname | +-----+----------+ | 1 | 语文 | | 2 | 大学英语 | | 3 | 数学 | | 4 | 物理 | | 5 | 生物 | +-----+----------+ 5 rows in set *表3 mysql> select * from score ; +-----+-----+-------+ | sno | cno | score | +-----+-----+-------+ | 1 | 1 | 69 | | 1 | 2 | 40 | | 1 | 3 | 67 | | 1 | 4 | 79 | | 1 | 5 | 89 | | 2 | 1 | 97 | | 2 | 2 | 69 | | 2 | 3 | 39 | | 2 | 4 | 90 | | 2 | 5 | 99 | | 3 | 1 | 99 | | 3 | 2 | 69 | | 3 | 3 | 39 | | 3 | 4 | 69 | | 3 | 5 | 99 | | 4 | 1 | 99 | | 4 | 2 | 69 | | 4 | 3 | 39 | | 4 | 4 | 69 | | 4 | 5 | 99 | | 5 | 1 | 79 | | 5 | 2 | 70 | | 5 | 3 | 39 | | 5 | 4 | 69 | | 5 | 5 | 99 | | 6 | 1 | 99 | | 6 | 2 | 69 | | 6 | 3 | 39 | | 6 | 4 | 69 | | 6 | 5 | 80 | | 7 | 1 | 39 | | 7 | 2 | 69 | | 7 | 3 | 89 | | 7 | 4 | 64 | | 7 | 5 | 59 | +-----+-----+-------+ 35 rows in set
5:限定分组后的字段显示条件查询格式: 1:个别字段查询 select 字段1,字段2 ...... from 表名 2:显示表中的全部内容 select * from 表名 3:限定条件查询 select 字段1,字段2 ...... from 表名 where 条件 范例:查询2007级姓李的学生信息 mysql> select * from student where sname like '李%' and grade=2007; 结果: +-----+-------+------------+-------+ | sno | sname | difdate | grade | +-----+-------+------------+-------+ | 1 | 李丽 | 0000-00-00 | 2007 | | 4 | 李四 | 0000-00-00 | 2007 | +-----+-------+------------+-------+ 2 rows in set 4:分组查询 select 字段1,字段2 ...... from 表名 [where 条件] group by 字段 此语句表示按照这个指定的字段进行分组,一般和sql的合计函数一起使用,如sum(),count(),avg(),min(),max(),Var 和 VarP 函数等 范例:统计每个年级的人数 mysql> select grade,count(sno) from student group by grade; 结果: +-------+------------+ | grade | count(sno) | +-------+------------+ | 2007 | 2 | | 2008 | 2 | | 2009 | 2 | | 2010 | 1 | +-------+------------+ 4 rows in set
select字段1,字段2 ......
from 表名
[where 条件]
group by 分组字段
[having 条件]
注意:HAVING 是可选的。HAVING 与 WHERE 类似,可用来决定选择哪个记录。在使用 GROUP BY对这些记录分组后,HAVING 会决定应显示的记录
6:按指定顺序查询asc,desc
select字段1,字段2 ...... from 表名 [where 条件] [group by 分组字段 having 条件] order by 字段a [asc|desc],字段b [asc|desc],...... 表示按照字段a升序排序或降序排序;若字段a相同,则按照字段b升序排序或降序排序;若字段b相同,则按照字段 ....升序排序或降序排序;......
- 多表查询
1:内链接 inner join 范例:查询级的各学生的平均成绩,没有成绩的为先作笛卡尔积 mysql> select * from student s,score sc where s.sno=sc.sno; +-----+-------+------------+-------+-----+-----+-------+ | sno | sname | difdate | grade | sno | cno | score | +-----+-------+------------+-------+-----+-----+-------+ | 1 | 李丽 | 1993-02-03 | 2007 | 1 | 1 | 69 | | 1 | 李丽 | 1993-02-03 | 2007 | 1 | 2 | 40 | | 1 | 李丽 | 1993-02-03 | 2007 | 1 | 3 | 67 | | 1 | 李丽 | 1993-02-03 | 2007 | 1 | 4 | 79 | | 1 | 李丽 | 1993-02-03 | 2007 | 1 | 5 | 89 | | 2 | 王明 | 1993-04-02 | 2008 | 2 | 1 | 97 | | 2 | 王明 | 1993-04-02 | 2008 | 2 | 2 | 69 | | 2 | 王明 | 1993-04-02 | 2008 | 2 | 3 | 39 | | 2 | 王明 | 1993-04-02 | 2008 | 2 | 4 | 90 | | 2 | 王明 | 1993-04-02 | 2008 | 2 | 5 | 99 | | 3 | 李云 | 1994-03-12 | 2009 | 3 | 1 | 99 | | 3 | 李云 | 1994-03-12 | 2009 | 3 | 2 | 69 | | 3 | 李云 | 1994-03-12 | 2009 | 3 | 3 | 39 | | 3 | 李云 | 1994-03-12 | 2009 | 3 | 4 | 69 | | 3 | 李云 | 1994-03-12 | 2009 | 3 | 5 | 99 | | 4 | 李四 | 1992-02-13 | 2007 | 4 | 1 | 99 | | 4 | 李四 | 1992-02-13 | 2007 | 4 | 2 | 69 | | 4 | 李四 | 1992-02-13 | 2007 | 4 | 3 | 39 | | 4 | 李四 | 1992-02-13 | 2007 | 4 | 4 | 69 | | 4 | 李四 | 1992-02-13 | 2007 | 4 | 5 | 99 | | 5 | 王五 | 1992-04-13 | 2010 | 5 | 1 | 79 | | 5 | 王五 | 1992-04-13 | 2010 | 5 | 2 | 70 | | 5 | 王五 | 1992-04-13 | 2010 | 5 | 3 | 39 | | 5 | 王五 | 1992-04-13 | 2010 | 5 | 4 | 69 | | 5 | 王五 | 1992-04-13 | 2010 | 5 | 5 | 99 | | 6 | 赵六 | 1992-03-28 | 2009 | 6 | 1 | 99 | | 6 | 赵六 | 1992-03-28 | 2009 | 6 | 2 | 69 | | 6 | 赵六 | 1992-03-28 | 2009 | 6 | 3 | 39 | | 6 | 赵六 | 1992-03-28 | 2009 | 6 | 4 | 69 | | 6 | 赵六 | 1992-03-28 | 2009 | 6 | 5 | 80 | | 7 | 张三 | 1992-08-03 | 2008 | 7 | 1 | 39 | | 7 | 张三 | 1992-08-03 | 2008 | 7 | 2 | 69 | | 7 | 张三 | 1992-08-03 | 2008 | 7 | 3 | 89 | | 7 | 张三 | 1992-08-03 | 2008 | 7 | 4 | 64 | | 7 | 张三 | 1992-08-03 | 2008 | 7 | 5 | 59 | +-----+-------+------------+-------+-----+-----+-------+ 35 rows in set 再添加条件 mysql>select * from student s,score sc where s.sno=sc.sno and s.grade='2007' ; 结果: +-----+-------+------------+-------+-----+-----+-------+ | sno | sname | difdate | grade | sno | cno | score | +-----+-------+------------+-------+-----+-----+-------+ | 1 | 李丽 | 1993-02-03 | 2007 | 1 | 1 | 69 | | 1 | 李丽 | 1993-02-03 | 2007 | 1 | 2 | 40 | | 1 | 李丽 | 1993-02-03 | 2007 | 1 | 3 | 67 | | 1 | 李丽 | 1993-02-03 | 2007 | 1 | 4 | 79 | | 1 | 李丽 | 1993-02-03 | 2007 | 1 | 5 | 89 | | 4 | 李四 | 1992-02-13 | 2007 | 4 | 1 | 99 | | 4 | 李四 | 1992-02-13 | 2007 | 4 | 2 | 69 | | 4 | 李四 | 1992-02-13 | 2007 | 4 | 3 | 39 | | 4 | 李四 | 1992-02-13 | 2007 | 4 | 4 | 69 | | 4 | 李四 | 1992-02-13 | 2007 | 4 | 5 | 99 | +-----+-------+------------+-------+-----+-----+-------+ 10 rows in set 有重复,所以要进行分组 mysql> select s.sno ,s.sname , avg(sc.score) from student s,score sc where s.sno=sc.sno and s.grade='2007' group by s.sno,s.sname; 结果: +-----+-------+---------------+ | sno | sname | avg(sc.score) | +-----+-------+---------------+ | 1 | 李丽 | 68.8 | | 4 | 李四 | 75 | +-----+-------+---------------+ 2 rows in set 2:外连接 outer join a)左连接 left join b)右连接 right join c) 3:交叉连接
-
mysql日期和字符相互转换方法
date_format(date,'%Y-%m-%d')
对应于oracle中的to_char(,'yyyy-mm--dd'); str_to_date(date,'%Y-%m-%d') 相当于oracle中的to_date(,);
- 单表更新
范例:将数学替换成高等数学
查看结果:mysql> update course set cname='高等数学' where cname='数学'; Query OK, 1 row affected Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from course; +-----+----------+ | cno | cname | +-----+----------+ | 1 | 语文 | | 2 | 大学英语 | | 3 | 高等数学 | | 4 | 物理 | | 5 | 生物 | +-----+----------+ 5 rows in set
- update更新 多表
1.使用inner join .....on更新
范例:给2007级学生的数学成绩加5分
mysql> update score sc inner join course c inner join student s on s.sno=sc.sno and c.cno=sc.cno set score=5+sc.score where s.grade='2007'and c.cname='数学'; Query OK, 2 rows affected Rows matched: 2 Changed: 2 Warnings: 0
- deleted多表删除
1.使用inner join .....on删除
范例:删除姓名是张三的大学语文成绩
mysql> delete sc.* from score sc inner join student s inner join course c on s.sno=sc.sno and sc.cno=c.cno where s.sname='张三' and c.cname='语文'; Query OK, 1 row affected
- 修改表结构alter
1.增加主键
格式:alter table 表名 add constraint 主键名 primary key(字段);
范例:设置student表的主键sno
2.增加外键mysql> alter table student add constraint pk_sno primary key(sno); Query OK, 0 rows affected Records: 0 Duplicates: 0 Warnings: 0
格式:alter table 表名 add constraint 外键名 foreign key(字段) references 关联表的名称(关联表的主键)
范例:设置score表的外键
mysql> alter table score add constraint fk_sno foreign key(sno) references student(sno);
以上是关于mysql操作的主要内容,如果未能解决你的问题,请参考以下文章
已有a,b两个链表,每个链表中的结点包括学号,成绩。要求把两个链表合并,按学号升序排列。