(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 查询表达式
mysql> create table if not exists book(-> id int unsigned primary key auto_increment,-> title varchar(100) not null,-> author varchar(40) not null,-> date date-> );Query OK, 0 rows affected (0.17 sec)mysql> insert book (title,author,date) values('java','US',NOW());Query OK, 1 row affected, 1 warning (0.05 sec)mysql> insert book (title,author,date) values('mysql','Oracle','2018-11-11');Query OK, 1 row affected (0.03 sec)mysql> insert book (title,author,date) values('android','google',NOW());Query OK, 1 row affected, 1 warning (0.07 sec)mysql> select * from book;+----+---------+--------+------------+| 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.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) ```
