MySQL基础 | DQL

1.DQL概述

  • 数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE
  • 子句组成的查询块:
    1
    SELECT <字段名表> FROM <表或视图名> WHERE <查询条件>

2.基本查询

2.1查询语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- 书写格式
SELECT 字段名,...,字段名 FROM 表名;

-- 基本表中所有数据
SELECT * FROM 表名;

-- 给字段以及表设置别名查询
SELECT 字段名 AS 别名 FROM 表名 AS 表别名;

-- 使用函数 CONCAT连接字符
SELECT CONCAT('大',gradeid) AS 学校人数占比情况 FROM SUBJECT;

-- 去重使用DISTINCT关键词
SELECT DISTINCT studentno FROM result;

2.2表达式

1
2
3
4
5
6
7
8
-- 查询系统版本
SELECT VERSION();
-- 计算
SELECT 100*3-1 AS a;
SELECT @@ATUO_INCREMENT_INCREMENT -- 查询自增的步长(变量)

-- 实现studentresult字段的所有成绩都+1
SELECT studentno AS 学号,studentresult+1 AS 成绩 FROM result;

2.3WHERE语句

1
2
3
4
5
6
7
8
9
-- WHERE语句搭配逻辑运算符使用

-- 查询成绩在此范围内的数据
SELECT studentno,studentresult FROM result
WHERE studentresult >=90 AND studentresult <=100;

-- 除了学号1000以外所有学生的成绩
SELECT studentno,studentresult FROM result
WHERE studentno !=1001;

三种逻辑运算符

3.模糊查询

3.1LIKE

1
2
3
4
5
6
-- LIKE需结合 %代表所有字符 _代表一个字符
SELECT * FROM student WHERE studentname LIKE '值%';

SELECT * FROM student WHERE studentname LIKE '%值%';

SELECT * FROM student WHERE studentname LIKE '值_';

3.2IN

1
2
3
4
5
6
7
8
9
-- IN具体的一个或多个值
SELECT * FROM student WHERE studentno IN (值1,值2,.....,值n);

-- IS null 显示指定字段为null的所有数据
SELECT * FROM 表名 WHERE 字段 IS NULL;
-- NOT null 显示指定字段非null的所有数据
SELECT * FROM 表名 WHERE 字段 IS NOT NULL;
-- BETWEEN AND闭区间内的数据
SELECT * FROM 表名 WHERE 字段 BETWEENAND 值;

五种运算符

4.联表查询

4.1内外连接

  • 内链接指的是把两个表关联起来后,只有当两个表中共同有的数据才进行显示,内链接是最普通的联表查询
  • 外链接可以分为左外链接和右外链接,其实这两种方式在本质上是相同的。
  • 如果说内链接是两个表都有数据时才会显示,那么外链接就是主表中有数据就显示,而不管从表。
  • 对于左外链接来说,from后面紧跟着的表就是主表。
  • 而对于右外链接来说,则正好相反,join后面紧跟着的表是主表。

4.2核心步骤

  1. 确定要查询的数据 SELECT 字段1,字段2,…字段n
  2. 从哪几个表中去查 FROM 表名称 XXX JOIN 连接的表 ON 交叉条件
  3. 若需要进行多张表查询时,一步一步来,从两张表查开始
    1
    2
    3
    4
    5
    6
    7
    8
    9
    -- 1.确定要查询的字段
    SELECT s.字段1,...,字段n
    -- 2.确定使用的联表类型
    FROM1 AS s
    INNER JOIN2 AS r
    -- 3.判断条件两个表里面具有两个相同的字段
    ON s.相同字段 = r.相同字段;
    INNER JOIN 表n AS n
    ............

4.3自连接

一个表具有连个表的属性时,需要把一张表拆分为两张表,通过子夫字段的关系来进行判断(使用较少)

测试表

格式

1
2
3
SELECT a.`字段名1` AS 'father',b.`字段名1` AS 'son' 
FROM1 AS a , 表1 AS b
WHERE a.`子字段` = b.`父字段`;

4.4子查询

当数据查询的条件依赖于其他查询结果时,子查询提供了较好的查询方式

带IN嵌套

1
2
3
4
5
6
-- 查询高等数学-1分数大于80的学号和姓名
select StudentNo,StudentName from student where studentno in (
select StudentNo from result where StudentResult >= 80 and SubjectNo in(
select SubjectNo from subject where SubjectName='高等数学-1'
)
)

带比较运算符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- 查询高等数学-1排行前五的学生信息
-- 1.确定查询字段
select distinct a.`StudentNo`,`StudentName`,`StudentResult`
-- 2.连表查询
from student as a
inner join result as b
on a.StudentNo = b.StudentNo
-- 3.子查询
WHERE b.SubjectNo =(
select SubjectNo from subject
where SubjectName='高等数学-1'
)
order by StudentResult DESC
LIMIT 0,5;

5.分页排序

  • 分页的作用是为了缓解数据库的压力
  • 文章一般使用分页,图片一般使用瀑布流处理
  • 排序ASC代表降序 DESC代表升序

分页公式

1
2
3
4
5
6
1页 LIMIT 0,pagesize  (1-1)*pagesize 
第n页 LIMIT n-1,pagesize (n-1)*pagesize
-- Pagezie 页面大小
-- (n-1)*pagesize 起始值
-- n : 当前值
-- 数据总数/页面大小 =总页数

排序格式

1
ORDER BY `字段名称` ASCDESC

实例

1
2
3
4
5
6
7
8
9
10
-- 两个表以上的查询
-- 参加考试的同学信息 (学号,姓名,课程名称,分数) 升序排序 每页显示5条记录
SELECT stu.studentno,studentname,subjectname,studentresult
FROM student AS stu
RIGHT JOIN result AS res
ON stu.studentno = res.studentno
INNER JOIN `subject` sjt
ON res.subjectno = sjt.subjectno
ORDER BY `studentresult` DESC
LIMIT 0,5;

6.函数

MySQL提供了一系列函数用于基本的逻辑运算,可参考官方文档

1
2
3
4
5
6
7
8
9
-- 聚合函数(一般用于统计计算数值)
select COUNT('studentno') from result; -- 忽略所有的null值
select COUNT(*) from result; -- 不忽略null值 本质是计算行数
select COUNT(1) from result; -- 不忽略null值 本质也是计算行数

select avg(StudentResult) from result;
select max(StudentResult) from result;
select min(StudentResult) from result;
select sum(StudentResult) from result;

分组概念

1
2
3
4
5
6
7
8
9
-- 查询不同课程的平均分 最高分 最低分 平均分>10
select subjectname,avg(StudentResult) as avg_score,max(StudentResult),min(StudentResult)
from result as r
inner join subject as sub
on r.SubjectNo = sub.SubjectNo
group by r.SubjectNo -- 通过什么字段分组
having avg_score > 10 -- 筛选条件
order by avg_score DESC -- 排序条件
LIMIT 0,5; -- 分页

MD5加密

1
2
3
4
5
6
7
8
-- MD5()加密函数
use user_secret;
select * from secret;
-- 插入一条md5加密数据
insert into secret (PLATFORM, ACCOUNTS, PASSWORD, NOTES) VALUES
('JetBrain','kinozhao0715@gmail.com',md5('密码'),'javaide平台');
-- 校验
select * from secret where NUMS='5' and PASSWORD = md5('密码');

MySQL基础 | DQL
http://example.com/2022/06/27/MySQL/MYSQLDQL/
Author
John Doe
Posted on
June 27, 2022
Licensed under