四、DQL数据查询语言
查询简介
查询会产生一张虚拟表
语法结构:
注意:*号代表表中所有字段,这个不建议使用,会影响查询效率;
SELECT 字段名,字段名 FROM 表名 WHERE 筛选过滤条件
常用查询命令语法规范:
- 关键字
**大写**,**表名**、**字段名小写**; - MySQL支持关键字小写;
MySQL服务登录和退出
# 登录:
MySQL -u root -p
# 退出:
quit;
# 或者
exit;
查询有哪些数据库
// 查询有哪些数据库
show databases;
指定操作数据库
// 指定操作数据库:
use 数据库名字;
查看数据库中有哪些表
// 查看数据库中有哪些表:
show tables;
查看表结构
// 查看表结构
desc 表名;
// 查看表数据:
select * from 表名
// 查询创建表创建结构.
show create table 表名;
查询表中所有数据
// 查询表中所有数据
SELECT * FROM student;
指定字段查询
// 指定字段查询
SELECT 'name',address FROM student;
AS 起别名
// AS 起别名
SELECT name AS 姓名,address AS 地址 FROM student;
不用as 起别名
// 不用as 起别名
SELECT name 姓名,address 地址 FROM student;
LIMIT使用
注意:limit 0,2 逗号前面表示从哪一行开始取值,第一行是0,逗号右边值取多少行
// 查询0到2行的且id=901的数据
SELECT * FROM student WHERE id=901 LIMIT 0,2
DISTINCT去重
// DISTINCT去重
SELECT DISTINCT department AS 院系,address FROM student;
单条件查询:
= != < > >= <=
大于等于
// 查询id大于等于905的数据
SELECT * FROM student WHERE id>=905
多条件查询:
AND OR NOT
and且
// and且
SELECT * FROM student WHERE id>=905 AND sex='女';
or或
// or或
SELECT * FROM student WHERE id>=905 OR sex='男'
范围选择:
方式一:笨查询
// 查询年龄大于20且小于28的数据
SELECT * FROM student WHERE (2022-birth)>20 AND (2022-birth)<28;
方式二:BETWEEN AND之间
// 查询年龄在20到28之间的数据
SELECT * FROM student WHERE 2022-birth BETWEEN 20 AND 28;
方式三:NOT BETWEEN AND不在之间
// 查询年龄不在20到28之间的数据
SELECT * FROM student WHERE 2022-birth NOT BETWEEN 20 AND 28;
集合操作:
1、or或
// 查询专业=计算机系 或=英语系 或性别为女的数据
SELECT * FROM student WHERE department='计算机系' OR department='英语系' OR sex='女'
2、in在里面
// 查询专业在(计算机系,中文系)中的数据
SELECT * FROM student WHERE department IN ('计算机系','中文系')
3、not in不在里面
// 查询不在计算机系或中文系的数据
SELECT * FROM student WHERE department NOT IN ('计算机系','中文系')
模糊匹配
LIKE模糊匹配一个字符
// 模糊匹配一个字符
SELECT * FROM student WHERE name LIKE '_三'
%任意字符,可以是0个
// %任意字符 可以是0个
SELECT * FROM student WHERE address LIKE '辽宁%'
查询空号 is NULL
// 查询空号 is NULL
SELECT * FROM student WHERE name is NULL
常量列:
// 常量列
SELECT name as 姓名,address AS 地址,'希望小学' AS 学校 FROM student
排序
升序ASC
// 升序ASC
SELECT * FROM score WHERE c_name='计算机' ORDER BY grade ASC
降序 DESC
// 降序 DESC
SELECT * FROM score WHERE c_name='计算机' ORDER BY grade DESC
聚合函数:
count 计数:
// count 计数
SELECT COUNT(grade) FROM score
max最大值
// 求计算机系学生的最高分
SELECT stu_id AS 学号, MAX(grade) AS 成绩 FROM score WHERE c_name='计算机'
min最小值
// min 求计算机系学生的最低分
SELECT stu_id AS 学号, min(grade) AS 成绩 FROM score WHERE c_name='计算机'
sum求和
// sum求和
SELECT stu_id AS 学号, SUM(grade) AS 成绩 FROM score WHERE c_name='计算机'
avg平均值
// avg平均值
SELECT stu_id AS 学号, AVG(grade) AS 成绩 FROM score WHERE c_name='计算机'
分组
WHERE子句:
从数据源中去掉不符合其搜索条件的数据
GROUP BY子句:
搜集数据行到各个组中,统计函数为各个组计算统计值,每个组输出一行结果
// 求每个系的最高分
SELECT c_name,AVG(grade) FROM score GROUP BY c_name
多字段分组
// 多字段分组
SELECT stu_id,c_name,AVG(grade) FROM score GROUP BY c_name,stu_id
HAVING子句:
从分组计算结果中进行过滤,去掉不符合其组搜索条件的各组数据行
// HAVING 对之前分组的结构进行过滤
SELECT c_name,AVG(grade) FROM score GROUP BY c_name HAVING AVG(grade)<=90;
子查询:sql里面嵌套sql
SELECT id,name FROM student
WHERE id=(
SELECT stu_id FROM score WHERE c_name='计算机' AND grade=70);
IN 后面可以赋多个值,用括号
// 查询中文系的学生信息
SELECT * FROM student WHERE id IN (SELECT stu_id FROM score WHERE c_name='中文')
NOT IN
// 查询不在中文系的学生信息
SELECT * FROM student WHERE id NOT IN (SELECT stu_id FROM score WHERE c_name='中文')
EXISTS如果存在
// EXISTS 如果子查询返回结果为真,则执行前面sql ,如果为假,则前半句sql执行结果为空
SELECT * FROM score WHERE EXISTS (SELECT stu_id FROM score WHERE c_name='中文111')
ALL 本质用and 取最大值
ANY OR 取最小值
1.ANY子句表示父查询只需要任意匹配一条子查询结果就可执行
2.ANY子句中 = ANY(子查询) 与IN同意
3.ANY子句中 > ANY代表大于最小值
4.ANY子句中 < ANY代表小于最大值
1.ALL子句中 > ALL代表大于最大值
2.ALL子句中 < ALL代表小于最小值
UNION合并表
all数据会重复
// all数据会重复
SELECT * FROM student_copy UNION all SELECT * FROM student;
不加all会去重
// 不加all会去重
SELECT * FROM student_copy UNION SELECT * FROM student;
连接
内连接:
// 内连接,求两张表交集的部分
SELECT * FROM a_table INNER JOIN b_table ON a_table.a_id = b_table.b_id
左连接:
// 左连接,以左表为基础,展示出左表全部数据和右表交集部分数据
SELECT * FROM a_table LEFT JOIN b_table ON a_table.a_id = b_table.b_id
右连接:
// 右连接,以右表为基础,展示出右全部数据和左表交集部分数据
SELECT * FROM a_table RIGHT JOIN b_table ON a_table.a_id = b_table.b_id