DQL-基础查询
条件查询
使用where子句,不满足条件的行过滤掉,where子句紧随from子句
语法:select <结果> from <表名> where <条件>
比较
=, != 或<>, >, <, >=, <=
逻辑运算
and 与
or 或
not 非
# 查询结果'
SELECT * FROM t_student;
-- =在where 子句后面表示 等于
SELECT * FROM t_student WHERE stu_sex='男';
-- 不等于男
SELECT * FROM t_student WHERE stu_sex<>'男';
SELECT * FROM t_student WHERE stu_sex!='男';
SELECT * FROM t_student WHERE stu_score>60;
SELECT * FROM t_student WHERE stu_score>=60;
-- 逻辑运算
-- and 与 or 或 not 非
-- and 多个条件并列,必须全部成立
SELECT * FROM t_student WHERE stu_score>=60 AND stu_sex='男';
-- or多个条件 符合一个就行
SELECT * FROM t_student WHERE stu_score>=60 OR stu_sex='男';
# 查询成绩合格学生>=60 <=100
SELECT * FROM t_student WHERE stu_score>=60 AND stu_score<=100
SELECT * FROM t_student WHERE stu_score BETWEEN 60 AND 100;
模糊查询
- like 是否匹配一个模式 一般和通配符搭配使用 可以判断字符数值或者数值型
- 通配符: % 任意多个字符,包含0个字符 _ 只能匹配单个字符
- between and 两者直接 闭区间
- in 判断某字段的值是否属于in列表中的某一项
- is null (为空) 或者is not null(不为空)
SELECT * FROM t_student WHERE stu_name LIKE '聂%'
SELECT * FROM t_student WHERE stu_name LIKE '聂_'
SELECT * FROM t_student WHERE stu_name LIKE '%聂%'
-- 查询成绩为80和90的学生
SELECT * FROM t_student WHERE stu_score=80 OR stu_score=90 OR stu_score=100;
SELECT * FROM t_student WHERE stu_score IN(80,90,100)
SELECT * FROM t_student WHERE stu_score NOT IN(80,90,100)
-- 查询性别不为空的
-- is null (为空) 或者is not null(不为空)
SELECT * FROM t_student WHERE stu_sex IS NULL;
SELECT * FROM t_student WHERE stu_sex IS NOT NULL;
UNION和UNION ALL
union用的比较多的是union all是直接连接,取到得得所有得值,记录可能重复
union是取唯一值,记录没有重复
UNION
Union将会按照字段的顺序进行排序;UNION ALL只是简单的将两个结果合并后就返回。
效率:
UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。
1、对重复结果的处理:UNION在进行表链接后会筛选掉重复的记录,Union All不会去除重复记录。
2、对排序的处理:Union将会按照字段的顺序进行排序;UNION ALL只是简单的将两个结果合并后就返回。
从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复数据且不需要排序时的话,那么就使用UNION ALL。
/*
UNION
Union将会按照字段的顺序进行排序;UNION ALL只是简单的将两个结果合并后就返回。
*/
# union是取唯一值 记录没有重复 sql1与 sql2 查询列 必须一一对应 负责出现数据混乱2q
/*
union语法
sql1
union
sql2
union all语法
sql1
union all
sql2
*/
SELECT `stu_num`,`stu_name`,`stu_birth`FROM t_student WHERE stu_name LIKE '聂%'
UNION
SELECT `stu_name`,`stu_num`,`stu_phone`FROM t_student WHERE stu_name LIKE '聂%'
SELECT `stu_num`,`stu_name`FROM t_student WHERE stu_name LIKE '聂%'
UNION ALL
SELECT `stu_num`,`stu_name`FROM t_student WHERE stu_name LIKE '聂%'
排序
查询结果排序
- ,使用 ORDER BY 子句排序 order by 排序列 ASC/DESC
- asc代表的是升序,desc代表的是降序,如果不写,默认是升序
- order by子句中可以支持单个字段、多个字段、表达式、函数、别名
-- order by DESC 降序 asc代表的是升序
-- 默认是按照主键
-- 指定排序序列,排序规则
SELECT * FROM t_student ORDER BY `stu_num` DESC
SELECT * FROM t_student ORDER BY `stu_num` ASC
-- 在条件后添加 排序
SELECT * FROM t_student WHERE stu_sex='男' ORDER BY `stu_num` ASC
数量限制
limit子句:对查询的显示结果限制数目 (sql语句最末尾位置)
- SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset;
- SELECT * FROM table LIMIT 5;
- SELECT * from table LIMIT 0,5;
- SELECT * FROM table LIMIT 2 OFFSET 3;
#限制行数
-- SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset;
-- 提取前三条数据
SELECT * FROM t_student LIMIT 3;
-- 查询成绩前两名的学生 查询前两条
SELECT * FROM t_student WHERE stu_score>0 ORDER BY `stu_score` DESC LIMIT 3;
-- 查询前两个 分页 limit (开始位置由0开始 ,数量)
SELECT * FROM t_student WHERE stu_score>0 ORDER BY `stu_score` DESC LIMIT 0,2;
-- 功能同上
SELECT * FROM t_student WHERE stu_score>0 ORDER BY `stu_score` DESC LIMIT 2 OFFSET 0;
分组查询
语法:
select 分组函数,列(要求出现在group by的后面)
from 表
[where 筛选条件]
group by 分组的列表
[having 分组后的筛选]
[order by 子句]
注意:查询列表比较特殊,要求是分组函数和group by后出现的字段
分组查询中的筛选条件分为两类:
数据源 源位置 关键字
分组前筛选 原始表 group by子句的前面 where
分组后筛选 分组后的结果集 group by的后面 having
SELECT stu_sex ,COUNT(*) FROM t_student GROUP BY stu_sex;
SELECT stu_sex ,MAX(`stu_score`) FROM t_student GROUP BY stu_sex;
-- 添加查询条件
SELECT stu_sex ,COUNT(*) c
FROM t_student
WHERE stu_score>0 -- 分组前对数据进行筛选过滤
GROUP BY stu_sex -- 分组
ORDER BY c DESC -- 对组后的结果进行排序
LIMIT 1;
-- 查询性别人数大于2的 是哪个性别 对分组后的结果进行条件筛选
SELECT stu_sex ,COUNT(*) c
FROM t_student
WHERE stu_score>0 -- 分组前对数据进行筛选过滤
GROUP BY stu_sex
HAVING c>2 -- 对分组后进行条件过滤
ORDER BY c DESC -- 对组后的结果进行排序
子查询
含义:
- 出现在其他语句中的select语句,称为子查询或内查询;外部的查询语句,称为主查询或外查询.
分类:
按照子查询出现得位置:
- select后面: 仅仅标量子查询
- from后面:支持表子查询
- where或having后面:支持标量子查询,列子查询,行子查询(较少)
- exists后面(相关子查询):支持表子查询
按功能、结果集的行列数不同:
- 标量子查询(结果集只有一行一列)
- 列子查询(结果集只有一列多行)
- 行子查询(结果集有一行多列)
- 表子查询(结果集一般为多行多列)
# 子查询出现在其他语句中的select语句
-- 其他语句 insert update delete select
-- 在insert语句中使用子查询
INSERT INTO t_student(stu_name,stu_sex) SELECT stu_name,stu_sex FROM student WHERE stu_num=2
# 在update语句中 使用子查询, 注意查询的结果不能再本表中
UPDATE t_student SET stu_name = '王' WHERE stu_num = (SELECT stu_num FROM stu_temp WHERE stu_num=2)
# 再delete 语句zho使用子查询, 注意查询的结果不能在本表中
DELETE FROM t_student WHERE stu_num = (SELECT stu_num FROM stu_temp WHERE stu_num=2)
-- 在select语句中使用子查询
/*
分类:
按子查询出现的位置:
select后面:仅仅支持标量子查询
from后面:支持表子查询
where或having后面:支持标量子查询,列子查询,行子查询(较少)
exists后面(相关子查询):支持表子查询
按功能、结果集的行列数不同:
标量子查询(结果集只有一行一列)
列子查询(结果集只有一列多行)
行子查询(结果集有一行多列)
表子查询(结果集一般为多行多列)
*/
-- 在select语句后面加子查询,只是标量子查询
SELECT stu_name,(SELECT NOW()),stu_num FROM t_student
-- from后面 支持表子查询 查询性别人数大于2de 是哪个性别
-- 表子查询 (结果集一般为多行多列) 把查询 结果当作一张表处理
SELECT * FROM
(SELECT stu_sex,COUNT(*) c FROM t_student GROUP BY stu_sex )t
WHERE t.c>2
-- 列查询(一列多行的)
SELECT * FROM t_student
WHERE stu_score IN(SELECT stu_score FROM t_student WHERE stu_score >50)
-- 行子查询(结果集有一行多列)
-- 查询学号最小 成绩最高的学生 子查询返回的结果是一行,多列的
SELECT * FROM t_student WHERE (stu_num,stu_score) = (SELECT MIN(stu_num),MAX(stu_score) FROM t_student)
-- 查询成绩最高的学生信息
SELECT * FROM t_student WHERE stu_score = (SELECT MAX(stu_score) FROM t_student)