语法
select * from where # *指所有
condition # 条件
Group by field # 分组
Having # 筛选
order by field #排序
limit #
关键字执行优先级
from 找到表
where 用where后的约束条件去找记录
group by 将取出的记录分组,若没有group by,则只有一组
having 将分组的结果进行having过滤
select 执行select
distrinct 去重
order by 按条件排序
limit 限制结果显示条数
下面是一张爬取的豆瓣图书的数据库:
mysql> desc book;
+--------------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+---------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| book_name | varchar(50) | YES | | NULL | |
| author | varchar(30) | YES | | NULL | |
| translator | varchar(255) | YES | | NULL | |
| rating | varchar(5) | YES | | NULL | |
| publish | varchar(20) | YES | | NULL | |
| pub_date | varchar(15) | YES | | NULL | |
| isbn | varchar(15) | YES | | NULL | |
| introduction | varchar(1000) | YES | | NULL | |
+--------------+---------------+------+-----+---------+----------------+
9 rows in set (0.01 sec)
简单查询: # 因为里面数据较大,所以限制10条数据
mysql> select id, book_name, rating from book limit 10;
+----+-----------------------+--------+
| id | book_name | rating |
+----+-----------------------+--------+
| 1 | 囚鸟 | 8.0 |
| 2 | 围城 | 8.9 |
| 3 | 杀死一只知更鸟 | 9.2 |
| 4 | 斯通纳 | 8.8 |
| 5 | 1984 | 9.3 |
| 6 | 活着 | 9.1 |
| 7 | 世界的凛冬 | 8.9 |
| 8 | 我的天才女友 | 8.4 |
| 9 | 新名字的故事 | 9.0 |
| 10 | 百年孤独 | 9.2 |
+----+-----------------------+--------+
10 rows in set (0.00 sec)
去重:
mysql> select distinct id, book_name, rating from book limit 10;
+----+-----------------------+--------+
| id | book_name | rating |
+----+-----------------------+--------+
| 1 | 囚鸟 | 8.0 |
| 2 | 围城 | 8.9 |
| 3 | 杀死一只知更鸟 | 9.2 |
| 4 | 斯通纳 | 8.8 |
| 5 | 1984 | 9.3 |
| 6 | 活着 | 9.1 |
| 7 | 世界的凛冬 | 8.9 |
| 8 | 我的天才女友 | 8.4 |
| 9 | 新名字的故事 | 9.0 |
| 10 | 百年孤独 | 9.2 |
+----+-----------------------+--------+
10 rows in set (0.00 sec)
distinct必须用在所有字段前面,否则会报错,但这样别没有将rating字段中的重复去掉。
通过四则运算查询 :
mysql> select book_name, rating*2 from book limit 10;
+-----------------------+----------+
| book_name | rating*2 |
+-----------------------+----------+
| 囚鸟 | 16 |
| 围城 | 17.8 |
| 杀死一只知更鸟 | 18.4 |
| 斯通纳 | 17.6 |
| 1984 | 18.6 |
| 活着 | 18.2 |
| 世界的凛冬 | 17.8 |
| 我的天才女友 | 16.8 |
| 新名字的故事 | 18 |
| 百年孤独 | 18.4 |
+-----------------------+----------+
10 rows in set (0.00 sec)
可以看到rating的结果乘2了,但字段名也因此变成了rating*2, 那要怎么修改呢?as
mysql> select book_name, rating*2 as double_rating from book limit 10;
+-----------------------+---------------+
| book_name | double_rating |
+-----------------------+---------------+
| 囚鸟 | 16 |
| 围城 | 17.8 |
| 杀死一只知更鸟 | 18.4 |
| 斯通纳 | 17.6 |
| 1984 | 18.6 |
| 活着 | 18.2 |
| 世界的凛冬 | 17.8 |
| 我的天才女友 | 16.8 |
| 新名字的故事 | 18 |
| 百年孤独 | 18.4 |
+-----------------------+---------------+
10 rows in set (0.00 sec)
自定义查询结果的显示格式,concat拼接字符串
mysql> select concat('书名:',book_name,'作者:',author)as book_info from book limit 10;
+-----------------------------------------------------------------------------+
| book_info |
+-----------------------------------------------------------------------------+
| 书名:囚鸟作者:[美] 库尔特·冯内古特 |
| 书名:围城作者:钱钟书 |
| 书名:杀死一只知更鸟作者:[美] 哈珀·李 |
| 书名:斯通纳作者:[美] 约翰·威廉斯 |
| 书名:1984作者:[英] 乔治·奥威尔 |
| 书名:活着作者:余华 |
| 书名:世界的凛冬作者:[英] 肯·福莱特 |
| 书名:我的天才女友作者:[意] 埃莱娜·费兰特 |
| 书名:新名字的故事作者:[意] 埃莱娜·费兰特 |
| 书名:百年孤独作者:[哥伦比亚] 加西亚·马尔克斯 |
+-----------------------------------------------------------------------------+
10 rows in set (0.00 sec)
concat_ws: 以第一个参数为分隔符进行接接
mysql> select concat_ws(':', book_name, rating) as book_info from book limit 10;
+-----------------------------+
| book_info |
+-----------------------------+
| 囚鸟: 8.0 |
| 围城: 8.9 |
| 杀死一只知更鸟: 9.2 |
| 斯通纳: 8.8 |
| 1984: 9.3 |
| 活着: 9.1 |
| 世界的凛冬: 8.9 |
| 我的天才女友: 8.4 |
| 新名字的故事: 9.0 |
| 百年孤独: 9.2 |
+-----------------------------+
10 rows in set (0.00 sec)
查询9分以上的书籍:
mysql> select book_name, rating from book where rating >9 limit 10;
+--------------------------------------+--------+
| book_name | rating |
+--------------------------------------+--------+
| 杀死一只知更鸟 | 9.2 |
| 1984 | 9.3 |
| 活着 | 9.1 |
| 百年孤独 | 9.2 |
| 动物农场 | 9.2 |
| 飘 | 9.3 |
| 灯塔 | 9.1 |
| 杀死一只知更鸟 | 9.2 |
| 一个叫欧维的男人决定去死 | 9.1 |
| 1984 | 9.3 |
+--------------------------------------+--------+
10 rows in set (0.01 sec)
where 约束
where后面的条件可以是:
比较运算符:><>= <= <> !=
between 80 and 100 区间
in(80,90,100)
like '9%' pattern 中可以是%或者_, %表示任意多字符,_表示一个字符
逻辑运算符: and or not
单条件查询 :
mysql> select book_name, rating from book where rating =9 limit 10;
+-----------------------+--------+
| book_name | rating |
+-----------------------+--------+
| 新名字的故事 | 9.0 |
| 月亮和六便士 | 9.0 |
| 鱼王 | 9.0 |
| 霍乱时期的爱情 | 9.0 |
| 贝伦与露西恩 | 9.0 |
| 人生的枷锁 | 9.0 |
| 局外人 | 9.0 |
| 刀锋 | 9.0 |
| 活着为了讲述 | 9.0 |
| 局外人 | 9.0 |
+-----------------------+--------+
10 rows in set (0.00 sec)
多条件查询:
mysql> select book_name, rating, author from book where rating>9 and author='余华' limit 10;
+-----------+--------+--------+
| book_name | rating | author |
+-----------+--------+--------+
| 活着 | 9.1 | 余华 |
+-----------+--------+--------+
1 row in set (0.00 sec)
关键字between and 表示一个区间
评论在8.5 到9分的书籍
mysql> select book_name, rating from book where rating between 8.5 and 9 limit 10;
+-----------------------+--------+
| book_name | rating |
+-----------------------+--------+
| 围城 | 8.9 |
| 斯通纳 | 8.8 |
| 世界的凛冬 | 8.9 |
| 新名字的故事 | 9.0 |
| 月亮和六便士 | 9.0 |
| 鱼王 | 9.0 |
| 追风筝的人 | 8.9 |
| 霍乱时期的爱情 | 9.0 |
| 贝伦与露西恩 | 9.0 |
| 繁花 | 8.8 |
+-----------------------+--------+
10 rows in set (0.00 sec)
关键字is null 判断鞭个字段是否为Null必须用is,不能用=
mysql> select book_name from book where translator is NULL limit 10;
Empty set (0.00 sec)
关键字集合查询 :
mysql> select book_name, rating from book where rating in (7.7,8.8, 9.9) limit 10;
+--------------------+--------+
| book_name | rating |
+--------------------+--------+
| 斯通纳 | 8.8 |
| 繁花 | 8.8 |
| 醒来的女性 | 8.8 |
| 斯通纳 | 8.8 |
| 二手时间 | 8.8 |
| 方向 | 8.8 |
| 看不见的城市 | 8.8 |
| 醒来的女性 | 8.8 |
| 罪与罚 | 8.8 |
| 二手时间 | 8.8 |
+--------------------+--------+
它其实也可以写成:
Select book_name, rating from book where rating=7.7 or rating=8.8 or raing=9.9 limit 10;但这种写法比较麻烦
关键字like模糊查询,模糊匹配
mysql> select book_name, rating from book where book_name like '我%' limit 10;
+-----------------------------------------------------+--------+
| book_name | rating |
+-----------------------------------------------------+--------+
| 我的天才女友 | 8.4 |
| 我的天才女友 | 8.4 |
| 我不知道该说什么,关于死亡还是爱情 | 9.0 |
| 我遇见了人类 | 7.9 |
| 我的孤独是一座花园 | 8.6 |
| 我在伊朗长大 | 9.4 |
| 我的天才女友 | 8.4 |
| 我的天才女友 | 8.4 |
| 我不知道该说什么,关于死亡还是爱情 | 9.0 |
| 我遇见了人类 | 7.9 |
+-----------------------------------------------------+--------+
10 rows in set (0.00 sec)
分组查询group by
首先,分组是基于查询出结果后分组,也就是whre之后
其次,分组将所有记录按照某个相同字段进行归类
分组的目的一般是做统计
only_full_group_by
查看默认情况:
mysql> select @@global.sql_mode;
+-----------------------------------------------------------------------------------------------------------------------+
| @@global.sql_mode |
+-----------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+-----------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
only_full_group_by指的是select target list中所有列的值要么来自于聚集函数,要么来自group by list中的表达式
去掉 only_full_group_by模式
mysql> set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
Query OK, 0 rows affected (0.00 sec)
查看结果:
mysql> select @@global.sql_mode;
+----------------------------------------------------------------------------------------------------+
| @@global.sql_mode |
+----------------------------------------------------------------------------------------------------+
| STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+----------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
重新启动控制台:
mysql> select book_name, author,rating from book group by publish limit 10;
+-----------------------+------------------------------------------------+--------+
| book_name | author | rating |
+-----------------------+------------------------------------------------+--------+
| 囚鸟 | [美] 库尔特·冯内古特 | 8.0 |
| 围城 | 钱钟书 | 8.9 |
| 杀死一只知更鸟 | [美] 哈珀·李 | 9.2 |
| 斯通纳 | [美] 约翰·威廉斯 | 8.8 |
| 1984 | [英] 乔治·奥威尔 | 9.3 |
| 活着 | 余华 | 9.1 |
| 世界的凛冬 | [英] 肯·福莱特 | 8.9 |
| 月亮和六便士 | [英] 威廉·萨默塞特·毛姆 | 9.0 |
| 雪落香杉树 | [美] 戴维·伽特森 | 8.4 |
| 鱼王 | [俄] 维克托·阿斯塔菲耶夫 | 9.0 |
+-----------------------+------------------------------------------------+--------+
10 rows in set (0.00 sec)
如果没有去掉only_full_group_by,是面的查询 会报错。
group_by可以单独使用,就像上面那样,也可以和group_concat()函数一起用。
另外还可以和count, max, min,avg, sum等聚合函数一起用
mysql> select book_name, count(id) as count from book group by publish limit 10;
+-----------------------+-------+
| book_name | count |
+-----------------------+-------+
| 囚鸟 | 17 |
| 围城 | 72 |
| 杀死一只知更鸟 | 92 |
| 斯通纳 | 20 |
| 1984 | 11 |
| 活着 | 75 |
| 世界的凛冬 | 58 |
| 月亮和六便士 | 126 |
| 雪落香杉树 | 8 |
| 鱼王 | 17 |
+-----------------------+-------+
10 rows in set (0.01 sec)
聚合函数
聚合函数聚合的是组的内容,如果没有分组默认一组:
count, max, min, avg,sum
mysql> select publish,count(id) from book group by publish ;
+-----------------------------------------------+-----------+
| publish | count(id) |
+-----------------------------------------------+-----------+
| 百花洲文艺出版社 | 17 |
| 人民文学出版社 | 72 |
| 译林出版社 | 92 |
| 世纪文景/上海人民出版社 | 20 |
| 北京十月文艺出版社 | 11 |
| 南海出版公司 | 75 |
| 江苏凤凰文艺出版社 | 58 |
| 上海译文出版社 | 126 |
| 全本书店|作家出版社 | 8 |
| 理想国 | 广西师范大学出版社 | 17 |
| 上海人民出版社 | 44 |
| 中国友谊出版公司 | 1 |
| 上海文艺出版社 | 10 |
统计每个出版社出版书的数量 。
having过滤
先看一个报错:
mysql> select book.book_name, book.rating from book limit 10;
+-----------------------+--------+
| book_name | rating |
+-----------------------+--------+
| 囚鸟 | 8.0 |
| 围城 | 8.9 |
| 杀死一只知更鸟 | 9.2 |
| 斯通纳 | 8.8 |
| 1984 | 9.3 |
| 活着 | 9.1 |
| 世界的凛冬 | 8.9 |
| 我的天才女友 | 8.4 |
| 新名字的故事 | 9.0 |
| 百年孤独 | 9.2 |
+-----------------------+--------+
10 rows in set (0.00 sec)
mysql> select book_name, rating from book limit 10;
+-----------------------+--------+
| book_name | rating |
+-----------------------+--------+
| 囚鸟 | 8.0 |
| 围城 | 8.9 |
| 杀死一只知更鸟 | 9.2 |
| 斯通纳 | 8.8 |
| 1984 | 9.3 |
| 活着 | 9.1 |
| 世界的凛冬 | 8.9 |
| 我的天才女友 | 8.4 |
| 新名字的故事 | 9.0 |
| 百年孤独 | 9.2 |
+-----------------------+--------+
10 rows in set (0.00 sec)
mysql> select book.book_name, book.rating from book as table1 limit 10;
ERROR 1054 (42S22): Unknown column 'book.book_name' in 'field list'
在带不带表名查询结果一致,但如果带上表名,并将结果重命令为table1后会报错,因from table名先执行,
所以后面的as table1也先执行,此时就没有book.book_name这个字段 了。
mysql> select publish, avg(rating) as avg_rating from book group by publish limit 10;
+------------------------------------------+-------------------+
| publish | avg_rating |
+------------------------------------------+-------------------+
| 百花洲文艺出版社 | 8 |
| 人民文学出版社 | 8.598611111111106 |
| 译林出版社 | 8.873913043478264 |
| 世纪文景/上海人民出版社 | 8.73 |
| 北京十月文艺出版社 | 9.099999999999998 |
| 南海出版公司 | 8.834666666666667 |
| 江苏凤凰文艺出版社 | 8.17413793103448 |
| 上海译文出版社 | 8.769047619047619 |
| 全本书店|作家出版社 | 8.4 |
| 理想国 | 广西师范大学出版社 | 8.788235294117646 |
+------------------------------------------+-------------------+
10 rows in set (0.00 sec)
筛选出出版的图书的平均分大于8的出版社
mysql> select publish, avg(rating) as avg_rating from book group by publish having avg_rating>8 limit 10;
+------------------------------------------+-------------------+
| publish | avg_rating |
+------------------------------------------+-------------------+
| 人民文学出版社 | 8.598611111111106 |
| 译林出版社 | 8.873913043478264 |
| 世纪文景/上海人民出版社 | 8.73 |
| 北京十月文艺出版社 | 9.099999999999998 |
| 南海出版公司 | 8.834666666666667 |
| 江苏凤凰文艺出版社 | 8.17413793103448 |
| 上海译文出版社 | 8.769047619047619 |
| 全本书店|作家出版社 | 8.4 |
| 理想国 | 广西师范大学出版社 | 8.788235294117646 |
| 上海人民出版社 | 8.618181818181817 |
+------------------------------------------+-------------------+
10 rows in set (0.00 sec)
查询排序:
mysql> select publish, avg(rating) as avg_rating from book group by publish having avg_rating>8 order by avg_rating limit 10;
+----------------------------------------------+-------------------+
| publish | avg_rating |
+----------------------------------------------+-------------------+
| 北京联合出版公司 | 8.033333333333333 |
| 湖南文艺出版社 | 8.083333333333332 |
| 悦读名品 | 化学工业出版社 | 8.1 |
| 中国友谊出版公司 | 8.1 |
| 湖岸出版/外语教学与研究出版社 | 8.1 |
| 江苏凤凰文艺出版社 | 8.17413793103448 |
| 北京燕山出版社 | 8.27 |
| 广西科学技术出版社 | 8.299999999999999 |
| 河南文艺出版社 | 8.299999999999999 |
| 南京大学出版社 | 8.3 |
+----------------------------------------------+-------------------+
10 rows in set (0.00 sec)
限制查询的记
mysql> select book_name from book limit 10;
+-----------------------+
| book_name |
+-----------------------+
| 囚鸟 |
| 围城 |
| 杀死一只知更鸟 |
| 斯通纳 |
| 1984 |
| 活着 |
| 世界的凛冬 |
| 我的天才女友 |
| 新名字的故事 |
| 百年孤独 |
+-----------------------+
10 rows in set (0.00 sec)
使用正则表达式
使用like只有%, _局限比较明显 ,正则则不同 ^, $, {}