数据库单表查询

语法
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只有%, _局限比较明显 ,正则则不同 ^, $, {}

上一篇:数据库 行 的详细操作

下一篇:数据库多表查询