07DQL(数据查询语言)

DQL

SQL指令

DQL(数据查询语言):查询数据 (SELECT)

DDL (数据定义语言):创建表 (INSERT、UPDATE、DELETE)

DML(数据操作语言):添加 修改 删除 (CREATE、ALTER、DROP)

DCL(数据控制语言):权限管理(GRANT、REVOKE)

查询 Select

DQL语法结构

SELECT 字段列表

指的是查询出来的列

FROM 查询表

指的是查询的表

WHERE 条件

指的是通过条件筛选数据

GRUOP BY 分组字段

一个列,纵向数据

ORDER BY 排序字段

排序

LIMIT 分页条件

指的是 一页几条数据

分类讲解

  • 基础查询
  • 条件查询
  • 聚合函数(计算数据 count max min)
  • 分组查询
  • 排序查询
  • 分页查询

基础查询

指定字段查询数据

1.指定字段查询数据

select 列,.... from 表名;
select bname,bprice from books;

查询所有列

2.查询所有列

select * from books;

起别名

3.查询书籍的种类,起别名

select 列 as 自己起别名 from 表名;
select 列 自己起别名 from 表名;
SELECT btype AS type FROM books;

DISTINCT 去重

4.查询种类,但是我不要重复的

SELECT DISTINCT btype  FROM books;

条件查询

基本语法

select 列,.... from 表名 where 条件 ....
条件

比较: > >= < <= = != like(模糊) between 区间

逻辑: && and || or ! not

1.查询大于30的书籍

SELECT * FROM books WHERE bprice > 30;

2.查询书籍名称叫盗墓笔记

SELECT * FROM books WHERE bname = '盗墓笔记';
like:模糊查询
where bname like '%张'   张结尾的数据

where bname like '张%'   张开头的数据

where bname like '%张%'  数据只要带张查询

SELECT * FROM books WHERE bname LIKE '%盗墓笔记%';

3.价格20-30之间的书籍

SELECT * FROM books WHERE bprice BETWEEN 20 AND 30;
SELECT * FROM books WHERE bprice > 20 AND bprice < 30; 

4.查询年份03年1月份 到 03年12月份 中间 出版的书籍

SELECT * FROM books WHERE bdate BETWEEN '2003-01' AND '2003-12';
SELECT *FROM booksWHERE publish_date >= '2003-01' AND publish_date <= '2003-12';

注:

数据库会把 '2003-01' 自动补全为 '2003-01-01 00:00:00'
把 '2003-12' 自动补全为 '2003-12-01 00:00:00'
结果:只查到 2003-01-01 到 2003-12-01 0 点之间的数据,漏掉 2003-12-02 至 2003-12-31 的所有记录

SELECT * FROM books WHERE bdate BETWEEN '2003-01' AND '2004-01-01'; 
#但会把 2004-01-01 00:00:00 也算进去
SELECT *FROM booksWHERE publish_date >= '2003-01' AND publish_date < '2004-01-01';
#不漏数据 不含2004-01-01

5.查询计算机类和动漫类的书籍

SELECT * FROM books WHERE btype = '计算机类' OR btype = '动漫类'
SELECT * FROM books WHERE btype IN('计算机类','动漫类');

6.查询种类为空的数据

SELECT * FROM books WHERE btype IS NOT NULL;

聚合函数

方法,mysql写的,

count统计数量  max最大值 min最小值 sum和  svg平均值

应该搭配分组查询一起使用的。

select 聚合函数(列) from 表名 

1.统计一共有多少本书

SELECT COUNT(id) FROM books

注:

COUNT3 种用法:

COUNT (*):统计所有行(含 NULL)

COUNT (列):统计列非 NULL 值行数

COUNT (DISTINCT 列):统计列去重后非 NULL 值

2.查询一下表中最贵的书是多少钱

SELECT max(bprice) FROM books

min()同理

3.统计 求和 一共多少钱

SELECT SUM(bprice) FROM books

4.平均值

AVG()

SELECT AVG(cj) FROM score;

分组查询

select 列 from 表名 [where 条件] gruop by 分组列 [having 分组之后的过滤]

where:查询的到数据之前 筛选

having:得到数据之后,在进行条件过滤

1.基础查询,根据书籍分类分组

SELECT btype FROM books GROUP BY btype 

2.标准的分组查询,搭配聚合函数,统计数量

SELECT btype,count(id) FROM books GROUP BY btype

3.只想要计算机类的书籍

SELECT btype,count(id) FROM books WHERE btype  = '计算机类' GROUP BY btype    
SELECT btype,count(id) FROM books GROUP BY btype   HAVING  btype  = '计算机类'

注:

SELECT 后面只能出现两种内容:分组字段 聚合函数

原因:
GROUP BY 会把多行数据合并成一行(分组)
一旦合并,原来的普通字段就不存在了,数据库不知道该显示哪一行的值,所以不允许出现
分组字段
合并后依然唯一,数据库知道显示什么
eg:
name	class	score
小明		1 班		80
小红		1 班		90
小刚		2 班		70
SELECT class FROM student GROUP BY class;
输出:
1班
2班

1 班合并成一行
但 1 班有 小明、小红 两个 name
数据库不知道显示谁,所以直接报错

WHERE 不能用聚合函数

WHERE 是在分组之前执行的,聚合函数是在分组之后才能计算的(详见06MySQL初识)

HAVING 必须跟在 GROUP BY 后面

HAVING 的作用:对分组后的结果进行筛选
GROUP BY 的作用:先把数据分组
没有分组,就没有 HAVING

排序查询

排序数据

select 列 from 表名 [where] order by 排序列

多列排序的,默认 升序 asc 降序 desc

1.按照价格 升序排序

SELECT * FROM books ORDER BY bprice
SELECT * FROM books ORDER BY bprice DESC

2.价格一样,再次按照id排序

SELECT * FROM books ORDER BY bprice,id DESC

分页查询

select 列 from 表名 [where] limit 起始索引,查询记录数;
select 列 from 表名 [where] limit 查询记录数;

1.查询五条数据

SELECT * FROM books LIMIT 5;

2.第二页

SELECT * FROM books LIMIT 10,5;

(页码 - 1) * 每页条数

3.查询最畅销类型的书籍,只要一个

SELECT btype,COUNT(id) FROM books GROUP BY btype

SELECT btype,COUNT(id) x FROM books GROUP BY btype ORDER BY  x desc LIMIT 1
posted @ 2026-10-20 20:25  瑜淞蜀  阅读(2)  评论(0)    收藏  举报