Mysql 笔记之SQL语句及查询语句详解

DDL DATABASE | SCHEMA , TABLE , INDEX

BTREE    全指匹配    左前缀   列前缀  范围匹配

HASH   等值比较   =  <=>  IN()

索引加速查询降低修改

查询操作 DML

INSERT INTO       UPDATE        DELETE

查看INSERT 的帮助信息如下

MariaDB [(none)]> HELP INSERT;

Name: ‘INSERT‘

Description:

Syntax:

1、第一种INSERT 使用方法

INSERT  [INTO] tbl_name [(col_name,...)]

{VALUES | VALUE} ({expr | DEFAULT},...),(...),...批量插入

Mysql基于默认,

2、第二种INSERT 使用方法

INSERT  [INTO] tbl_name SET col_name={expr | DEFAULT}, ...通常一次插入一ci

3、第三种INSERT 使用方法

INSERT  [INTO] tbl_name [(col_name,...)]

SELECT ...

[ ON DUPLICATE KEY UPDATE

col_name=expr

[, col_name=expr] ... ]

例题创建表 tmp8  id自增

MariaDB [tb_test2]> CREATE TABLE tmp8(id INT(11) AUTO_INCREMENT PRIMARY KEY,name CHAR(20),gender ENUM(‘m‘,‘f‘));

Query OK, 0 rows affected (0.01 sec)

第一种方法

MariaDB [tb_test2]> INSERT INTO tmp8 VALUES(NULL,‘lin chong‘, ‘m‘),(NULL,‘Wu song‘,‘m‘),(NULL,‘Sun erniang‘,‘f‘);

Query OK, 3 rows affected (0.01 sec)

Records: 3  Duplicates: 0  Warnings: 0

MariaDB [tb_test2]> SELECT * FROM tmp8;

+----+-------------+--------+

| id | name        | gender |

+----+-------------+--------+

|  1 | lin chong   | m      |

|  2 | Wu song     | m      |

|  3 | Sun erniang | f      |

+----+-------------+--------+

3 rows in set (0.00 sec)

第一种方法

MariaDB [tb_test2]> INSERT INTO tmp8 (name,gender)VALUES(‘Yang zhi‘,‘m‘);

Query OK, 1 row affected (0.01 sec)

MariaDB [tb_test2]> SELECT * FROM tmp8;

+----+-------------+--------+

| id | name        | gender |

+----+-------------+--------+

|  1 | lin chong   | m      |

|  2 | Wu song     | m      |

|  3 | Sun erniang | f      |

|  4 | Yang zhi    | m      |

+----+-------------+--------+

4 rows in set (0.00 sec)

第二中插入方法 set

MariaDB [tb_test2]> INSERT INTO tmp8 SET name=‘Li kui‘,gender=‘m‘;

Query OK, 1 row affected (0.01 sec)

MariaDB [tb_test2]> SELECT * FROM tmp8;

+----+-------------+--------+

| id | name        | gender |

+----+-------------+--------+

|  1 | lin chong   | m      |

|  2 | Wu song     | m      |

|  3 | Sun erniang | f      |

|  4 | Yang zhi    | m      |

|  5 | Li kui      | m      |

+----+-------------+--------+

5 rows in set (0.00 sec)

使用第一种方法再加两位女英雄

MariaDB [tb_test2]> INSERT INTO tmp8( name,gender) VALUES(‘Gu dasao‘,‘f‘),(‘Hu sanmiang‘,‘f‘);

Query OK, 2 rows affected (0.00 sec)

Records: 2  Duplicates: 0  Warnings: 0

MariaDB [tb_test2]> SELECT * FROM tmp8;

+----+-------------+--------+

| id | name        | gender |

+----+-------------+--------+

|  1 | lin chong   | m      |

|  2 | Wu song     | m      |

|  3 | Sun erniang | f      |

|  4 | Yang zhi    | m      |

|  5 | Li kui      | m      |

|  6 | Gu dasao    | f      |

|  7 | Hu sanmiang | f      |

+----+-------------+--------+

7 rows in set (0.00 sec)

再创建个表tmp7

MariaDB [tb_test2]> CREATE TABLE tmp7 (id INT(11)AUTO_INCREMENT PRIMARY KEY,name CHAR(30),gender ENUM(‘m‘,‘f‘));

Query OK, 0 rows affected (0.02 sec)

MariaDB [tb_test2]> INSERT INTO tmp7 VALUES(NULL,‘Zhu geliang‘,‘m‘),(NULL,‘Hang yueying‘,‘f‘);

Query OK, 2 rows affected (0.01 sec)

Records: 2  Duplicates: 0  Warnings: 0

MariaDB [tb_test2]> SELECT * FROM tmp7;

+----+--------------+--------+

| id | name         | gender |

+----+--------------+--------+

|  1 | Zhu geliang  | m      |

|  2 | Hang yueying | f      |

+----+--------------+--------+

2 rows in set (0.00 sec)

第三种查找tmp8的gender=‘f’的所有人添加到tmp7

MariaDB [tb_test2]> INSERT INTO tmp7(name,gender) SELECT * FROM tmp8 WHERE gender=‘f‘;

ERROR 1136 (21S01): Column count doesn‘t match value count at row 1

报错了,    下面才可以

MariaDB [tb_test2]> INSERT INTO tmp7(name,gender) SELECT name,gender FROM tmp8 WHERE gender=‘f‘;

Query OK, 3 rows affected (0.01 sec)

Records: 3  Duplicates: 0  Warnings: 0

MariaDB [tb_test2]> SELECT * FROM tmp7;

+----+---------------+--------+

| id | name          | gender |

+----+---------------+--------+

|  1 | Zhu geliang   | m      |

|  2 | Huang yueying | f      |

|  3 | Sun erniang   | f      |

|  4 | Gu dasao      | f      |

|  5 | Hu sanmiang   | f      |

+----+---------------+--------+

5 rows in set (0.00 sec)

UPDATE

MariaDB [tb_test2]> HELP UPDATE;

Name: ‘UPDATE‘

Description:

Syntax:

Single-table syntax:

UPDATE table_reference

SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...

[WHERE where_condition]

[ORDER BY ...]

[LIMIT row_count]

单表操作

判断某字段值为空  IS NULL   不为空  IS NOT NULL

把ClassID为空的行的年龄改为70

MariaDB [hellodb]> UPDATE students SET Age=70 WHERE ClassID IS NULL;

Query OK, 4 rows affected (0.01 sec)

Rows matched: 4  Changed: 4  Warnings: 0

MariaDB [hellodb]> SELECT * FROM students;

+-------+---------------+-----+--------+---------+-----------+

| StuID | Name          | Age | Gender | ClassID | TeacherID |

+-------+---------------+-----+--------+---------+-----------+

|     1 | Shi Zhongyu   |  22 | M      |       2 |         3 |

|     2 | Shi Potian    |  22 | M      |       1 |         7 |

|     3 | Xie Yanke     |  53 | M      |       2 |        16 |

|     4 | Ding Dian     |  32 | M      |       4 |         4 |

|     5 | Yu Yutong     |  26 | M      |       3 |         1 |

|     6 | Shi Qing      |  46 | M      |       5 |      NULL |

|     7 | Xi Ren        |  19 | F      |       3 |      NULL |

|     8 | Lin Daiyu     |  17 | F      |       7 |      NULL |

|     9 | Ren Yingying  |  20 | F      |       6 |      NULL |

|    10 | Yue Lingshan  |  19 | F      |       3 |      NULL |

|    11 | Yuan Chengzhi |  23 | M      |       6 |      NULL |

|    12 | Wen Qingqing  |  19 | F      |       1 |      NULL |

|    13 | Tian Boguang  |  33 | M      |       2 |      NULL |

|    14 | Lu Wushuang   |  17 | F      |       3 |      NULL |

|    15 | Duan Yu       |  19 | M      |       4 |      NULL |

|    16 | Xu Zhu        |  21 | M      |       1 |      NULL |

|    17 | Lin Chong     |  25 | M      |       4 |      NULL |

|    18 | Hua Rong      |  23 | M      |       7 |      NULL |

|    19 | Xue Baochai   |  18 | F      |       6 |      NULL |

|    20 | Diao Chan     |  19 | F      |       7 |      NULL |

|    21 | Huang Yueying |  22 | F      |       6 |      NULL |

|    22 | Xiao Qiao     |  20 | F      |       1 |      NULL |

|    23 | Ma Chao       |  23 | M      |       4 |      NULL |

|    24 | Xu Xian       |  70 | M      |    NULL |      NULL |

|    25 | Sun Dasheng   |  70 | M      |    NULL |      NULL |

|    26 | Hong qigong   |  70 | M      |    NULL |      NULL |

|    27 | Yi Deng       |  70 | M      |    NULL |      NULL |

+-------+---------------+-----+--------+---------+-----------+

27 rows in set (0.00 sec)

找出年龄小于等于20

MariaDB [hellodb]> SELECT * FROM students WHERE Age<=20;

+-------+--------------+-----+--------+---------+-----------+

| StuID | Name         | Age | Gender | ClassID | TeacherID |

+-------+--------------+-----+--------+---------+-----------+

|     7 | Xi Ren       |  19 | F      |       3 |      NULL |

|     8 | Lin Daiyu    |  17 | F      |       7 |      NULL |

|     9 | Ren Yingying |  20 | F      |       6 |      NULL |

|    10 | Yue Lingshan |  19 | F      |       3 |      NULL |

|    12 | Wen Qingqing |  19 | F      |       1 |      NULL |

|    14 | Lu Wushuang  |  17 | F      |       3 |      NULL |

|    15 | Duan Yu      |  19 | M      |       4 |      NULL |

|    19 | Xue Baochai  |  18 | F      |       6 |      NULL |

|    20 | Diao Chan    |  19 | F      |       7 |      NULL |

|    22 | Xiao Qiao    |  20 | F      |       1 |      NULL |

+-------+--------------+-----+--------+---------+-----------+

10 rows in set (0.00 sec)

把年龄小于18的ClassID改成3

MariaDB [hellodb]> UPDATE students SET ClassID=3 WHERE Age<18;

Query OK, 1 row affected (0.01 sec)

Rows matched: 2  Changed: 1  Warnings: 0

再次查看

MariaDB [hellodb]> SELECT * FROM students WHERE Age<=20;

+-------+--------------+-----+--------+---------+-----------+

| StuID | Name         | Age | Gender | ClassID | TeacherID |

+-------+--------------+-----+--------+---------+-----------+

|     7 | Xi Ren       |  19 | F      |       3 |      NULL |

|     8 | Lin Daiyu    |  17 | F      |       3 |      NULL |

|     9 | Ren Yingying |  20 | F      |       6 |      NULL |

|    10 | Yue Lingshan |  19 | F      |       3 |      NULL |

|    12 | Wen Qingqing |  19 | F      |       1 |      NULL |

|    14 | Lu Wushuang  |  17 | F      |       3 |      NULL |

|    15 | Duan Yu      |  19 | M      |       4 |      NULL |

|    19 | Xue Baochai  |  18 | F      |       6 |      NULL |

|    20 | Diao Chan    |  19 | F      |       7 |      NULL |

|    22 | Xiao Qiao    |  20 | F      |       1 |      NULL |

+-------+--------------+-----+--------+---------+-----------+

10 rows in set (0.00 sec)

使用ORDER BY 默认升序排列,LIMIT限制前几行

MariaDB [hellodb]> UPDATE students SET ClassID=4 ORDER BY Age LIMIT 3;

Query OK, 3 rows affected (0.07 sec)

Rows matched: 3  Changed: 3  Warnings: 0

MariaDB [hellodb]> SELECT * FROM students WHERE Age<20 ORDER BY Age;

+-------+--------------+-----+--------+---------+-----------+

| StuID | Name         | Age | Gender | ClassID | TeacherID |

+-------+--------------+-----+--------+---------+-----------+

|     8 | Lin Daiyu    |  17 | F      |       4 |      NULL |

|    14 | Lu Wushuang  |  17 | F      |       4 |      NULL |

|    19 | Xue Baochai  |  18 | F      |       4 |      NULL |

|     7 | Xi Ren       |  19 | F      |       3 |      NULL |

|    10 | Yue Lingshan |  19 | F      |       3 |      NULL |

|    12 | Wen Qingqing |  19 | F      |       1 |      NULL |

|    15 | Duan Yu      |  19 | M      |       4 |      NULL |

|    20 | Diao Chan    |  19 | F      |       7 |      NULL |

+-------+--------------+-----+--------+---------+-----------+

8 rows in set (0.01 sec)

按年龄逆序排  ORDER BY Age DESC

MariaDB [hellodb]> UPDATE students SET ClassID=5 WHERE Age<20 ORDER BY Age DESC LIMIT 2;

Query OK, 2 rows affected (0.00 sec)

Rows matched: 2  Changed: 2  Warnings: 0

MariaDB [hellodb]> SELECT * FROM students WHERE Age<20 ORDER BY Age DESC;

+-------+--------------+-----+--------+---------+-----------+

| StuID | Name         | Age | Gender | ClassID | TeacherID |

+-------+--------------+-----+--------+---------+-----------+

|     7 | Xi Ren       |  19 | F      |       5 |      NULL |

|    10 | Yue Lingshan |  19 | F      |       5 |      NULL |

|    12 | Wen Qingqing |  19 | F      |       1 |      NULL |

|    15 | Duan Yu      |  19 | M      |       4 |      NULL |

|    20 | Diao Chan    |  19 | F      |       7 |      NULL |

|    19 | Xue Baochai  |  18 | F      |       4 |      NULL |

|     8 | Lin Daiyu    |  17 | F      |       4 |      NULL |

|    14 | Lu Wushuang  |  17 | F      |       4 |      NULL |

+-------+--------------+-----+--------+---------+-----------+

MariaDB [hellodb]> HELP DELETE;

Name: ‘DELETE‘

Description:

Syntax:

Single-table syntax:

DELETE FROM tbl_name

[WHERE where_condition]

[ORDER BY ...]

[LIMIT row_count]

Multiple-table syntax:

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]

tbl_name[.*] [, tbl_name[.*]] ...

FROM table_references

[WHERE where_condition]

Or:

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]

FROM tbl_name[.*] [, tbl_name[.*]] ...

USING table_references

[WHERE where_condition]

删除年龄大于60的用户

MariaDB [hellodb]> DELETE FROM students WHERE Age>60;

Query OK, 4 rows affected (0.01 sec)

MariaDB [hellodb]> SELECT * FROM students ORDER BY Age;

+-------+---------------+-----+--------+---------+-----------+

| StuID | Name          | Age | Gender | ClassID | TeacherID |

+-------+---------------+-----+--------+---------+-----------+

|    14 | Lu Wushuang   |  17 | F      |       4 |      NULL |

|     8 | Lin Daiyu     |  17 | F      |       4 |      NULL |

|    19 | Xue Baochai   |  18 | F      |       4 |      NULL |

|    15 | Duan Yu       |  19 | M      |       4 |      NULL |

|    10 | Yue Lingshan  |  19 | F      |       5 |      NULL |

|     7 | Xi Ren        |  19 | F      |       5 |      NULL |

|    20 | Diao Chan     |  19 | F      |       7 |      NULL |

|    12 | Wen Qingqing  |  19 | F      |       1 |      NULL |

|     9 | Ren Yingying  |  20 | F      |       6 |      NULL |

|    22 | Xiao Qiao     |  20 | F      |       1 |      NULL |

|    16 | Xu Zhu        |  21 | M      |       1 |      NULL |

|    21 | Huang Yueying |  22 | F      |       6 |      NULL |

|     1 | Shi Zhongyu   |  22 | M      |       2 |         3 |

|     2 | Shi Potian    |  22 | M      |       1 |         7 |

|    23 | Ma Chao       |  23 | M      |       4 |      NULL |

|    18 | Hua Rong      |  23 | M      |       7 |      NULL |

|    11 | Yuan Chengzhi |  23 | M      |       6 |      NULL |

|    17 | Lin Chong     |  25 | M      |       4 |      NULL |

|     5 | Yu Yutong     |  26 | M      |       3 |         1 |

|     4 | Ding Dian     |  32 | M      |       4 |         4 |

|    13 | Tian Boguang  |  33 | M      |       2 |      NULL |

|     6 | Shi Qing      |  46 | M      |       5 |      NULL |

|     3 | Xie Yanke     |  53 | M      |       2 |        16 |

+-------+---------------+-----+--------+---------+-----------+

23 rows in set (0.00 sec)

删除按年龄排序前三行

MariaDB [hellodb]> DELETE FROM students ORDER BY Age LIMIT 3;

Query OK, 3 rows affected (0.00 sec)

MariaDB [hellodb]> SELECT * FROM students ORDER BY Age;

+-------+---------------+-----+--------+---------+-----------+

| StuID | Name          | Age | Gender | ClassID | TeacherID |

+-------+---------------+-----+--------+---------+-----------+

|    12 | Wen Qingqing  |  19 | F      |       1 |      NULL |

|    10 | Yue Lingshan  |  19 | F      |       5 |      NULL |

|     7 | Xi Ren        |  19 | F      |       5 |      NULL |

|    15 | Duan Yu       |  19 | M      |       4 |      NULL |

|    20 | Diao Chan     |  19 | F      |       7 |      NULL |

|     9 | Ren Yingying  |  20 | F      |       6 |      NULL |

|    22 | Xiao Qiao     |  20 | F      |       1 |      NULL |

|    16 | Xu Zhu        |  21 | M      |       1 |      NULL |

|    21 | Huang Yueying |  22 | F      |       6 |      NULL |

|     1 | Shi Zhongyu   |  22 | M      |       2 |         3 |

|     2 | Shi Potian    |  22 | M      |       1 |         7 |

|    11 | Yuan Chengzhi |  23 | M      |       6 |      NULL |

|    18 | Hua Rong      |  23 | M      |       7 |      NULL |

|    23 | Ma Chao       |  23 | M      |       4 |      NULL |

|    17 | Lin Chong     |  25 | M      |       4 |      NULL |

|     5 | Yu Yutong     |  26 | M      |       3 |         1 |

|     4 | Ding Dian     |  32 | M      |       4 |         4 |

|    13 | Tian Boguang  |  33 | M      |       2 |      NULL |

|     6 | Shi Qing      |  46 | M      |       5 |      NULL |

|     3 | Xie Yanke     |  53 | M      |       2 |        16 |

+-------+---------------+-----+--------+---------+-----------+

20 rows in set (0.00 sec)

MariaDB [hellodb]> SHOW GLOBAL VARIABLES LIKE ‘query_cache%‘;

+------------------------------+----------+

| Variable_name                | Value    |

+------------------------------+----------+

| query_cache_limit            | 1048576  |

| query_cache_min_res_unit     | 4096     |

| query_cache_size             | 16777216 |

| query_cache_strip_comments   | OFF      |

| query_cache_type             | ON       |

| query_cache_wlock_invalidate | OFF      |

+------------------------------+----------+

6 rows in set (0.01 sec)

查缓存,,    只要大于1的正数  表示启用查询缓存的功能

MariaDB [hellodb]> SELECT @@GLOBAL.query_cache_size;

+---------------------------+

| @@GLOBAL.query_cache_size |

+---------------------------+

|                  16777216 |

+---------------------------+

1 row in set (0.00 sec)

查询当前时间

MariaDB [hellodb]> SELECT CURRENT_TIME();

+----------------+

| CURRENT_TIME() |

+----------------+

| 18:25:45       |

+----------------+

1 row in set (0.00 sec)

或者

MariaDB [hellodb]> SELECT NOW();

+---------------------+

| NOW()               |

+---------------------+

| 2014-08-30 18:26:54 |

+---------------------+

1 row in set (0.00 sec)

MariaDB [hellodb]> SELECT @@GLOBAL.query_cache_type;

+---------------------------+

| @@GLOBAL.query_cache_type |

+---------------------------+

| ON                        |

+---------------------------+

1 row in set (0.00 sec)

有三种情况DEMAND 表示按需缓存,意思是只有明确写明要缓存结果的SELECT语句的结果才会进行缓存。

注意几乎所有的缓存中,缓存的内容都是key-value格式

Key:查询语句的hash码;

Value:查询语句的执行result

缓存就是提高性能的。

客户端------》查询缓存------》客户端;

客户端------》查询缓存-----》解析器-------》预处理器-------》查询优化器-------》查询执行引擎-------》存储引擎(处理数据)--------》查询执行引擎-------》客户端

分组的目的就是聚合的,聚合后可处理如求平均值

SELECT values_to_diplay  -------投影表示挑选出字段的,过滤列的

FROM table_name

WHERE expression   ----     挑选  选择符合条件的行

GROUP BY how_to_group

HAVING expression

ORDER BY how_to_sort

LIMIT row_count;

WHERE可使用算数运算符,关系运算符

MariaDB [hellodb]> SELECT Name,Age FROM students;   红色的挑选出列

+---------------+-----+

| Name          | Age |

+---------------+-----+

| Shi Zhongyu   |  22 |

| Shi Potian    |  22 |

| Xie Yanke     |  53 |

| Ding Dian     |  32 |

| Yu Yutong     |  26 |

| Shi Qing      |  46 |

| Xi Ren        |  19 |

| Ren Yingying  |  20 |

| Yue Lingshan  |  19 |

| Yuan Chengzhi |  23 |

| Wen Qingqing  |  19 |

| Tian Boguang  |  33 |

| Duan Yu       |  19 |

| Xu Zhu        |  21 |

| Lin Chong     |  25 |

| Hua Rong      |  23 |

| Diao Chan     |  19 |

| Huang Yueying |  22 |

| Xiao Qiao     |  20 |

| Ma Chao       |  23 |

+---------------+-----+

20 rows in set (0.00 sec)

字段别名

MariaDB [hellodb]> SELECT Name AS student,age FROM students;

+---------------+-----+

| student       | age |

+---------------+-----+

| Shi Zhongyu   |  22 |

| Shi Potian    |  22 |

| Xie Yanke     |  53 |

| Ding Dian     |  32 |

| Yu Yutong     |  26 |

| Shi Qing      |  46 |

| Xi Ren        |  19 |

| Ren Yingying  |  20 |

| Yue Lingshan  |  19 |

| Yuan Chengzhi |  23 |

| Wen Qingqing  |  19 |

| Tian Boguang  |  33 |

| Duan Yu       |  19 |

| Xu Zhu        |  21 |

| Lin Chong     |  25 |

| Hua Rong      |  23 |

| Diao Chan     |  19 |

| Huang Yueying |  22 |

| Xiao Qiao     |  20 |

| Ma Chao       |  23 |

+---------------+-----+

20 rows in set (0.00 sec)

DISTINCT    对应相同的值只显示一次

MariaDB [hellodb]> SELECT DISTINCT AGE FROM students;

+-----+

| AGE |

+-----+

|  22 |

|  53 |

|  32 |

|  26 |

|  46 |

|  19 |

|  20 |

|  23 |

|  33 |

|  21 |

|  25 |

+-----+

11 rows in set (0.00 sec)

BETWEEN  。。AND。。范围

IN  表示存在性测试  指定范围内存在性。 IN(10,100,1000)后接列表,

IS NULL    ///////    IS  NOT  NULL

LIKE 可以使用通配符

RLIKE          可使用正则表达式

事例

MariaDB [hellodb]> SELECT Name,Age FROM students WHERE Name LIKE ‘s%‘;

+-------------+-----+

| Name        | Age |

+-------------+-----+

| Shi Zhongyu |  22 |

| Shi Potian  |  22 |

| Shi Qing    |  46 |

+-------------+-----+

3 rows in set (0.00 sec)

MariaDB [hellodb]> SELECT Name,Age FROM students WHERE Name RLIKE ‘^s.*u$‘;

+-------------+-----+

| Name        | Age |

+-------------+-----+

| Shi Zhongyu |  22 |

+-------------+-----+

1 row in set (0.00 sec)

逻辑操作符  and  or   not

GROUP BY 做分组

MariaDB [hellodb]> SELECT ClassID,AVG(Age) FROM students GROUP BY ClassID;

+---------+----------+

| ClassID | AVG(Age) |

+---------+----------+

|       1 |  20.5000 |

|       2 |  36.0000 |

|       3 |  26.0000 |

|       4 |  24.7500 |

|       5 |  28.0000 |

|       6 |  21.6667 |

|       7 |  21.0000 |

+---------+----------+

7 rows in set (0.08 sec)

MariaDB [hellodb]> SELECT ClassID ,AVG(Age) FROM students GROUP BY ClassID HAVING AVG(Age)>25;

+---------+----------+

| ClassID | AVG(Age) |

+---------+----------+

|       2 |  36.0000 |

|       3 |  26.0000 |

|       5 |  28.0000 |

+---------+----------+

3 rows in set (0.00 sec)

MariaDB [hellodb]> SELECT ClassID ,AVG(Age) AS AVG FROM students GROUP BY ClassID HAVING  AVG>25;

GROUP BY :  做聚合计算是使用,表示根据指定的字段,对符合条件的行做分组,而后对每分组做聚合计算;   聚合计算  AVG()平局数;SUM()求和;MAX()最大;   MIN()   COUNT()统计个数。

HAVING: 对聚合计数做过滤。

ORDER BY 指定字段排序可以有多个。

MariaDB [hellodb]> SELECT ClassID,COUNT(ClassID)FROM students GROUP BY ClassID;

+---------+----------------+

| ClassID | COUNT(ClassID) |

+---------+----------------+

|       1 |              4 |

|       2 |              3 |

|       3 |              1 |

|       4 |              4 |

|       5 |              3 |

|       6 |              3 |

|       7 |              2 |

+---------+----------------+

7 rows in set (0.02 sec)

MariaDB [hellodb]> SELECT ClassID,SUM(Age)FROM students GROUP BY ClassID;

+---------+----------+

| ClassID | SUM(Age) |

+---------+----------+

|       1 |       82 |

|       2 |      108 |

|       3 |       26 |

|       4 |       99 |

|       5 |       84 |

|       6 |       65 |

|       7 |       42 |

+---------+----------+

7 rows in set (0.02 sec)

使用HAVING

MariaDB [hellodb]> SELECT ClassID,SUM(Age)FROM students GROUP BY ClassID HAVING SUM(Age)>80;

+---------+----------+

| ClassID | SUM(Age) |

+---------+----------+

|       1 |       82 |

|       2 |      108 |

|       4 |       99 |

|       5 |       84 |

+---------+----------+

4 rows in set (0.01 sec)

按名字排序

MariaDB [hellodb]> SELECT Name,Age FROM students ORDER BY Name;

+---------------+-----+

| Name          | Age |

+---------------+-----+

| Diao Chan     |  19 |

| Ding Dian     |  32 |

| Duan Yu       |  19 |

| Hua Rong      |  23 |

| Huang Yueying |  22 |

| Lin Chong     |  25 |

| Ma Chao       |  23 |

| Ren Yingying  |  20 |

| Shi Potian    |  22 |

| Shi Qing      |  46 |

| Shi Zhongyu   |  22 |

| Tian Boguang  |  33 |

| Wen Qingqing  |  19 |

| Xi Ren        |  19 |

| Xiao Qiao     |  20 |

| Xie Yanke     |  53 |

| Xu Zhu        |  21 |

| Yu Yutong     |  26 |

| Yuan Chengzhi |  23 |

| Yue Lingshan  |  19 |

+---------------+-----+

20 rows in set (0.01 sec)

按年龄

MariaDB [hellodb]> SELECT Name,Age FROM students ORDER BY Age;

+---------------+-----+

| Name          | Age |

+---------------+-----+

| Wen Qingqing  |  19 |

| Yue Lingshan  |  19 |

| Xi Ren        |  19 |

| Duan Yu       |  19 |

| Diao Chan     |  19 |

| Ren Yingying  |  20 |

| Xiao Qiao     |  20 |

| Xu Zhu        |  21 |

| Huang Yueying |  22 |

| Shi Zhongyu   |  22 |

| Shi Potian    |  22 |

| Yuan Chengzhi |  23 |

| Hua Rong      |  23 |

| Ma Chao       |  23 |

| Lin Chong     |  25 |

| Yu Yutong     |  26 |

| Ding Dian     |  32 |

| Tian Boguang  |  33 |

| Shi Qing      |  46 |

| Xie Yanke     |  53 |

+---------------+-----+

20 rows in set (0.00 sec)

都是升序  可以后接DESC 降序

使用LIMIT 4,3表示隔四个取三个

MariaDB [hellodb]> SELECT Name,Age FROM students ORDER BY Age LIMIT 4,3;

+--------------+-----+

| Name         | Age |

+--------------+-----+

| Diao Chan    |  19 |

| Ren Yingying |  20 |

| Xiao Qiao    |  20 |

+--------------+-----+

3 rows in set (0.00 sec)

SELECT 执行时先执行 FROM(判断表)  再执行WHERE 而后GROUP BY 分组和HAVING过滤,若GROUP BY 和HAVING不存在则执行ORDER BY(排序) 如果排序不存在最后执行投影SELECT   最最后才LIMIT

如下事例先判断表而后条件WHERE 最后才投影

MariaDB [hellodb]> SELECT Name,Age FROM students WHERE Age>30;

+--------------+-----+

| Name         | Age |

+--------------+-----+

| Xie Yanke    |  53 |

| Ding Dian    |  32 |

| Shi Qing     |  46 |

| Tian Boguang |  33 |

+--------------+-----+

4 rows in set (0.00 sec)

join 多表查询

连接查询   事先将两张表相应的join操作,而后根据join的结果做查询

CROSS JOIN  交叉连接   笛卡尔积

INNER JOIN  内部连接

OUTER JOIN  外部连接,(左外右外)  以其中一个表为基准

NATURAL JOIN   等值连接

如果OUTER JOIN 以左表为基准则LEFT OUTER JOIN  右表没有的为空。以右表为基准

SELECT students.name, classes.Class FROM students,classes WHERE students.ClassID = classes.ClassID AND name=’xu zhu’;

下面是等值链接

先下面是交叉链接  这种操作很危险  谨慎

下面有个表 teachers

找到 students和teachers表中学生名和对应的老师的名字。

左外连接

右外连接

子查询:查询中嵌套着查询

基于某查询语句的结果再次进行的查询

用于WHERE子句的子查询

1、用于比较表达式中的子查询

要求子查询只能返回单个结果;

2、用于IN中的子查询

判断是否存在于指定的列表中

3、用于EXISTS中子查询

SELECT Name,Age FROM students WHERE Age > (SELECT AVG(Age) FROM students);

查找表students 中平均年龄

MariaDB [hellodb]> SELECT AVG(Age) FROM students;

+----------+

| AVG(Age) |

+----------+

|  25.3000 |

+----------+

1 row in set (0.37 sec)

使用子查询查找students中年龄大于平均年龄的同学

MariaDB [hellodb]> SELECT Name AS students FROM students WHERE Age > (SELECT AVG(Age) FROM students);

+--------------+

| students     |

+--------------+

| Xie Yanke    |

| Ding Dian    |

| Yu Yutong    |

| Shi Qing     |

| Tian Boguang |

+--------------+

5 rows in set (0.00 sec)

2、用于IN中的子查询,判断是否存在于指定的列表中。

查出老师的编号使之与学生相同编号的学生的名字

MariaDB [hellodb]> SELECT Name FROM students WHERE StuID IN (SELECT TID FROM teachers);

+-------------+

| Name        |

+-------------+

| Shi Zhongyu |

| Shi Potian  |

| Xie Yanke   |

| Ding Dian   |

+-------------+

4 rows in set (0.14 sec)

3、用于EXISTS中子查询

用于FROM中的子查询:

SELECT alias.col,... FROM (SELECT statement) AS alias WHERE clause

例如:SELECT s.Name FROM (SELECT * FROM students WHERE Age > 20) AS s WHERE s.Name LIKE ‘s%‘;

联合查询:

SELECT statement UNION SELECT statement

将两外或多个返回值字段相同的查询的结果合并输出;

MariaDB [hellodb]> SELECT Name,Age FROM teachers WHERE Age >=40;

+---------------+-----+

| Name          | Age |

+---------------+-----+

| Song Jiang    |  45 |

| Zhang Sanfeng |  94 |

| Miejue Shitai |  77 |

| Lin Chaoying  |  93 |

+---------------+-----+

4 rows in set (0.00 sec)

MariaDB [hellodb]> SELECT Name,Age FROM students WHERE Age >=40;

+-----------+-----+

| Name      | Age |

+-----------+-----+

| Xie Yanke |  53 |

| Shi Qing  |  46 |

+-----------+-----+

2 rows in set (0.00 sec)

MariaDB [hellodb]> SELECT Name,Age FROM students WHERE Age >= 40 UNION SELECT Name,Age FROM teachers WHERE Age >= 40;

+---------------+-----+

| Name          | Age |

+---------------+-----+

| Xie Yanke     |  53 |

| Shi Qing      |  46 |

| Song Jiang    |  45 |

| Zhang Sanfeng |  94 |

| Miejue Shitai |  77 |

| Lin Chaoying  |  93 |

+---------------+-----+

6 rows in set (0.05 sec)

视图:VIEW

存储下来的SELECT语句,此语句有名称;此名称表示的对象类似表;

虚表:视图

基表:视图中的查询语句针对其进行查询的表

CREATE VIEW view_name AS SELECT statement;

DROP VIEW view_name;

MariaDB [hellodb]> CREATE VIEW stus AS SELECT StuID,Name,Age,Gender FROM  students;

Query OK, 0 rows affected (0.10 sec)

MariaDB [hellodb]> SHOW TABLES;

+-------------------+

| Tables_in_hellodb |

+-------------------+

| classes           |

| coc               |

| courses           |

| scores            |

| students          |

| stus              |

| teachers          |

| tmp1              |

| toc               |

+-------------------+

9 rows in set (0.01 sec)

MariaDB [hellodb]> SELECT * FROM stus;

+-------+---------------+-----+--------+

| StuID | Name          | Age | Gender |

+-------+---------------+-----+--------+

|     1 | Shi Zhongyu   |  22 | M      |

|     2 | Shi Potian    |  22 | M      |

|     3 | Xie Yanke     |  53 | M      |

|     4 | Ding Dian     |  32 | M      |

|     5 | Yu Yutong     |  26 | M      |

|     6 | Shi Qing      |  46 | M      |

|     7 | Xi Ren        |  19 | F      |

|     9 | Ren Yingying  |  20 | F      |

|    10 | Yue Lingshan  |  19 | F      |

|    11 | Yuan Chengzhi |  23 | M      |

|    12 | Wen Qingqing  |  19 | F      |

|    13 | Tian Boguang  |  33 | M      |

|    15 | Duan Yu       |  19 | M      |

|    16 | Xu Zhu        |  21 | M      |

|    17 | Lin Chong     |  25 | M      |

|    18 | Hua Rong      |  23 | M      |

|    20 | Diao Chan     |  19 | F      |

|    21 | Huang Yueying |  22 | F      |

|    22 | Xiao Qiao     |  20 | F      |

|    23 | Ma Chao       |  23 | M      |

+-------+---------------+-----+--------+

20 rows in set (0.00 sec)

MariaDB [hellodb]> SHOW TABLE STATUS LIKE ‘stus‘\G;

*************************** 1. row ***************************

Name: stus

Engine: NULL

Version: NULL

Row_format: NULL

Rows: NULL

Avg_row_length: NULL

Data_length: NULL

Max_data_length: NULL

Index_length: NULL

Data_free: NULL

Auto_increment: NULL

Create_time: NULL

Update_time: NULL

Check_time: NULL

Collation: NULL

Checksum: NULL

Create_options: NULL

Comment: VIEW

1 row in set (0.00 sec)

ERROR: No query specified

MariaDB [hellodb]> DROP VIEW stus;、、删除

Query OK, 0 rows affected (0.00 sec)

EXPLAIN:

EXPLAIN SELECT Name,Age FROM students WHERE Name LIKE ‘s%‘ or Age > 28\G

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: students

type: index_merge

possible_keys: Name,Age

key: Name,Age

key_len: 152,1

ref: NULL

rows: 7

Extra: Using sort_union(Name,Age); Using where

MariaDB [hellodb]> SELECT Name FROM students WHERE Age > 25;

+--------------+

| Name         |

+--------------+

| Xie Yanke    |

| Ding Dian    |

| Yu Yutong    |

| Shi Qing     |

| Tian Boguang |

+--------------+

5 rows in set (0.01 sec)

MariaDB [hellodb]> EXPLAIN SELECT Name FROM students WHERE Age > 25;

+------+-------------+----------+------+---------------+------+---------+------+------+-------------+

| id   | select_type | table    | type | possible_keys | key  | key_len | ref  | rows | Extra       |

+------+-------------+----------+------+---------------+------+---------+------+------+-------------+

|    1 | SIMPLE      | students | ALL  | NULL          | NULL | NULL    | NULL |   20 | Using where |

+------+-------------+----------+------+---------------+------+---------+------+------+-------------+

1 row in set (0.07 sec)

MariaDB [hellodb]> EXPLAIN SELECT Name FROM students WHERE Age > 25\G;

*************************** 1. row ***************************

id: 1

select_type: SIMPLE         、、select语句的类型,这里是简单查询

table: students            、、针对那张表

type: ALL                。。

possible_keys: NULL               可能会用到的索引

key: NULL     用到的索引

key_len: NULL      用到的索引的长度

ref: NULL      参考性结果

rows: 20        行数  从多少航中取得

Extra: Using where

1 row in set (0.00 sec)

ERROR: No query specified

MariaDB [hellodb]> ALTER TABLE students ADD INDEX(age);  创建索引

Query OK, 0 rows affected (0.26 sec)

Records: 0  Duplicates: 0  Warnings: 0

MariaDB [hellodb]> EXPLAIN SELECT Name FROM students WHERE Age > 25\G;

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: students

type: range

possible_keys: Age

key: Age

key_len: 1

ref: NULL

rows: 5

Extra: Using index condition

1 row in set (0.00 sec)

ERROR: No query specified

id: SELECT语句的标识符

select_type:

SIMPLE

PRIMARY

UNION

UNION RESULT:UNION的执行结果

SUBQUERY:

DERIVED:用于FROM子句中的子查询;

table:

查询语句所关系到的表的名字;

type: 访问到目标记录的方法

system: 表中仅有一行;

const: 表中至多有一行匹配;一般只有用于PRIMARY KEY或UNIQUE KEY(NOT NULL)索引时,此种结果才会出现;

eq_ref: 类似于const,表中至多有一个匹配到的行

ref:

fulltext:

ref_or_null:

index_merge:

unique_subquery: 通常出现于IN子查询中

index_subquery: 类似上一个,

range: 带有范围限制的索引;

index: 全索引扫描

ALL:全表扫描

Extra:

using where:

using index:

using index for group by:

时间: 2024-08-24 10:56:59

Mysql 笔记之SQL语句及查询语句详解的相关文章

Linux命令:MySQL系列之三--mysql数据类型及SQL结构化查询语句使用

MySQL 存储引擎,也被称为表类型:    MyISAM表:无事务处理功能,支持表锁 .frm:表结构定义文件 .MYD:表数据文件 .MYI:表索引文件 InnoDB表:支持事务处理功能,支持行锁 .frm:表结构定义文件 .ibd:表空间(包含数据和索引文件) MySQL常用的查询命令: SHOW ENGINES;  #查看数据库支持的引擎及状态. SHOW TABLE STATUS LIKE 'user' \G  #查看表user的属性信息,\G竖排显示 mysqld --help --

Oracle SQL语言之查询语句_超越OCP精通Oracle视频教程培训29

Oracle SQL语言之查询语句_超越OCP精通Oracle视频教程培训29 本课程介绍: Oracle视频教程,风哥本套oracle教程培训是<<Oracle数据库SQL语言实战培训教程>>的第4/5套:Oracle SQL语言之查询语句.主要学习Oracle数据库SQL查询限制排序.Oracle SQL联接查询.Oracle SQL子查询等. 视频学习地址: http://edu.51cto.com/course/course_id-8047.html Oracle SQL语

SQL结构化查询语句

SQL结构化查询语句 SQL定义了查询所有关系型数据库的规则. 1.通用语法 SQL语句可以单行或者多行书写,以分号结尾 可以使用空格和缩进增强可读性 不区分大小写,但是关键字建议大写 3种注释 注释内容:多行注释/*;-- 注释内容 2.SQL分类 DDL(Date Definition Language)数据定义语言 用来定义数据库对象:数据库.表.列等,包括关键字:create,drop.alte DML(Data Manipulation Language)数据操作语言,增删改 用来对数

常用经典SQL语句大全完整版--详解+实例 《来自网络,很全没整理,寄存与此》

常用经典SQL语句大全完整版--详解+实例 下列语句部分是Mssql语句,不可以在access中使用. SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT) DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK) 首先,简要介绍基础语句: 1.说明:创建数据库CREATE DATABASE database-name 2.说明:删除数据库drop data

Oracle创建表语句(Create table)语法详解及示例

Oracle创建表语句(Create table)语法详解及示例   创建表(Create table)语法详解1. ORACLE常用的字段类型ORACLE常用的字段类型有VARCHAR2 (size) 可变长度的字符串, 必须规定长度CHAR(size) 固定长度的字符串, 不规定长度默认值为1NUMBER(p,s) 数字型p是位数总长度, s是小数的长度, 可存负数最长38位. 不够位时会四舍五入.DATE 日期和时间类型LOB 超长字符, 最大可达4GCLOB 超长文本字符串BLOB 超长

Linq实战 之 Linq to Sql及Entity Framework操作详解

Linq实战 之 Linq to Sql及Entity Framework操作详解 一:linq to db的框架 1. linq to sql 2. linq to ado.net entity framework linq to sql是一个团队 ef 是一个团队... linq to sql => ef 团队. linq to sql 适合一些小型的项目 => sqlserver ef 适合中形的项目,而且可以支持 sqllite,mysql,sqlserver 掌柜的项目开发中:使用的

hibernate(七) hibernate中查询方式详解

序言 之前对hibernate中的查询总是搞混淆,不明白里面具体有哪些东西.就是因为缺少总结.在看这篇文章之前,你应该知道的是数据库的一些查询操作,多表查询等,如果不明白,可以先去看一下 MySQL数据表查询操作详解  ,以至于看这篇文章不用那么吃力. --WH 一.hibernate中的5种检索方式 1.1.导航对象图检索方式 根据已经加载的对象导航到其他对象 例如:在前面的各种映射关系中,实体类包含对其他类对象的引用. Dept d = (Dept) session.get(Dept.cla

06 : mysql 的 binlog 日志 和slow慢日志 详解

mysql 的 binlog 日志 和slow慢日志 详解 mysql一般常用的日志有三种:1:error错误日志2: binlog日志3:slow日志 下面将详细解释这三种日志: 1.错误日志记录MySQL启动或工作过程中,数据库状态信息,默认就是开启的,数据路径下$hostname.err.也可以指定错误路径:log_error=/var/log/mysql3306.log 2.二进制binlog日志(1)他记录了什么?记录了所有的数据库修改类的命令:DDLDCLDML (2)二进制日志记录

SQL Server 事务隔离级别详解

原文:SQL Server 事务隔离级别详解 标签: SQL SEERVER/MSSQL SERVER/SQL/事务隔离级别选项/设计数据库事务级别 SQL 事务隔离级别 概述 隔离级别用于决定如果控制并发用户如何读写数据的操作,同时对性能也有一定的影响作用. 步骤 事务隔离级别通过影响读操作来间接地影响写操作:可以在回话级别上设置事务隔离级别也可以在查询(表级别)级别上设置事务隔离级别.事务隔离级别总共有6个隔离级别:READ UNCOMMITTED(未提交读,读脏),相当于(NOLOCK)R

SQL SERVER分区具体例子详解

在日常工作中,我们会遇到以下的情况,一个表每日数万级的增长,而查询的数据通常是在本月或今年,以前的数据偶尔会用到,但查询和插入的效率越来越慢,用数据库分区会有助于解决这个问题.关于分区的理论知识网上很多我这里就不在累赘,我从一个实际例子出发,看如何将一个已经运行了很长时间的普通表进行分区. 回到目录 提出问题 需解决问题:有一个数据表数据很大,我们通常的查询是在一个季度中.我们需要将以往年份的数据按不同年份存在文件组里,当年的数据分为4个季度存,如果到了新的一年,将之前4个季度的合并到一年中,新