(1)完整语法

  • FROM
  • WHERE
  • GROUP BY
  • HAVING
  • ORDER BY
  • LIMIT ``` SELECT select_expr [, select_expr …] [ FROM table_references [WHERE where_condition] [GROUP BY {col_name | position} [ASC | DESC], …] [HAVING where_condition] [ORDER BY {col_name | position | expr} [ASC | DESC], …] [LIMIT {[offset,] row_count | row_count OFFSET offset}] ]
  • select_expr 查询表达式
    • 每一个表达式表示想要的一列,必须至少有一个,多个列之间以英文逗号分隔
    • 表示所有列 tb1_name.*表示某表的所有列
    • 查询表达式可以使用[AS] alias_name为其赋予别名
    • 别名可用于GROUP BY,ORDER BY或HAVING子句 ```

      (2)查询列

      所有列

      select * from book;

  1. mysql> create table if not exists book(
  2. -> id int unsigned primary key auto_increment,
  3. -> title varchar(100) not null,
  4. -> author varchar(40) not null,
  5. -> date date
  6. -> );
  7. Query OK, 0 rows affected (0.17 sec)
  8. mysql> insert book (title,author,date) values('java','US',NOW());
  9. Query OK, 1 row affected, 1 warning (0.05 sec)
  10. mysql> insert book (title,author,date) values('mysql','Oracle','2018-11-11');
  11. Query OK, 1 row affected (0.03 sec)
  12. mysql> insert book (title,author,date) values('android','google',NOW());
  13. Query OK, 1 row affected, 1 warning (0.07 sec)
  14. mysql> select * from book;
  15. +----+---------+--------+------------+
  16. | id | title | author | date |
  17. +----+---------+--------+------------+
  18. | 1 | java | US | 2018-11-12 |
  19. | 2 | mysql | Oracle | 2018-11-11 |
  20. | 3 | android | google | 2018-11-12 |
  21. +----+---------+--------+------------+
  22. 3 rows in set (0.01 sec)

指定列

select title,author from book;

mysql> select title,author from book;
+---------+--------+
| title   | author |
+---------+--------+
| java    | US     |
| mysql   | Oracle |
| android | google |
+---------+--------+
3 rows in set (0.00 sec)

AS

  • 别名查询(as可不写)

    select title as book_title,author book_author from book;

mysql> select title as book_title,author book_author from book;
+------------+-------------+
| book_title | book_author |
+------------+-------------+
| java       | US          |
| mysql      | Oracle      |
| android    | google      |
+------------+-------------+
3 rows in set (0.01 sec)

DISTINCT

  • 去重

    mysql> select DISTINCT date from book;
    +------------+
    | date       |
    +------------+
    | 2020-09-10 |
    | 2018-11-11 |
    +------------+
    2 rows in set (0.00 sec)
    
  • 多个字段须完全一样,才会去重

    mysql> SELECT DISTINCT id,date FROM book;
    +----+------------+
    | id | date       |
    +----+------------+
    |  1 | 2020-09-10 |
    |  2 | 2018-11-11 |
    |  3 | 2020-09-10 |
    +----+------------+
    3 rows in set (0.00 sec)
    

    计算列、IFNULL

  • 计算列的时候,如果有的为NULL,则最终结果也为NULL

  • 计算列可以使用AS起别名 ``` mysql> SELECT * FROM score; +——+————+———+————-+ | id | name | math | english | +——+————+———+————-+ | 1 | 张三 | 88 | 99 | | 2 | 李四 | 99 | NULL | | 3 | 刘备 | 56 | 87 | +——+————+———+————-+ 3 rows in set (0.00 sec)

mysql> SELECT name,math+english FROM score; +————+———————+ | name | math+english | +————+———————+ | 张三 | 187 | | 李四 | NULL | | 刘备 | 143 | +————+———————+ 3 rows in set (0.00 sec)

mysql> SELECT name,math+IFNULL(english,0) FROM score; +————+————————————+ | name | math+IFNULL(english,0) | +————+————————————+ | 张三 | 187 | | 李四 | 99 | | 刘备 | 143 | +————+————————————+ 3 rows in set (0.00 sec)

mysql> SELECT name,math+IFNULL(english,0) AS zongfen FROM score; +————+————-+ | name | zongfen | +————+————-+ | 张三 | 187 | | 李四 | 99 | | 刘备 | 143 | +————+————-+ 3 rows in set (0.00 sec)

<a name="nPxd4"></a>
### (3)where条件

- >、>=、<、<=、=、<>、!=
- <>、!=都表示不等于
> IN(集合)
> IS NULL
> IS NOT NULL

SELECT FROM score WHERE math <> 99; SELECT FROM score WHERE math != 99;

<a name="amYEW"></a>
#### BETWEEN...AND 

- 闭区间

— BETWEEN 60 AND 90 表示60-90之间,包括60 90 SELECT FROM score WHERE math >= 60 && math <= 90; SELECT FROM score WHERE math >= 60 AND math <= 90; SELECT * FROM score WHERE math BETWEEN 60 AND 90;

<a name="RO6PY"></a>
#### AND、OR

- and、&&:两种写法等效
- or、|| :两种写法等效

SELECT FROM score WHERE math > 80 AND english > 80; SELECT FROM score WHERE math > 80 && english > 80; SELECT FROM score WHERE math > 80 OR english > 90; SELECT FROM score WHERE math > 80 || english > 90;

<a name="3aBVy"></a>
#### IN (集合)

SELECT * FROM score WHERE math IN (56,88,99);

<a name="OJaGU"></a>
#### NULL

- english = NULL,这种写法不行

SELECT FROM score WHERE english IS NULL; SELECT FROM score WHERE english IS NOT NULL;

<a name="lfQUG"></a>
#### like模糊匹配

- % 代表任意多字符
- _ 表示一个字符

— % 代表任意多字符 — 表示一个字符 SELECT FROM score WHERE name LIKE ‘张%’; SELECT FROM score WHERE name LIKE ‘三’; SELECT * FROM score WHERE name LIKE ‘__’;

<a name="eXHfv"></a>
### (5)分页limit/offset

- 查询个数和偏移<br />
- [LIMIT { [offset,] row_count | row_count OFFSET offset}]
> limit 3,3 :从索引为3的开始,查询3条数据(包含开始索引)
> limit 3 :  从默认索引为0的开始,查询3条数据(包含开始索引)
> LIMIT 2 OFFSET 1 :从索引1开始,查询2条数据(包含开始索引)

mysql> SELECT * FROM tb1; +——+———+ | id | name | +——+———+ | 1 | 张1 | | 2 | 张2 | | 3 | 张3 | | 4 | 张4 | | 5 | 张5 | | 6 | 张6 | | 7 | 张7 | +——+———+ 7 rows in set (0.00 sec)

mysql> SELECT * FROM tb1 LIMIT 0,3; +——+———+ | id | name | +——+———+ | 1 | 张1 | | 2 | 张2 | | 3 | 张3 | +——+———+ 3 rows in set (0.00 sec)

mysql> SELECT * FROM tb1 LIMIT 3,3; +——+———+ | id | name | +——+———+ | 4 | 张4 | | 5 | 张5 | | 6 | 张6 | +——+———+ 3 rows in set (0.00 sec)

mysql> SELECT * FROM tb1 LIMIT 6,3; +——+———+ | id | name | +——+———+ | 7 | 张7 | +——+———+ 1 row in set (0.00 sec)

<a name="nfc1Q"></a>
### (6)排序

- [ORDER BY {col_name} [ASC/DESC] ]<br />
- 默认:升序<br />
- ASC:升序<br />
- DESC:降序
> select * from book order by id ASC;
> select * from book order by id DESC;
> select * from book order by id;
> select * from book order by date asc,id desc;

mysql> select * from book order by id ASC; +——+————-+————+——————+ | id | title | author | date | +——+————-+————+——————+ | 1 | java | US | 2018-11-12 | | 2 | mysql | Oracle | 2018-11-11 | | 3 | android | google | 2018-11-12 | +——+————-+————+——————+ 3 rows in set (0.02 sec)

mysql> select * from book order by id DESC; +——+————-+————+——————+ | id | title | author | date | +——+————-+————+——————+ | 3 | android | google | 2018-11-12 | | 2 | mysql | Oracle | 2018-11-11 | | 1 | java | US | 2018-11-12 | +——+————-+————+——————+ 3 rows in set (0.00 sec)

mysql> select * from book order by id; +——+————-+————+——————+ | id | title | author | date | +——+————-+————+——————+ | 1 | java | US | 2018-11-12 | | 2 | mysql | Oracle | 2018-11-11 | | 3 | android | google | 2018-11-12 | +——+————-+————+——————+ 3 rows in set (0.00 sec)

mysql> select * from book order by date asc,id desc; +——+————-+————+——————+ | id | title | author | date | +——+————-+————+——————+ | 2 | mysql | Oracle | 2018-11-11 | | 3 | android | google | 2018-11-12 | | 1 | java | US | 2018-11-12 | +——+————-+————+——————+ 3 rows in set (0.02 sec)

<a name="LxCMy"></a>
### (7)分组

- 查询结果分组—[GROUP BY {col_name | position} [ASC | DESC], ...]  (ASC升序、DESC降序)
- 求男女分组后,各自英语成绩的平均分

mysql> select * from student; +——+—————-+———+———+————-+———+————-+ | id | name | age | sex | address | math | english | +——+—————-+———+———+————-+———+————-+ | 1 | 马云 | 55 | 男 | 杭州 | 66 | 78 | | 2 | 马化腾 | 45 | 女 | 深圳 | 98 | 87 | | 3 | 马景涛 | 55 | 男 | 香港 | 56 | 77 | | 4 | 刘妍 | 20 | 女 | 湖南 | 76 | 65 | | 5 | 柳青 | 20 | 男 | 湖南 | 86 | NULL | | 6 | 刘德华 | 57 | 男 | 香港 | 99 | 99 | | 7 | 玛德 | 22 | 女 | 香港 | 99 | 99 | +——+—————-+———+———+————-+———+————-+ 7 rows in set (0.00 sec)

mysql> SELECT sex,COUNT(sex),SUM(english),COUNT(english),AVG(english) from student GROUP BY sex; +———+——————+———————+————————+———————+ | sex | COUNT(sex) | SUM(english) | COUNT(english) | AVG(english) | +———+——————+———————+————————+———————+ | 女 | 3 | 251 | 3 | 83.6667 | | 男 | 4 | 254 | 3 | 84.6667 | +———+——————+———————+————————+———————+ 2 rows in set (0.00 sec)

mysql> SELECT sex,name,COUNT(sex),SUM(english),COUNT(english),AVG(english) from student GROUP BY sex; ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘test.student.name’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by


- 男女分为两组后,继续筛选,小组内人数大于3的分组保留

mysql> SELECT sex,COUNT(sex),SUM(english),COUNT(english),AVG(english) from student GROUP BY sex HAVING COUNT(sex) > 3; +———+——————+———————+————————+———————+ | sex | COUNT(sex) | SUM(english) | COUNT(english) | AVG(english) | +———+——————+———————+————————+———————+ | 男 | 4 | 254 | 3 | 84.6667 | +———+——————+———————+————————+———————+ 1 row in set (0.00 sec)

<a name="OTug5"></a>
### (8)having

- WHERE和HAVING的区别
   - WHERE分组之前限定,满足才参与分组,不支持聚合函数
   - HAVING在分组之后进行限定,支持聚合函数
- 男女分为两组后,继续筛选,小组内人数大于3的分组保留

mmysql> SELECT sex,COUNT(sex),SUM(english),COUNT(english),AVG(english) from student GROUP BY sex HAVING COUNT(sex) > 3; +———+——————+———————+————————+———————+ | sex | COUNT(sex) | SUM(english) | COUNT(english) | AVG(english) | +———+——————+———————+————————+———————+ | 男 | 4 | 254 | 3 | 84.6667 | +———+——————+———————+————————+———————+ 1 row in set (0.00 sec)

<a name="aSJda"></a>
### (9)聚合函数

- 将一列数据作为一个整体,进行纵向的计算,并且会排除null值
- 解决方法
   - 使用不为null的列
   - 使用ifnull(列名,0)
<a name="r5zj5"></a>
#### COUNT

- date字段有个null,统计数量为2
> select count(date) from book;
> select count(ifnull(date,0)) from book;
> select count(*) from book;

mysql> SELECT * from book; +——+————-+————+——————+ | id | title | author | date | +——+————-+————+——————+ | 1 | java | US | NULL | | 2 | mysql | oracle | 2018-11-11 | | 3 | android | google | 2038-11-11 | +——+————-+————+——————+ 3 rows in set (0.00 sec)

mysql> SELECT count(date) from book; +——————-+ | count(date) | +——————-+ | 2 | +——————-+ 1 row in set (0.00 sec)

mysql> SELECT count(author) from book; +———————-+ | count(author) | +———————-+ | 3 | +———————-+ 1 row in set (0.00 sec)

mysql> SELECT count(ifnull(date,0)) from book; +———————————-+ | count(ifnull(date,0)) | +———————————-+ | 3 | +———————————-+ 1 row in set (0.00 sec)

mysql> SELECT count() from book; +—————+ | count() | +—————+ | 3 | +—————+ 1 row in set (0.00 sec)

<a name="KtMSc"></a>
#### MAX
<a name="6b5ho"></a>
#### MIN
<a name="4EbYK"></a>
#### AVG
<a name="jxxox"></a>
#### SUM

mysql> SELECT * FROM book; +——+————-+————+——————+ | id | title | author | date | +——+————-+————+——————+ | 1 | java | US | NULL | | 2 | mysql | oracle | 2018-11-11 | | 3 | android | google | 2038-11-11 | +——+————-+————+——————+ 3 rows in set (0.00 sec)

mysql> SELECT MAX(id) FROM book; +————-+ | MAX(id) | +————-+ | 3 | +————-+ 1 row in set (0.00 sec)

mysql> SELECT MIN(id) FROM book; +————-+ | MIN(id) | +————-+ | 1 | +————-+ 1 row in set (0.00 sec)

mysql> SELECT AVG(id) FROM book; +————-+ | AVG(id) | +————-+ | 2.0000 | +————-+ 1 row in set (0.00 sec) ```