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: