#2.1 创建学生信息表CREATETABLE person (
number INT(4)PRIMARYKEYauto_increment,
name VARCHAR(50)NOTNULL,
sex CHAR(2),
phone char(11))#2.2 创建学生成绩表CREATETABLE results (
r_id INT(4)PRIMARYKEYauto_increment,
numberNo INT(4)NOTNULL,
subjectNo INT(4)NOTNULL,
examDate dateTimeNOTNULL,
studentResult FLOAT(4,1)NOTNULL)#PRIMARY KEY 主键#auto_increment 自动增长#查询表select*from tb_person
#修改表名altertable person renameto tb_person;#删除字段altertable person drop phone;#添加字段altertable person add phone char(11);#修改字段名altertable person change number number bigint(20);#删除表droptable person
#查看表语句建showcreatetable person;#添加主键altertable person addprimarykey(number);#添加组合主键altertable result addconstraint pk primarykey result(studentNo,subjectNo,examDate);#添加外键altertable 表名 addconstraint 外键名 foreignkey(外键字段)references 关联表名(关联字段)#加入自动增加altertable person modify number intauto_increment;
三、插入语句
#方式一:insertinto 表名(字段名,...)VALUES(值,...);insertinto results(numberNo,subjectNo,examDate,studentResult)values(1,001,'2021-06-26',99.5)#方式二:insertinto person(number,name,sex,phone)values(1,'张三','男',15973946488),(2,'婷婷','女',19967204153)#方式三:INSERTINTO 表名 SET 字段名=值,字段名=值,...;
四、更新语句
1、单表更新
update 表名 set 列 = 值,...where 查询条件;update person set phone =15973946485where number=1;2、多表更新
#方式一:update
表1 别名,
表2 别名
set
列 = 值,...where 连接条件 and 筛选条件 ;#示例update person p,results r
set
p.`NAME`='婷婷',
r.studentResult=99where p.number=r.numberNo
and r.subjectNo=1;#方式二:update
表1 别名
inner|left|rightjoin 表2 别名 on 连接条件
SET 列 = 值,...WHERE 筛选条件 ;#示例UPDATE person p
LEFTJOIN results r ON p.number = r.numberNo
SET p.`NAME`='张三'WHERE
r.subjectNo =1;
五、删除语句
1、单表删除
DELETEFROM 表名 WHERE 筛选条件;deletefrom person where number=1;2、多表删除(级联删除)
DELETE
表1的别名,
表2的别名
FROM
表1 别名,
表2 别名
WHERE 连接条件 AND 筛选条件 ;#示例DELETE p,r
FROM
person p,
results r
WHERE
p.number = r.numberNo
AND r.r_id =3
六、表的复制
#1、复制表的结构CREATETABLE 表名 LIKE 旧表;CREATETABLE person1 LIKE person;#2、复制表的某些字段CREATETABLE 表名
SELECT 字段1,字段2,...FROM 旧表 WHERE0;#示例CREATETABLE person2
SELECT number,phone FROM person WHERE0;#3、复制表的结构+数据CREATETABLE 表名
SELECT 查询列表 FROM 旧表 WHERE 筛选条件;#示例CREATETABLE person3
SELECT*FROM person WHERE sex ='女';#4、复制表的某些字段+数据CREATETABLE 表名
SELECT 字段1,字段2,...FROM 旧表 WHERE 筛选条件;
七、表的查询
7.1基础查询
一、特点
1. 查询列表可以是字段、常量、函数、表达式
2. 查询结果是一个虚拟表
二、示例
1.查询所有
SELECT*FROM person;2.查询单个字段
SELECT phone FROM person;3.查询函数(求平均数)SELECTAVG(studentResult) FORM results;4.查询去重
SELECTDISTINCT 字段名 FROM 表名;
7.2条件查询
SELECT 查询列表 FROM 表名 WHERE 筛选条件;#示例SELECT SEX FROM PERSON WHERE PHONE='15973946488';
7.3排序查询
SELECT
查询列表
FROM
表
【WHERE 筛选条件】
ORDERBY 排序列表 【asc|desc】 ;
7.4分组查询
SELECT
查询字段
FROM
表
【where 筛选条件】
GROUPBY 分组的字段一、字段二
【having 分组后的筛选】
【orderBY 排序的字段一、字段二】 ;#示例一、(group by分组前 用where)SELECT r.studentResult, r.numberNo FROM results r
WHERE
r.numberNo=1GROUPBY
r.numberNo,
r.studentResult
ORDERBY r.studentResult, r.numberNo
#示例二、(group by分组后 用having)SELECT r.studentResult, r.numberNo FROM results r
GROUPBY
r.numberNo,
r.studentResult
HAVING
r.numberNo=1ORDERBY r.studentResult, r.numberNo
7.5连接查询
一、内连接
1.1等值连接
#查寻学生姓名以及对应分数SELECT
p.`NAME`AS 姓名,
r.studentResult AS 分数
FROM
person p,
results r
WHERE
p.number = r.r_id
1.1.1inner内连接
SELECT
p.`NAME`AS 姓名,
r.studentResult AS 分数
FROM
person p
innerjoin results r
on
p.number = r.r_id
1.2自连接
#查询学生对应老师的编号#创建表CREATETABLE person8 (
number INT(4)PRIMARYKEYauto_increment,
NAME VARCHAR(50)NOTNULL,
teacher INT(4),
sex CHAR(2),
phone char(11))#插入数据 insertinto person8(number,name,teacher,sex,phone)value(1,'张三',2,'男',15973946488)insertinto person8(number,name,teacher,sex,phone)value(2,'老师',0,'男',15973946488)insertinto person8(number,name,teacher,sex,phone)value(3,'李四',2,'男',15973946488)SELECT
t.`NAME`,
t.teacher
FROM
person8 p,
person8 t
WHERE
p.number = t.teacher
二、外连接
1.1左外连接:left 【outer】(左边的是主表)
SELECT
p.`NAME`AS 姓名,
r.studentResult AS 分数
FROM
person p
leftjoin results r
on
p.number = r.r_id
1.2右外连接:right 【outer】(右边的是主表)
#查询分数为0的学生SELECT
p.`NAME`AS 姓名,
r.studentResult AS 分数
FROM
person p
rightjoin results r
on
p.number = r.numberNo
where r.studentResult=0;
二、全连接
全外连接:full 【outer】(两边都是主表,但是MySQL不支持全外连接、Oracle支持)因此采用 unionallSELECT p.`NAME`AS 姓名,r.studentResult AS 分数 FROM person p LEFTJOIN results r ON p.number=r.r_id
UNIONALLSELECT p.`NAME`AS 姓名,r.studentResult AS 分数 FROM person p RIGHTJOIN results r ON p.number=r.numberNo
1.1 查询分数最少的学生信息
SELECT r.numberNo,r.r_id,r.studentResult
FROM results r
WHERE
r.studentResult=(SELECTmin(studentResult)FROM results)1.2 查询分数在90分以上的学生
SELECT r.numberNo,r.r_id,r.studentResult
FROM results r
WHERE r.studentResult IN(SELECT
d.studentResult
FROM results d
WHERE d.studentResult >90)
7.7分页查询
SELECT
查询列表
FROM
表1 别名1
【连接类型】 JOIN 表2 别名2ON 连接条件
【WHERE 分组前的筛选】
【GROUPBY 分组字段】
【HAVING 分组后的筛选 】
【ORDERBY 排序字段 ASC|DESC】
LIMIT 【开始的行数】size(每页显示多少条);#limit语句放在查询语句的最后#示例SELECT r.numberNo,r.studentResult FROM results r
WHERE r.studentResult>90GROUPBY r.numberNo,r.studentResult
HAVING r.numberNo=1ORDERBY r.numberNo,r.studentResult LIMIT0,5;