(四)DQL数据查询语言
基础语法
SELECT {*,列名,函数}
FROM 表名
[WHERE 条件];
说明:
-SELECT检索关键字 *匹配所有列 , 匹配指定列
-FROM 所提供的数据源(表,视图,另一个查询机制反馈的结果)
-WHERE 条件(控制查询的区域)结论:
SELECT 关键字 和 FROM 关键字之间的语句控制结果的列数
WHERE后面跟的语句控制结果的行数
SELECT 语句中的算数
运算符优先级:括号>乘除>加减
运算顺序:从左往右
null:不可用、未分配的值,不等于零或空格
将两个变量使用运算符进行运算时会自动将字符串转回为数值进行计算,如果字符串中不是数字则会转为数值0
当有一个变量值为null进行运算时,则计算结果为null
补充:
<==>:安全等于,等价于 = 和 IS 两者的结合
1、定义字段的别名
关键字:AS
位置:SELECT后接的列名后面
SELECT StudentName,Address,Email
FROM student;
SELECT StudentName AS '学生姓名',Address AS '家庭住址',Email AS '电子邮箱'
FROM student;
或
SELECT StudentName “学生姓名”,Address “家庭住址”,Email “电子邮箱”
FROM student;
2、祛除重复的记录
关键字:DISTINCT
位置:SELECT后
例:
SELECT DISTINCT sex "性别"
FROM student;
3、WHERE 限制
比较运算符:
- <
- >
- <=
- >=
- !=
- =
逻辑运算符:
- AND
- OR
- NOT
BETWEEN关键字:实现范围查询
IN关键字
LIKE关键字:用于执行模糊查询,查询条件可以包含文字字符或占位符
- %:匹配0或多个字符
- _:匹配一个字符
例:
1、比较符、逻辑符
SELECT *
FROM student
WHERE GradeId = 1 AND BornDate > '1980-01-01' AND sex = 1;2、BETWEEN AND关键字
SELECT StudentName "姓名"
FROM student
WHERE BornDate BETWEEN '2000-01-01' AND '2010-01-01';3、IN关键字
SELECT StudentName "姓名"
FROM student
WHERE GradeId IN (1,2,3);4、LIKE关键字
SELECT StudentName "姓名"
FROM student
WHERE StudentName LIKE '李%';
4、GROUP BY 分组查询
作用:与聚合函数组合使用,将查询的记录进行分组
含义:把表中列值相同的多条记录,当成是一条记录进行处理,最终也只输出一条记录,分组函数忽略空值
语法:
SELECT {*,列名,函数}
FROM 表名
[WHERE 基础条件]
[GROUP BY 分组条件]
[HAVING 过滤条件]
分组函数的重要规则:
- 如果使用了分组函数或GROUP BY (字段1,字段2,...)执行查询,那么出现在SELECT 列表后的字段必须是聚合函数或出现过在GRUOP字句内。
- GRUOP BY子句的字段可以不出现在SELECT内。
- 使用聚合函数但不使用分组查询时,那么所有的数据会作为一组进行显示
- GROUP BY前面的 WHERE 表示 分组前执行的条件过滤
- GROUP BY后面的 HAVING表示 分组后执行的条件过滤
4.1排序查询ASC||DESC
SELECT {*,列名,函数}
FROM 表名
[WHERE 基础条件]
[GROUP BY 分组条件]
[HAVING 过滤条件]
[ORDER BY (需要排序的字段) ASC||DESC]; #ASC升序(升序) DESC(降序)
例:
#示例1、查询平均成绩在80以上的学生(学号)信息,同时成绩还需要按照降序排列
SELECT StudentNo "学号",AVG(StudentResult) "成绩"
FROM result
GROUP BY (StudentNo)
HAVING AVG(StudentResult) > 80;
ORDER BY(AVG(StudentResult)) DESC;
4.2区间查询LIMIT
SELECT {*,列名,函数}
FROM 表名
[WHERE 基础条件]
[GROUP BY 分组条件]
[HAVING 过滤条件]
[ORDER BY (需要排序的字段) ASC||DESC] #ASC升序(升序) DESC(降序)
[LIMIT A,B];
LIMIT 连续区间查询
LIMIT A,B A表示需要查询的行的索引位 B所查询的容量
LIMIT 0,5 第一行---第五
LIMIT 5,5 第六行---第十
LIMIT 10,5 第十一---第十五
分页查询的前置
以baidu热搜为例
>>>>>>>>>>>>> 第一页 LIMIT 0,6
>>>>>>>>>>>>> 第二页 LIMIT 6,6
>>>>>>>>>>>>> 第三页 LIMIT 12,6
>>>>>>>>>>>>> 第四页 LIMIT 18,6
>>>>>>>>>>>>> 第五页 LIMIT 24,6
>>>>>>>>>>>>> 第六页 LIMIT 30,6
>>>>>>>>>>>>> LIMIT (当前页码数-1)*容量,容量
例:
#示例1:求学校学生中 三甲学生的信息#分析 学生总分 降序排列 区间取前三SELECT StudentNo "学号",SUM(StudentResult) "总成绩"FROM resultGROUP BY (StudentNo)ORDER BY(SUM(StudentResult)) DESCLIMIT 0,3;
4.3分组数据合并GROUP_CONCAT
例:
#示例1 根据班级进行分组,要求查看各班人数,以及各班学员姓名。
SELECT GradeID "班级编号",COUNT(*) "班级人数",GROUP_CONCAT(StudentName) "学员姓名"
FROM student
GROUP BY(GradeID);
注意事项:
1、使用GROUP_CONCAT()时必须要对数据源进行分组,如果不分组,所有数据都将合并成一行
2、对结果集排序 查询语句执行的查询结果,数据是按照插入时顺序进行排序。
3、实际上需要按照某列大小值进行拍讯的话,建议只针对于数值或日期通过 ORDER BY函数进行排序
4、在语句最后也可以通过LIMIT控制容量大小
5、多表关联查询
5.1交叉连接查询
查询多个表的数据
#示例1:查询所有的学生+所有的班级信息
SELECT *
FROM student,grade;
5.2等值连接查询
语法:
SELECT *
FROM 表1,表2,...
WHERE 表1.列 = 表2.列 [AND...];
例:
示例:查询所有的学生姓名,住址,班级名称
SELECT s.StudentName "姓名",s.Address "住址",g.GradeName "班级名称"
FROM student s,grade g
WHERE s.GradeID = g.GradeID;
等值连接确实能够帮助我们完成表于表之间的联系,但是WHERE这个关键字一开始是作为基础条件关键字出现的,而我们把表与表之间关系的描述通过WHERE去实施,难免大材小用,于是我们决定释放WHERE关于等值连接的操作。
5.3内连接查询
关键字:INNER JOIN
语法:
SELECT *
FROM 表1 INNER JOIN 表2 ON 表1.列 = 表2.列 [INNER JOIN 表3 ON 关系 .....]
[WHERE 基础条件];
例:
示例:练习查询学生姓名,参考科目,考试时间,考试成绩
SELECT s.StudentName "学生姓名",su.SubjectName "参考科目",r.ExamDate "考试时间",r.StudentResult "考试成绩"
FROM student s INNER JOIN result r ON r.StudentNo = s.StudentNo
INNER JOIN subject su ON r.SubjectNo = su.SubjectNo;
内连接查询的本质和等值实际上没有区别,但是内连接可以释放WHERE关键字,使表与表之间关系更加清晰
5.4外连接查询
5.4.1 左外连接
关键字:LEFT JOIN
获取相交数据+左外关键字以左表的全部数据
SELECT s.StudentName "姓名",s.Address "住址",g.GradeName "班级名称"
FROM grade g LEFT JOIN student s ON s.GradeID = g.GradeID;
5.4.2 右外连接
关键字:RIGHT JOIN
获取相交数据+右外关键字以右的全部数据
SELECT s.StudentName "姓名",s.Address "住址",g.GradeName "班级名称"
FROM student s RIGHT JOIN grade g ON s.GradeID = g.GradeID;
5.5自然连接查询
自己和自己形成主外键关系
SELECT c1.categoryName "父级目录",c2.categoryName "子栏目"
FROM category c1 INNER JOIN category c2 ON c1.categoryId = c2.pid;
6、子查询
- 1、将一个查询语句的结果充当下一个查询语句的条件
- 2、核心在于通过小括号以提高优先级别
- 3、子查询中可以包含的关键字 IN NOT ALL
- 4、子查询中可以包含的运算符 逻辑+算数
#示例1:查询大一的男生姓名及家庭住址
#1--大一对应的班级编号
SELECT GradeID FROM grade WHERE GradeName = '大一'; ======> 1
#2--以一年级一班对应的班级编号作为线索,去找适配的学生信息
SELECT StudentName "姓名",Address "住址"
FROM student WHERE GradeID =
(SELECT GradeID FROM grade WHERE GradeName = '大一');
#3--加入我们的基础条件
SELECT StudentName "姓名",Address "住址"
FROM student WHERE GradeID =
(SELECT GradeID FROM grade WHERE GradeName = '大一') AND sex = 1;
#示例2:查询班级名称是大一(学生信息==>学号信息),科目是高等数学-1(科目编号) 的学生的平均分
>>>>需求1 根据班级名 找出班级 编号
SELECT GradeID
FROM grade WHERE GradeName = '大一';
>>>>需求2 根据对应的班级编号 找到适配的学生学号
SELECT StudentNo
FROM student WHERE GradeID = (SELECT GradeID
FROM grade WHERE GradeName = '大一')
>>>>需求3 根据科目名找到对应的科目编号
SELECT subjectNo
FROM subject WHERE subjectName = '高等数学-1';
>>>>编辑最后的命令
SELECT AVG(result.StudentResult)
FROM result
WHERE result.SubjectNo = (SELECT subjectNo
FROM subject WHERE subjectName = '高等数学-1')
AND result.StudentNo IN (SELECT StudentNo
FROM student WHERE GradeID = (SELECT GradeID
FROM grade WHERE GradeName = '大一'));