目录
1. 表的设计
三大范式:
1.1 一对一
1.2一对多
1.3 多对多
创建课程表
-- 创建课程表DROP TABLE IF EXISTS course;CREATE TABLE course (id INT PRIMARY KEY auto_increment,name VARCHAR ( 20 ));
创建学生课程中间表,考试成绩表
-- 创建课程学生中间表:考试成绩表DROP TABLE IF EXISTS score;CREATE TABLE score (id INT PRIMARY KEY auto_increment,score DECIMAL ( 3 , 1 ),student_id int ,course_id int ,FOREIGN KEY (student_id) REFERENCES student(id),FOREIGN KEY (course_id) REFERENCES course(id));
2.增加
插入查询结果
INSERT INTO table_name [( column [, column ...])] SELECT ...
案例:创建一张用户表,设计有
name
姓名、
email
邮箱、
sex
性别、
mobile手机号字段。需要把已有的学生数据复制进来,可以复制的字段为
name
、
qq_mail
-- 创建用户表DROP TABLE IF EXISTS test_user;CREATE TABLE test_user (id INT primary key auto_increment,name VARCHAR ( 20 ) comment ' 姓名 ' ,age INT comment ' 年龄 ' ,email VARCHAR ( 20 ) comment ' 邮箱 ' ,sex varchar ( 1 ) comment ' 性别 ' ,mobile varchar ( 20 ) comment ' 手机号 ');
3.查询
3.1 聚合查询
3.1.1 聚合函数
常见的统计总数、计算平局值等操作,可以使用聚合函数来实现,常见的聚合函数有:
COUNT([DISTINCT] expr): 返回查询到的数据的数量SUM([DISTINCT] expr): 返回查询到的数据的 总和,不是数字没有意义AVG([DISTINCT] expr) : 返回查询到的数据的 平均值,不是数字没有意义MAX([DISTINCT] expr) : 返回查询到的数据的 最大值,不是数字没有意义MIN([DISTINCT] expr) : 返回查询到的数据的 最小值,不是数字没有意义
count:
统计班级共有多少同学SELECT COUNT (*) FROM student;SELECT COUNT ( 0 ) FROM student;统计班级收集的 qq_mail 有多少个, qq_mail 为 NULL 的数据不会计入结果SELECT COUNT (qq_mail) FROM student;
SUM:
统计数学成绩总分SELECT SUM (math) FROM exam_result;不及格 < 60 的总分,没有结果,返回 NULLSELECT SUM (math) FROM exam_result WHERE math < 60 ;
AVG :
-- 统计平均总分SELECT AVG (chinese + math + english) 平均总分 FROM exam_result;
MAX:
-- 返回英语最高分SELECT MAX (english) FROM exam_result;
MIN:
-- 返回 > 70 分以上的数学最低分SELECT MIN (math) FROM exam_result WHERE math > 70 ;
3.2 GROUP BY子句
SELECT
中使用
GROUP BY
子句可以对指定列进行分组查询。需要满足:使用
GROUP BY
进行分组查 询时,SELECT
指定的字段必须是
“
分组依据字段
”
,其他字段若想出现在
SELECT
中则必须包含在聚合函数中。
select column1, sum(column2), .. from table group by column1,column3;
4.2 联合查询
实际开发中往往数据来自不同的表,所以需要多表联合查询。多表查询是对多张表的数据取笛卡尔积:
初始化测试数据:
insert into classes(name, `desc( ' 计算机系 2019 级 1 班 ' , ' 学习了计算机( ' 中文系 2019 级 3 班 ' , ' 学习了中国传统( ' 自动化 2019 级 5 班 ' , ' 学习了机械自动insert into student(sn, name, qq_mail, classes_id) values( '09982' , ' 黑旋风李逵 ' , 'xuanfeng@qq.com' , 1 ),( '00835' , ' 菩提老祖 ' , null , 1 ),( '00391' , ' 白素贞 ' , null , 1 ),( '00031' , ' 许仙 ' , 'xuxian@qq.com' , 1 ),( '00054' , ' 不想毕业 ' , null , 1 ),( '51234' , ' 好好说话 ' , 'say@qq.com' , 2 ),( '83223' , 'tellme' , null , 2 ),( '09527' , ' 老外学中文 ' , 'foreigner@qq.com' , 2 );insert into course(name) values( 'Java' ),( ' 中国传统文化 ' ),( ' 计算机原理 ' ),( ' 语文 ' ),( ' 高阶数学 ' ),( ' 英文 ' );insert into score(score, student_id, course_id) values-- 黑旋风李逵( 70.5 , 1 , 1 ),( 98.5 , 1 , 3 ),( 33 , 1 , 5 ),( 98 , 1 , 6 ),-- 菩提老祖( 60 , 2 , 1 ),( 59.5 , 2 , 5 ),-- 白素贞( 33 , 3 , 1 ),( 68 , 3 , 3 ),( 99 , 3 , 5 ),-- 许仙( 67 , 4 , 1 ),( 23 , 4 , 3 ),( 56 , 4 , 5 ),( 72 , 4 , 6 ),-- 不想毕业( 81 , 5 , 1 ),( 37 , 5 , 5 ),--好好说话( 56 , 6 , 2 ),( 43 , 6 , 4 ),( 79 , 6 , 6 ),-- tellme( 80 , 7 , 2 ),( 92 , 7 , 6 );
4.2.1 内连接
语法
select 字段 from 表 1 别名 1 [inner] join 表 2 别名 2 on 连接条件 and 其他条件 ;select 字段 from 表 1 别名 1, 表 2 别名 2 where 连接条件 and 其他条件 ;
4.2.2 外连接
语法
-- 左外连接,表 1 完全显示select 字段名 from 表名 1 left join 表名 2 on 连接条件 ;-- 右外连接,表 2 完全显示select 字段 from 表名 1 right join 表名 2 on 连接条件 ;
4.2.3自连接
语法
先查询 “ 计算机原理 ” 和 “Java” 课程的 idselect id,name from course where name= 'Java' or name= ' 计算机原理 ' ;-- 再查询成绩表中, “ 计算机原理 ” 成绩比 “Java” 成绩 好的信息SELECTs1.*FROMscore s1,score s2WHEREs1 .student_id = s2 .student_idAND s1 .score < s2 .scoreAND s1 .course_id = 1AND s2 .course_id = 3 ;-- 也可以使用 join on 语句来进行自连接查询SELECTs1.*FROMscore s1JOIN score s2 ON s1 .student_id = s2 .student_idAND s1 .score < s2 .scoreAND s1 .course_id = 1AND s2 .course_id = 3 ;
4.2.4.子查询
语法
-- 单行子查询select ... from 表 1 where 字段 1 = (select ... from ...);-- [NOT] INselect ... from 表 1 where 字段 1 in (select ... from ...);-- [NOT] EXISTSselect ... from 表 1 where exists (select ... from ... where 条件 );-- 临时表: form 子句中的子查询select ... from 表 1 , (select ... from ...) as tmp where 条件
4.2.5合并查询
-- UNION :去除重复数据select ... from ... where 条件unionselect ... from ... where 条件-- UNION ALL :不去重select ... from ... where 条件union allselect ... from ... where 条件-- 使用 UNION 和 UNION ALL 时,前后查询的结果集中,字段需要一致
SQL
查询中各个关键字的执行先后顺序:
from > on> join > where > group by > with > having >
select > distinct > order by > limit