Mysql 筆記之SQL語句及查詢語句詳解

                                   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)

第三種查找tmp8gender=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)

把年齡小於18ClassID改成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  表示存在性測試  指定範圍內存在性。 IN10,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 43表示隔四個取三個

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’;

下面是等值鏈接

wKioL1R77rOBCGkwAACMYqjHJjM632.jpg

先下面是交叉鏈接  這種操作很危險  謹慎

wKiom1R77ivg76vVAAFjaZ3UjMs766.jpg

下面有個表 teachers

wKioL1R77rTjx3HlAACIfTDqSXU688.jpg

找到 studentsteachers表中學生名和對應的老師的名字。

wKioL1R77rSTEQ0QAACzf6amM-o859.jpg

左外連接

wKiom1R77iuis-KhAAD8-4zsqCI005.jpg

右外連接

wKioL1R77rTjNz7UAACdB5QQVlk708.jpg

子查詢:查詢中嵌套着查詢

              基於某查詢語句的結果再次進行的查詢

              用於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:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章