MySQL语言之DQL(Data Query Language):数据查询语言

注意:SELECT*FROM book;(*)代表一个通配符 代表一个表中的所有列(字段)一个表中所有列及所有行

前条件(聚合函数):  5个聚合函数(大多用于做统计)

COUNT(filed) 总数

SUM(filed) 求和

MAX(filed) 最大值

MIN (filed)最小值

AVG (filed)平均值:

Eg.查询book表中共有多少行记录
SELECT COUNT(*) AS 总数 FROM book;
Eg.查询所有图书的总价
SELECT SUM(b_price) AS 总价 FROM book;
Eg.查询最贵的书
SELECT MAX(b_price) AS 最贵 FROM book; 
SELECT*FROM book WHERE b_price=(SELECT MAX(b_price) AS 最贵 FROM book );
Eg.查询最便宜的书
SELECT MIN(b_price) AS 最便宜 FROM book;   
SELECT*FROM book WHERE b_price=(SELECT MIN(b_price)AS 最便宜 FROM book);
Eg.查询书价格的平均值
SELECT AVG(b_price) AS 平均值 FROM book;

PS:聚合函数会忽略null值。IFNULL(b_price,0)是为了避免此字段中有null值的情况,而产生错误的平均值。

IFNULL(field,value)逻辑:如果field不为null值就使用field原有的值,如果field为null就是用value值。

后条件:

1、 范围查询 列名 BETWEEN 值 AND 值 从什么到什么之间

//查询销售价格在20块钱到40块钱之间的图书信息

SELECT*FROM book WHERE b_price BETWEEN 20 AND 40;

SELECT*FROM book WHERE b_price NOT BETWEEN 20 AND 40;

2、 集合查询 包含IN 不包含 NOT IN

//书名包含幻城,水浒传,活法的 图书信息

SELECT*FROM book WHERE b_name IN ('《 幻城》','《水浒传》','《活法》');

//出版社不是人民教育出版社和电子工业出版社的图书信息

SELECT*FROM book WHERE b_publish NOT IN ('人民教育出版社','电子工业出版社');

3、 LIKE 模糊查询 列名 LIKE 值%   列名 LIKE %值   列名 LIKE %值%

//查询作者姓郭的图书信息

SELECT*FROM book WHERE b_author LIKE '郭%';

SELECT *FROM book WHERE b_name LIKE '《活%';

4、IS NULL  IS NOT NULL 查询某一列值是否等于NULL

//查询书名=NULL的

SELECT*FROM book WHERE b_name IS NULL;

SELECT*FROM book WHERE b_name IS NOT NULL;

5、多重条件 我们查询的条件有多个 AND 什么和什么(左右都要满足) OR 什么或什么(左右有一个满足就可以)

//书名是幻城 出版社是人民教育出版社

SELECT*FROM book WHERE b_name = '《幻城》' AND b_publish = '人民教育出版社';

SELECT*FROM book WHERE b_name = '《幻城》' OR b_publish = '人民教育出版社';

6、分组查询: GROUP BY 一般和COUNT(*)一起用

一旦我们在COUNT(*)前面添加了某个条件 这个条件就必须参与分组

eg:先统计表中一共有有多少本书 再按照出版社分组 每个出版社有多少本书

SELECT b_publish,COUNT(*) FROM book GROUP BY b_publish;

eg:按照书名分组

SELECT b_name,COUNT(*) FROM book GROUP BY b_name;

eg:查询每个书名在每个出版社里有多少本

SELECT b_publish ,b_name,COUNT(*) FROM book GROUP BY b_name,b_publish;

7、排序查询: ORDER BY 列名 (默认是)ASC(升序) DESC(降序)

参与排序的字段 最好是数字类型的字段

eg:将所有书按照价格降序排列

SELECT*FROM book ORDER BY b_price DESC;

eg:查询哪本书销量最多

SELECT b_name,COUNT(*) FROM book GROUP BY b_name ORDER BY COUNT(*) DESC;

eg:查询每本幻城书的价格是多少

SELECT b_name,b_price FROM book WHERE b_name='《幻城》' ORDER BY b_price DESC;

8、分页查询:就是把一个表中的记录分次查询出来(能按照指定的查询范围来进行查询)

LIMIT START,END(每次我们的查询都从START开始查询END条记录)。第一行记录坐标是0

eg:只想查询前三条图书信息

SELECT*FROM book ORDER BY b_code LIMIT 0,3;

9、HAVING子句: 在分组查询时,有的时候可能需要再次使用条件进行过滤,这个时候不能where子句,   应该使用having子句。

PS:having子句后可以使用聚合函数。 位置:位于group by子句后

WHERE在分组之前使用  HAVING分组之后使用

eg:查询哪本书有重名现象
SELECT b_name,COUNT(*) FROM book GROUP BY b_name HAVING COUNT(*)>1;

10、连接查询也叫关联查询(用于两个表有关系时)

概念:当在查询时,我们所需要的数据不在同一张表中,可能在多张表中。此时就需要同时操作这些表。即关联查询。

连接查询又分为内连接和外连接:

内连接 inner join---inner可不写

//逗号是可以替代 inner join的  inner join (查询出两个表中 相等的记录)
Select distinct c.classname,s.sname from classes c inner join student s where c.id=s.class_id

外链接 left outer join on (左外连接)    right outer join on(右外连接)----outer可不写

涉及两个概念:

驱动表(主表):除了显示满足条件的数据,还要显示不满足条件的数据。

非驱动表(副表):只显示满足关联条件的数据。

左外连接:(查询出左表中全部数据,和右表中的相等数据。)

格式:表1 left join 表2 on 主键和外键相等的条件

//我想了解哪个班级没有学生
SELECT c.classname,s.sname FROM classes c LEFT JOIN student s ON c.id = s.class_id WHERE s.sname IS NULL;

右外连接:(查询出右表中全部数据和左表中相等数据)

格式:表1 right join 表2 on 主键和外键相等的条件

//我想了解哪个学生没有班级
SELECT c.classname,s.sname FROM classes c RIGHT JOIN student s ON c.id=s.class_id WHERE c.classname IS NULL;

全外连接:  两张表的数据不管满不满足条件,都做显示。

格式:  表A  full [outer] join 表B on 关联条件 

PS:mysql 不支持全外连接

自连接:
    在多张表进行关联查询时,这些表的表名是同一个,即自连接。

查询领导的姓名及其下属姓名
SELECT d.ename '下属姓名',e.ename '领导姓名' FROM emp d,emp e WHERE d.mgr=e.empno;

11、去重(distinct):有的时候我们可以需要对重复的记录进行去重操作
        比如,查询表中有哪些职位,此时,一种职位只需要显示一条记录就够。
       位置: 必须写在select关键字后。

//查询表中有哪几种职位,不需要重复。
SELECT DISTINCT job FROM emp;

一个完整的查询语句:

select...from...[where...][group by...][having...][order by...];

但是执行顺序需要注意如下:

先执行from子句

再执行where子句

再执行group by子句

再执行 having子句

再执行select子句

最后执行order by子句

猜你喜欢

转载自blog.csdn.net/Betty_betty_betty/article/details/82527244