四、DQL数据查询语言

查询简介

查询会产生一张虚拟表
语法结构:
注意:*号代表表中所有字段,这个不建议使用,会影响查询效率;

SELECT 字段名,字段名 FROM 表名 WHERE 筛选过滤条件

常用查询命令语法规范:

  1. 关键字**大写****表名****字段名小写**
  2. 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