MySQL中經常使用SQL語句的編寫

簡述

以前一直使用的django的orm模型,最近想學習下原生sql語句的編寫。之後工做中可能不使用django,爲了更好的工做和提升本身的知識全面點,記錄下經常使用的sql語句編寫。python

1、建立、刪除、選擇數據庫

1. 若是數據庫不存在就建立mysql

CREATE DATABASE IF NOT EXISTS blog CHARACTER SET utf8 COLLATE utf8_general_ci;
複製代碼

2. 若是數據庫存在就刪除正則表達式

DROP DATABASE IF EXISTS blog;
複製代碼

3. 切換到咱們選擇的數據庫,並查看庫中全部表sql

USE blog;
SHOW TABLES;
複製代碼

4. 數據庫受權用戶建立數據庫

grant all on blog.* to blog@'%' identified by '123456';
複製代碼

5. 查看數據庫結構express

SHOW DATABASES LIKE 'blog%';
複製代碼

6. 查詢受權用戶django

SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
複製代碼

7. 修改數據庫用戶密碼bash

USE mysql;
UPDATE USER SET PASSWORD = PASSWORD ("new-password") WHERE USER = "root";
FLUSH PRIVILEGES;
複製代碼

2、MySQL數據類型介紹

MySQL 數據類型ide

MySQL中定義數據字段的類型對你數據庫的優化是很是重要的。 MySQL支持多種類型,大體能夠分爲三類:數值、日期/時間和字符串(字符)類型。函數


數值類型

MySQL支持全部標準SQL數值數據類型。 這些類型包括嚴格數值數據類型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似數值數據類型(FLOAT、REAL和DOUBLE PRECISION)。 關鍵字INT是INTEGER的同義詞,關鍵字DEC是DECIMAL的同義詞。 BIT數據類型保存位字段值,而且支持MyISAM、MEMORY、InnoDB和BDB表。 做爲SQL標準的擴展,MySQL也支持整數類型TINYINT、MEDIUMINT和BIGINT。下面的表顯示了須要的每一個整數類型的存儲和範圍。

類型 大小 範圍(有符號) 範圍(無符號) 用途
TINYINT 1 字節 (-128,127) (0,255) 小整數值
SMALLINT 2 字節 (-32 768,32 767) (0,65 535) 大整數值
MEDIUMINT 3 字節 (-8 388 608,8 388 607) (0,16 777 215) 大整數值
INT或INTEGER 4 字節 (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整數值
BIGINT 8 字節 (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 極大整數值
FLOAT 4 字節 (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 單精度
浮點數值
DOUBLE 8 字節 (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 雙精度
浮點數值
DECIMAL 對DECIMAL(M,D) ,若是M>D,爲M+2不然爲D+2 依賴於M和D的值 依賴於M和D的值 小數值

日期和時間類型

表示時間值的日期和時間類型爲DATETIME、DATE、TIMESTAMP、TIME和YEAR。 每一個時間類型有一個有效值範圍和一個"零"值,當指定不合法的MySQL不能表示的值時使用"零"值。

類型 大小(字節) 範圍 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 '-838:59:59'/'838:59:59' HH:MM:SS 時間值或持續時間
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和時間值
TIMESTAMP 4 1970-01-01 00:00:00/2037 年某時 YYYYMMDD HHMMSS 混合日期和時間值,時間戳

字符串類型

字符串類型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。該節描述了這些類型如何工做以及如何在查詢中使用這些類型。

類型 大小 用途
CHAR 0-255字節 定長字符串
VARCHAR 0-65535 字節 變長字符串
TINYBLOB 0-255字節 不超過 255 個字符的二進制字符串
TINYTEXT 0-255字節 短文本字符串
BLOB 0-65 535字節 二進制形式的長文本數據
TEXT 0-65 535字節 長文本數據
MEDIUMBLOB 0-16 777 215字節 二進制形式的中等長度文本數據
MEDIUMTEXT 0-16 777 215字節 中等長度文本數據
LONGBLOB 0-4 294 967 295字節 二進制形式的極大文本數據
LONGTEXT 0-4 294 967 295字節 極大文本數據

CHAR和VARCHAR類型相似,但它們保存和檢索的方式不一樣。它們的最大長度和是否尾部空格被保留等方面也不一樣。在存儲或檢索過程當中不進行大小寫轉換。 BINARY和VARBINARY類相似於CHAR和VARCHAR,不一樣的是它們包含二進制字符串而不要非二進制字符串。也就是說,它們包含字節字符串而不是字符字符串。這說明它們沒有字符集,而且排序和比較基於列值字節的數值值。 BLOB是一個二進制大對象,能夠容納可變數量的數據。有4種BLOB類型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它們只是可容納值的最大長度不一樣。 有4種TEXT類型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。這些對應4種BLOB類型,有相同的最大長度和存儲需求。

3、MySQL數據的各類騷操做

1. 建立數據表

建立MySQL數據表須要如下信息: 表名 表字段名 定義每一個表字段

語法 如下爲建立MySQL數據表的SQL通用語法:

CREATE TABLE table_name (column_name column_type);
複製代碼

如下例子中咱們將在blog數據庫中建立數據表author、article、tag以及article和tag的關聯表article_tag 建立author表:

CREATE TABLE IF NOT EXISTS `author`(
   `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '做者ID',
   `name` VARCHAR(40) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '做者名字',
   `qq` BIGINT(20) NULL DEFAULT NULL COMMENT '做者QQ',
   `phone` BIGINT(20) NULL DEFAULT NULL COMMENT '做者電話',
   PRIMARY KEY ( `id` ),
   INDEX `name` (`name`) USING BTREE,
   UNIQUE INDEX `phone` (`phone`) USING BTREE
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
ROW_FORMAT=DYNAMIC
;
複製代碼

查看author表結構:

mysql> desc author;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(40) | YES  | MUL | NULL    |                |
| qq    | bigint(20)  | YES  |     | NULL    |                |
| phone | bigint(20)  | YES  | UNI | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
複製代碼

建立article表:

CREATE TABLE IF NOT EXISTS `article`(
   `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '文章ID',
   `title` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文章標題',
   `content` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文章內容',
   `author_id` INT(11) NOT NULL COMMENT '做者ID',
   `create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '發佈時間',
   PRIMARY KEY ( `id` ),
   FOREIGN KEY (`author_id`) REFERENCES `author` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   UNIQUE INDEX `author_id` (`author_id`) USING BTREE
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
ROW_FORMAT=DYNAMIC
;
複製代碼

查看article表結構:

mysql> desc article;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| title       | varchar(100) | YES  |     | NULL    |                |
| content     | text         | YES  |     | NULL    |                |
| author_id   | int(11)      | NO   | MUL | NULL    |                |
| create_time | date         | YES  |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+
複製代碼

建立tag表:

CREATE TABLE IF NOT EXISTS `tag`(
   `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '標籤ID',
   `name` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '標籤名稱',
   PRIMARY KEY ( `id` )
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
ROW_FORMAT=DYNAMIC
;
複製代碼

查看tag表結構:

mysql> desc tag;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(100) | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
複製代碼

建立article_tag表:

CREATE TABLE IF NOT EXISTS `article_tag`(
   `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '文章標籤關聯表ID',
   `article_id` INT(11) NOT NULL COMMENT '文章ID',
   `tag_id` INT(11) NOT NULL COMMENT '標籤ID',
   PRIMARY KEY ( `id` ),
   FOREIGN KEY (`article_id`) REFERENCES `article` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   FOREIGN KEY (`tag_id`) REFERENCES `tag` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   UNIQUE INDEX `article_tag_unique` (`article_id`, `tag_id`) USING BTREE ,
   INDEX `article_id` (`article_id`) USING BTREE 
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
ROW_FORMAT=DYNAMIC
;
複製代碼

查看article_tag表結構:

mysql> desc article_tag;
+------------+---------+------+-----+---------+----------------+
| Field      | Type    | Null | Key | Default | Extra          |
+------------+---------+------+-----+---------+----------------+
| id         | int(11) | NO   | PRI | NULL    | auto_increment |
| article_id | int(11) | NO   | MUL | NULL    |                |
| tag_id     | int(11) | NO   | MUL | NULL    |                |
+------------+---------+------+-----+---------+----------------+
複製代碼

語句解析: 若是你不想字段爲 NULL 能夠設置字段的屬性爲 NOT NULL, 在操做數據庫時若是輸入該字段的數據爲NULL ,就會報錯。 AUTO_INCREMENT定義列爲自增的屬性,通常用於主鍵,數值會自動加1。 PRIMARY KEY關鍵字用於定義列爲主鍵。 您可使用多列來定義主鍵,列間以逗號分隔。 ENGINE 設置存儲引擎, CHARACTER SET設置編碼。 INDEX設置該字段爲索引,UNIQUE INDEX設置字段值惟一,而且設置該字段爲索引。 COMMENT給該字段添加註釋。

ROW_FORMAT=DYNAMIC,設置表爲動態表(在mysql中, 若一張表裏面不存在varchar、text以及其變形、blob以及其變形的字段的話,那麼張這個表其實也叫靜態表,即該表的row_format是fixed,就是說每條記錄所佔用的字節同樣。其優勢讀取快,缺點浪費額外一部分空間。 若一張表裏面存在varchar、text以及其變形、blob以及其變形的字段的話,那麼張這個表其實也叫動態表,即該表的row_format是dynamic,就是說每條記錄所佔用的字節是動態的。其優勢節省空間,缺點增長讀取的時間開銷。因此,作搜索查詢量大的表通常都以空間來換取時間,設計成靜態表)。

數據表解析: author是做者表,有4個字段:id, name, qq, phone article是文章表,文章和做者是多對一的關係,這裏使用外鍵方式關聯。字段author_id關聯的是author的id字段。 tag是標籤表,有2個字段:id, name 文章和標籤是多對多的關係(ManyToMany),這裏使用第三張表article_tag把它們關聯起來。字段article_id外鍵關聯的是article的id字段,字段tag_id外鍵關聯的是tag的id字段。

2. 刪除數據表

DROP TABLE IF EXISTS article_tag;
複製代碼

3. 插入數據 MySQL 表中使用 INSERT INTO SQL語句來插入數據。 你能夠經過 mysql> 命令提示窗口中向數據表中插入數據,或者經過PHP腳原本插入數據。

語法 如下爲向MySQL數據表插入數據通用的 INSERT INTO SQL語法:

INSERT INTO table_name ( field1, field2,...fieldN )
                       VALUES
                       ( value1, value2,...valueN );
複製代碼

若是數據是字符型,必須使用單引號或者雙引號,如:"value"。

author表插入幾條數據:

INSERT INTO author(name, qq, phone) VALUES('君惜', 123456, 18500178899), ('糖糖', 234567, 13256987582), ('琳琳', 345678, 15636589521);
複製代碼

查看author表:

mysql> SELECT * FROM author;
+----+------+--------+-------------+
| id | name | qq     | phone       |
+----+------+--------+-------------+
|  1 | 君惜 | 123456 | 18500178899 |
|  2 | 糖糖 | 234567 | 13256987582 |
|  3 | 琳琳 | 345678 | 15636589521 |
+----+------+--------+-------------+
複製代碼

article表插入幾條數據:

INSERT INTO article(title, content, author_id) VALUES('流暢的python', 'Python各類拽', 1), ('嘻哈', '中國有嘻哈', 2), ('嚴肅', '你這輩子就是吃了太嚴肅的虧', 3);
複製代碼

查看article表:

mysql> select * from article;
+----+--------------+----------------------------+-----------+---------------------+
| id | title        | content                    | author_id | create_time         |
+----+--------------+----------------------------+-----------+---------------------+
|  1 | 流暢的python | Python各類拽               |         1 | 2017-09-12 16:36:43 |
|  2 | 嘻哈         | 中國有嘻哈                 |         2 | 2017-09-12 16:36:43 |
|  3 | 嚴肅         | 你這輩子就是吃了太嚴肅的虧 |         3 | 2017-09-12 16:36:43 |
+----+--------------+----------------------------+-----------+---------------------+
複製代碼

tag表插入數據:

INSERT INTO tag(name) VALUES('技術'), ('娛樂'), ('文學');
複製代碼

查看tag表:

mysql> select * from tag;
+----+------+
| id | name |
+----+------+
|  1 | 技術 |
|  2 | 娛樂 |
|  3 | 文學 |
+----+------+
複製代碼

article_tag表插入數據:

INSERT INTO article_tag(article_id, tag_id) VALUES(1, 1), (2, 2), (3, 3);
複製代碼

查看article_tag表:

mysql> select * from article_tag;
+----+------------+--------+
| id | article_id | tag_id |
+----+------------+--------+
|  1 |          1 |      1 |
|  2 |          2 |      2 |
|  3 |          3 |      3 |
+----+------------+--------+
複製代碼

4. 查詢數據 MySQL 數據庫使用SQL SELECT語句來查詢數據。 你能夠經過 mysql> 命令提示窗口中在數據庫中查詢數據,或者經過PHP腳原本查詢數據。

語法 如下爲在MySQL數據庫中查詢數據通用的 SELECT 語法:

SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[OFFSET M ][LIMIT N]
複製代碼
  • 查詢語句中你可使用一個或者多個表,表之間使用逗號(,)分割,並使用WHERE語句來設定查詢條件。
  • SELECT 命令能夠讀取一條或者多條記錄。
  • 你可使用星號(*)來代替其餘字段,SELECT語句會返回表的全部字段數據
  • 你可使用 WHERE 語句來包含任何條件。
  • 你能夠經過OFFSET指定SELECT語句開始查詢的數據偏移量。默認狀況下偏移量爲0。
  • 你可使用 LIMIT 屬性來設定返回的記錄數。

實例 如下實例將返回數據表article的全部記錄

mysql> select * from article;
+----+--------------+----------------------------+-----------+---------------------+
| id | title        | content                    | author_id | create_time         |
+----+--------------+----------------------------+-----------+---------------------+
|  1 | 流暢的python | Python各類拽               |         1 | 2017-09-12 16:36:43 |
|  2 | 嘻哈         | 中國有嘻哈                 |         2 | 2017-09-12 16:36:43 |
|  3 | 嚴肅         | 你這輩子就是吃了太嚴肅的虧 |         3 | 2017-09-12 16:36:43 |
+----+--------------+----------------------------+-----------+---------------------+
複製代碼

查詢指定字段數據

mysql> select title, content from article;
+--------------+----------------------------+
| title        | content                    |
+--------------+----------------------------+
| 流暢的python | Python各類拽               |
| 嘻哈         | 中國有嘻哈                 |
| 嚴肅         | 你這輩子就是吃了太嚴肅的虧 |
+--------------+----------------------------+
複製代碼

5. WHERE 子句 咱們知道從 MySQL 表中使用 SQL SELECT 語句來讀取數據。 如需有條件地從表中選取數據,可將 WHERE 子句添加到 SELECT 語句中。

語法 如下是 SQL SELECT 語句使用 WHERE 子句從數據表中讀取數據的通用語法:

SELECT field1, field2,...fieldN FROM table_name1, table_name2...
[WHERE condition1 [AND [OR]] condition2.....
複製代碼
  • 查詢語句中你可使用一個或者多個表,表之間使用逗號, 分割,並使用WHERE語句來設定查詢條件。
  • 你能夠在 WHERE 子句中指定任何條件。
  • 你可使用 AND 或者 OR 指定一個或多個條件。
  • WHERE 子句也能夠運用於 SQL 的 DELETE 或者 UPDATE 命令。
  • WHERE 子句相似於程序語言中的 if 條件,根據 MySQL 表中的字段值來讀取指定的數據。

如下爲操做符列表,可用於 WHERE 子句中。 下表中實例假定 A 爲 10, B 爲 20

操做符 描述 實例
= 等號,檢測兩個值是否相等,若是相等返回true (A = B) 返回false。
<>, != 不等於,檢測兩個值是否相等,若是不相等返回true (A != B) 返回 true。
> 大於號,檢測左邊的值是否大於右邊的值, 若是左邊的值大於右邊的值返回true (A > B) 返回false。
< 小於號,檢測左邊的值是否小於右邊的值, 若是左邊的值小於右邊的值返回true (A < B) 返回 true。
>= 大於等於號,檢測左邊的值是否大於或等於右邊的值, 若是左邊的值大於或等於右邊的值返回true (A >= B) 返回false。
<= 小於等於號,檢測左邊的值是否小於於或等於右邊的值, 若是左邊的值小於或等於右邊的值返回true (A <= B) 返回 true。

若是咱們想再 MySQL 數據表中讀取指定的數據,WHERE 子句是很是有用的。 使用主鍵來做爲 WHERE 子句的條件查詢是很是快速的。 若是給定的條件在表中沒有任何匹配的記錄,那麼查詢不會返回任何數據。

實例 如下實例將讀取article表中title字段值爲 嘻哈 的全部記錄:

mysql> select * from article where title="嘻哈";
+----+-------+------------+-----------+---------------------+
| id | title | content    | author_id | create_time         |
+----+-------+------------+-----------+---------------------+
|  2 | 嘻哈  | 中國有嘻哈 |         2 | 2017-09-12 16:36:43 |
+----+-------+------------+-----------+---------------------+
複製代碼

6. UPDATE 語句 若是咱們須要修改或更新 MySQL 中的數據,咱們可使用 SQL UPDATE 命令來操做。

語法 如下是 UPDATE 命令修改 MySQL 數據表數據的通用 SQL 語法:

UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause]
複製代碼
  • 你能夠同時更新一個或多個字段。
  • 你能夠在 WHERE 子句中指定任何條件。
  • 你能夠在一個單獨表中同時更新數據。

當你須要更新數據表中指定行的數據時 WHERE 子句是很是有用的。

經過命令提示符更新數據 如下咱們將在 SQL UPDATE 命令使用 WHERE 子句來更新 author 表中指定的數據: 實例 如下實例將更新數據表中 id 爲 1 的 qq 字段值:

mysql> update author set qq='2298630081' where id=1;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from author where id=1;
+----+------+------------+-------------+
| id | name | qq         | phone       |
+----+------+------------+-------------+
|  1 | 君惜 | 2298630081 | 18500178899 |
+----+------+------------+-------------+
1 row in set (0.00 sec)
複製代碼

7. DELETE 語句 你可使用 SQL 的 DELETE FROM 命令來刪除 MySQL 數據表中的記錄。 你能夠在 mysql> 命令提示符或 PHP 腳本中執行該命令。

語法 如下是 SQL DELETE 語句從 MySQL 數據表中刪除數據的通用語法:

DELETE FROM table_name [WHERE Clause]
複製代碼
  • 若是沒有指定 WHERE 子句,MySQL 表中的全部記錄將被刪除。
  • 你能夠在 WHERE 子句中指定任何條件
  • 您能夠在單個表中一次性刪除記錄。

當你想刪除數據表中指定的記錄時 WHERE 子句是很是有用的。

實例 插入一條數據:

INSERT INTO author(name, qq, phone) VALUES('悅悅','456789','13343809438');
複製代碼

刪除 author 表中 name 爲 悅悅 的記錄:

mysql> delete from author where name="悅悅";
Query OK, 1 row affected (0.01 sec)

mysql> select * from author;
+----+------+------------+-------------+
| id | name | qq         | phone       |
+----+------+------------+-------------+
|  1 | 君惜 | 2298630081 | 18500178899 |
|  2 | 糖糖 |     234567 | 13256987582 |
|  3 | 琳琳 |     345678 | 15636589521 |
+----+------+------------+-------------+
3 rows in set (0.00 sec)
複製代碼

8. LIKE 子句

咱們知道在 MySQL 中使用 SQL SELECT 命令來讀取數據, 同時咱們能夠在 SELECT 語句中使用 WHERE 子句來獲取指定的記錄。 WHERE 子句中可使用等號 = 來設定獲取數據的條件,如 "runoob_author = 'RUNOOB.COM'"。 可是有時候咱們須要獲取 runoob_author 字段含有 "COM" 字符的全部記錄,這時咱們就須要在 WHERE 子句中使用 SQL LIKE 子句。 SQL LIKE 子句中使用百分號 %字符來表示任意字符,相似於UNIX或正則表達式中的星號 *。 若是沒有使用百分號 %, LIKE 子句與等號 = 的效果是同樣的。

語法 如下是 SQL SELECT 語句使用 LIKE 子句從數據表中讀取數據的通用語法:

SELECT field1, field2,...fieldN 
FROM table_name
WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'
複製代碼
  • 你能夠在 WHERE 子句中指定任何條件。
  • 你能夠在 WHERE 子句中使用LIKE子句。
  • 你可使用LIKE子句代替等號 =。
  • LIKE 一般與 % 一同使用,相似於一個元字符的搜索。
  • 你可使用 AND 或者 OR 指定一個或多個條件。
  • 你能夠在 DELETE 或 UPDATE 命令中使用 WHERE...LIKE 子句來指定條件。

實例 插入幾條數據:

insert into author(name, qq, phone) values('李天星', '5678911', '13345607861'), ('王星', '5678912', '13345607862'), ('張星星', '5678913', '13345607863');
複製代碼

查詢 author 表 name 字段中以星爲結尾的的全部記錄:

mysql> select * from author where name like '%星';
+----+--------+---------+-------------+
| id | name   | qq      | phone       |
+----+--------+---------+-------------+
|  5 | 李天星 | 5678911 | 13345607861 |
|  6 | 王星   | 5678912 | 13345607862 |
|  7 | 張星星 | 5678913 | 13345607863 |
+----+--------+---------+-------------+
3 rows in set (0.01 sec)
複製代碼

9. UNION 操做符 MySQL UNION 操做符用於鏈接兩個以上的 SELECT 語句的結果組合到一個結果集合中。多個 SELECT 語句會刪除重複的數據。

語法 MySQL UNION 操做符語法格式:

SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];
複製代碼

參數

  • expression1, expression2, ... expression_n: 要檢索的列。
  • tables: 要檢索的數據表。
  • WHERE conditions: 可選, 檢索條件。
  • DISTINCT: 可選,刪除結果集中重複的數據。默認狀況下 UNION 操做符已經刪除了重複數據,因此 DISTINCT 修飾符對結果沒啥影響。
  • ALL: 可選,返回全部結果集,包含重複數據。

articles表

mysql> select * from articles;
+----+--------------+----------------------------+---------+
| id | title        | content                    | user_id |
+----+--------------+----------------------------+---------+
|  1 | 中國有嘻哈   | 哈哈哈                     |       1 |
|  2 | 星光大道     | 成名之路                   |       2 |
|  3 | 平凡的真諦   | 開心即完美                 |       3 |
|  4 | python進階   | Python高級用法             |       1 |
|  5 | 流暢的python | 就問你流暢不流暢            |       1 |
|  6 | 嚴肅         | 你這輩子就是吃了太嚴肅的虧 |       3 |
+----+--------------+----------------------------+---------+
6 rows in set (0.00 sec)
複製代碼

article表

mysql> select * from article;
+----+--------------+----------------------------+-----------+---------------------+
| id | title        | content                    | author_id | create_time         |
+----+--------------+----------------------------+-----------+---------------------+
|  1 | 流暢的python | Python各類拽               |         1 | 2017-09-12 16:36:43 |
|  2 | 嘻哈         | 中國有嘻哈                 |         2 | 2017-09-12 16:36:43 |
|  3 | 嚴肅         | 你這輩子就是吃了太嚴肅的虧 |         3 | 2017-09-12 16:36:43 |
+----+--------------+----------------------------+-----------+---------------------+
3 rows in set (0.00 sec)
複製代碼

SQL UNION 實例 下面的 SQL 語句從 article 和 articles 表中選取全部不一樣的title(只有不一樣的值):

mysql> select title from article union select title from articles order by title;
+--------------+
| title        |
+--------------+
| python進階   |
| 嚴肅         |
| 中國有嘻哈   |
| 嘻哈         |
| 平凡的真諦   |
| 星光大道     |
| 流暢的python |
+--------------+
7 rows in set (0.00 sec)
複製代碼

註釋:UNION 不能用於列出兩個表中全部的title。若是出現重複的數據,只會列出一次。UNION 只會選取不一樣的值。請使用 UNION ALL 來選取重複的值!

SQL UNION ALL 實例 下面的 SQL 語句使用 UNION ALL 從 "article" 和 "articles" 表中選取全部的title(也有重複的值):

mysql> select title from article union all select title from articles order by title;
+--------------+
| title        |
+--------------+
| python進階   |
| 嚴肅         |
| 嚴肅         |
| 中國有嘻哈   |
| 嘻哈         |
| 平凡的真諦   |
| 星光大道     |
| 流暢的python |
| 流暢的python |
+--------------+
9 rows in set (0.00 sec)
複製代碼

帶有 WHERE 的 SQL UNION ALL 下面的 SQL 語句使用 UNION ALL 從 "article" 和 "articles" 表中選取所標題(title)爲流暢的python的書籍(也有重複的值):

mysql> select title, content from article where title='流暢的python' union all select title, content from articles  where title='流暢的python' order by title;
+--------------+------------------+
| title        | content          |
+--------------+------------------+
| 流暢的python | Python各類拽     |
| 流暢的python | 就問你流暢不流暢 |
+--------------+------------------+
2 rows in set (0.00 sec)
複製代碼

10. 排序 咱們知道從 MySQL 表中使用 SQL SELECT 語句來讀取數據。 若是咱們須要對讀取的數據進行排序,咱們就可使用 MySQL 的 ORDER BY 子句來設定你想按哪一個字段哪一種方式來進行排序,再返回搜索結果。

語法 如下是 SQL SELECT 語句使用 ORDER BY 子句將查詢數據排序後再返回數據:

SELECT field1, field2,...fieldN table_name1, table_name2...
ORDER BY field1, [field2...] [ASC [DESC]]
複製代碼
  • 你可使用任何字段來做爲排序的條件,從而返回排序後的查詢結果。
  • 你能夠設定多個字段來排序。
  • 你可使用 ASC 或 DESC 關鍵字來設置查詢結果是按升序或降序排列。 默認狀況下,它是按升序排列。
  • 你能夠添加 WHERE...LIKE 子句來設置條件。

實例 嘗試如下實例,結果將按升序及降序排列。

mysql> select * from article order by create_time asc;
+----+--------------+----------------------------+-----------+---------------------+
| id | title        | content                    | author_id | create_time         |
+----+--------------+----------------------------+-----------+---------------------+
|  1 | 流暢的python | Python各類拽               |         1 | 2017-09-12 16:36:41 |
|  2 | 嘻哈         | 中國有嘻哈                 |         2 | 2017-09-12 16:36:42 |
|  3 | 嚴肅         | 你這輩子就是吃了太嚴肅的虧 |         3 | 2017-09-12 16:36:43 |
+----+--------------+----------------------------+-----------+---------------------+
3 rows in set (0.00 sec)

mysql> select * from article order by create_time desc;
+----+--------------+----------------------------+-----------+---------------------+
| id | title        | content                    | author_id | create_time         |
+----+--------------+----------------------------+-----------+---------------------+
|  3 | 嚴肅         | 你這輩子就是吃了太嚴肅的虧 |         3 | 2017-09-12 16:36:43 |
|  2 | 嘻哈         | 中國有嘻哈                 |         2 | 2017-09-12 16:36:42 |
|  1 | 流暢的python | Python各類拽               |         1 | 2017-09-12 16:36:41 |
+----+--------------+----------------------------+-----------+---------------------+
3 rows in set (0.00 sec)
複製代碼

11. GROUP BY 語句 GROUP BY 語句根據一個或多個列對結果集進行分組。 在分組的列上咱們可使用 COUNT, SUM, AVG,等函數。

GROUP BY 語法

SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
複製代碼

實例演示 實例使用到了如下表結構及數據,使用前咱們能夠先將如下數據導入數據庫中。

SET NAMES utf8;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
--  Table structure for `user_login`
-- ----------------------------
DROP TABLE IF EXISTS `user_login`;
CREATE TABLE `user_login` (
  `id` int(11) NOT NULL,
  `name` char(10) NOT NULL DEFAULT '',
  `date` datetime NOT NULL,
  `singin` tinyint(4) NOT NULL DEFAULT '0' COMMENT '登陸次數',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
--  Records of `user_login`
-- ----------------------------
BEGIN;
INSERT INTO `user_login` VALUES ('1', '小明', '2016-04-22 15:25:33', '1'), ('2', '小王', '2016-04-20 15:25:47', '3'), ('3', '小麗', '2016-04-19 15:26:02', '2'), ('4', '小王', '2016-04-07 15:26:14', '4'), ('5', '小明', '2016-04-11 15:26:40', '4'), ('6', '小明', '2016-04-04 15:26:54', '2');
COMMIT;

SET FOREIGN_KEY_CHECKS = 1;
複製代碼

導入成功後,執行如下 SQL 語句:

mysql> select * from user_login;
+----+------+---------------------+--------+
| id | name | date                | singin |
+----+------+---------------------+--------+
|  1 | 小明 | 2016-04-22 15:25:33 |      1 |
|  2 | 小王 | 2016-04-20 15:25:47 |      3 |
|  3 | 小麗 | 2016-04-19 15:26:02 |      2 |
|  4 | 小王 | 2016-04-07 15:26:14 |      4 |
|  5 | 小明 | 2016-04-11 15:26:40 |      4 |
|  6 | 小明 | 2016-04-04 15:26:54 |      2 |
+----+------+---------------------+--------+
6 rows in set (0.00 sec)
複製代碼

接下來咱們使用 GROUP BY 語句 將數據表按名字進行分組,並統計每一個人有多少條記錄:

mysql> select name, count(*) from user_login group by name;
+------+----------+
| name | count(*) |
+------+----------+
| 小麗 |        1 |
| 小明 |        3 |
| 小王 |        2 |
+------+----------+
3 rows in set (0.00 sec)
複製代碼

使用 WITH ROLLUP WITH ROLLUP 能夠實如今分組統計數據基礎上再進行相同的統計(SUM,AVG,COUNT…)。 例如咱們將以上的數據表按名字進行分組,再統計每一個人登陸的次數:

mysql> select name, sum(singin) as singin_count from user_login group by name with rollup;
+------+--------------+
| name | singin_count |
+------+--------------+
| 小麗 |            2 |
| 小明 |            7 |
| 小王 |            7 |
| NULL |           16 |
+------+--------------+
4 rows in set (0.00 sec)
複製代碼

其中記錄 NULL 表示全部人的登陸次數。 咱們可使用 coalesce 來設置一個能夠取代 NUll 的名稱,coalesce 語法:

select coalesce(a,b,c);
複製代碼

參數說明:若是a==null,則選擇b;若是b==null,則選擇c;若是a!=null,則選擇a;若是a b c 都爲null ,則返回爲null(沒意義)。

如下實例中若是名字爲空咱們使用總數代替:

mysql> select coalesce(name, '總數'), sum(singin) as singin_count from user_login group by name with rollup;
+------------------------+--------------+
| coalesce(name, '總數') | singin_count |
+------------------------+--------------+
| 小麗                   |            2 |
| 小明                   |            7 |
| 小王                   |            7 |
| 總數                   |           16 |
+------------------------+--------------+
4 rows in set (0.00 sec)
複製代碼

12. 多表連查 在真正的應用中常常須要從多個數據表中讀取數據。下面將向你們介紹如何使用 MySQL 的 JOIN 在兩個或多個表中查詢數據。 你能夠在 SELECT, UPDATE 和 DELETE 語句中使用 Mysql 的 JOIN 來聯合多表查詢。 JOIN 按照功能大體分爲以下三類:

  • INNER JOIN(內鏈接,或等值鏈接):獲取兩個表中字段匹配關係的記錄。
  • LEFT JOIN(左鏈接):獲取左表全部記錄,即便右表沒有對應匹配的記錄。
  • RIGHT JOIN(右鏈接):與 LEFT JOIN 相反,用於獲取右表全部記錄,即便左表沒有對應匹配的記錄。

咱們在blog數據庫中有四張表 author、article、tag、article_tag。數據表數據以下:

mysql> select * from author;
+----+--------+------------+-------------+
| id | name   | qq         | phone       |
+----+--------+------------+-------------+
|  1 | 君惜   | 2298630081 | 18500178899 |
|  2 | 糖糖   |     234567 | 13256987582 |
|  3 | 琳琳   |     345678 | 15636589521 |
|  5 | 李天星 |    5678911 | 13345607861 |
|  6 | 王星   |    5678912 | 13345607862 |
|  7 | 張星星 |    5678913 | 13345607863 |
+----+--------+------------+-------------+
6 rows in set (0.00 sec)

mysql> select * from article;
+----+--------------+----------------------------+-----------+---------------------+
| id | title        | content                    | author_id | create_time         |
+----+--------------+----------------------------+-----------+---------------------+
|  1 | 流暢的python | Python各類拽               |         1 | 2017-09-12 16:36:41 |
|  2 | 嘻哈         | 中國有嘻哈                 |         2 | 2017-09-12 16:36:42 |
|  3 | 嚴肅         | 你這輩子就是吃了太嚴肅的虧 |         3 | 2017-09-12 16:36:43 |
+----+--------------+----------------------------+-----------+---------------------+
3 rows in set (0.00 sec)

mysql> select * from tag;
+----+------+
| id | name |
+----+------+
|  1 | 技術 |
|  2 | 娛樂 |
|  3 | 文學 |
+----+------+
3 rows in set (0.00 sec)

mysql> select * from article_tag;
+----+------------+--------+
| id | article_id | tag_id |
+----+------------+--------+
|  1 |          1 |      1 |
|  2 |          2 |      2 |
|  3 |          3 |      3 |
+----+------------+--------+
3 rows in set (0.01 sec)
複製代碼

INNER JOIN 實例 使用 INNER JOIN查詢article中author_id等於author的id的數據(這裏SQL語句中INNER能夠省略):

mysql> select name, qq, phone, title, content, create_time from author as u join article as a on u.id=a.author_id;
+------+------------+-------------+--------------+----------------------------+---------------------+
| name | qq         | phone       | title        | content                    | create_time         |
+------+------------+-------------+--------------+----------------------------+---------------------+
| 君惜 | 2298630081 | 18500178899 | 流暢的python | Python各類拽               | 2017-09-12 16:36:41 |
| 糖糖 |     234567 | 13256987582 | 嘻哈         | 中國有嘻哈                 | 2017-09-12 16:36:42 |
| 琳琳 |     345678 | 15636589521 | 嚴肅         | 你這輩子就是吃了太嚴肅的虧 | 2017-09-12 16:36:43 |
+------+------------+-------------+--------------+----------------------------+---------------------+
3 rows in set (0.00 sec)
複製代碼

以上SQL語句等價於: where 子句

mysql> select name, qq, phone, title, content, create_time from author as u join article as a where u.id=a.author_id;
+------+------------+-------------+--------------+----------------------------+---------------------+
| name | qq         | phone       | title        | content                    | create_time         |
+------+------------+-------------+--------------+----------------------------+---------------------+
| 君惜 | 2298630081 | 18500178899 | 流暢的python | Python各類拽               | 2017-09-12 16:36:41 |
| 糖糖 |     234567 | 13256987582 | 嘻哈         | 中國有嘻哈                 | 2017-09-12 16:36:42 |
| 琳琳 |     345678 | 15636589521 | 嚴肅         | 你這輩子就是吃了太嚴肅的虧 | 2017-09-12 16:36:43 |
+------+------------+-------------+--------------+----------------------------+---------------------+
3 rows in set (0.00 sec)
複製代碼

利用第三張錶鏈接查詢

mysql> select title as '書名', content as '內容', name as '標籤', create_time as "建立時間" from article, tag inner join article_tag as at where at.article_id=article.id and at.tag_id=tag.id;
+--------------+----------------------------+------+---------------------+
| 書名         | 內容                       | 標籤 | 建立時間            |
+--------------+----------------------------+------+---------------------+
| 流暢的python | Python各類拽               | 技術 | 2017-09-12 16:36:41 |
| 嘻哈         | 中國有嘻哈                 | 娛樂 | 2017-09-12 16:36:42 |
| 嚴肅         | 你這輩子就是吃了太嚴肅的虧 | 文學 | 2017-09-12 16:36:43 |
+--------------+----------------------------+------+---------------------+
3 rows in set (0.00 sec)
複製代碼
mysql> select au.name as '做者', ar.title as '書名', ar.content as '內容', t.name as '標籤', ar.create_time as '建立時間' from author as au, article as ar, tag as t inner join article_tag as at where au.id=ar.author_id and at.art
icle_id=ar.id and at.tag_id=t.id;
+------+--------------+----------------------------+------+---------------------+
| 做者 | 書名         | 內容                       | 標籤 | 建立時間            |
+------+--------------+----------------------------+------+---------------------+
| 君惜 | 流暢的python | Python各類拽               | 技術 | 2017-09-12 16:36:41 |
| 糖糖 | 嘻哈         | 中國有嘻哈                 | 娛樂 | 2017-09-12 16:36:42 |
| 琳琳 | 嚴肅         | 你這輩子就是吃了太嚴肅的虧 | 文學 | 2017-09-12 16:36:43 |
+------+--------------+----------------------------+------+---------------------+
3 rows in set (0.00 sec)

複製代碼

LEFT JOIN 實例 MySQL left join 與 join 有所不一樣。 MySQL LEFT JOIN 會讀取左邊數據表的所有數據,即使右邊表無對應數據。 以 author 爲左表,article爲右表。右表無對應數據自動填充爲NULL:

mysql> select name, qq, phone, title, content, create_time from author as u left join article as a on u.id=a.author_id;
+--------+------------+-------------+--------------+----------------------------+---------------------+
| name   | qq         | phone       | title        | content                    | create_time         |
+--------+------------+-------------+--------------+----------------------------+---------------------+
| 君惜   | 2298630081 | 18500178899 | 流暢的python | Python各類拽               | 2017-09-12 16:36:41 |
| 糖糖   |     234567 | 13256987582 | 嘻哈         | 中國有嘻哈                 | 2017-09-12 16:36:42 |
| 琳琳   |     345678 | 15636589521 | 嚴肅         | 你這輩子就是吃了太嚴肅的虧 | 2017-09-12 16:36:43 |
| 李天星 |    5678911 | 13345607861 | NULL         | NULL                       | NULL                |
| 王星   |    5678912 | 13345607862 | NULL         | NULL                       | NULL                |
| 張星星 |    5678913 | 13345607863 | NULL         | NULL                       | NULL                |
+--------+------------+-------------+--------------+----------------------------+---------------------+
6 rows in set (0.00 sec)
複製代碼

RIGHT JOIN 實例 MySQL RIGHT JOIN 會讀取右邊數據表的所有數據,即使左邊邊表無對應數據。 以 article 爲左表,author爲右表,左表無對應數據自動填充爲NULL。:

mysql> select title, content, create_time, name, qq, phone from article as a right join author as u on u.id=a.author_id;
+--------------+----------------------------+---------------------+--------+------------+-------------+
| title        | content                    | create_time         | name   | qq         | phone       |
+--------------+----------------------------+---------------------+--------+------------+-------------+
| 流暢的python | Python各類拽               | 2017-09-12 16:36:41 | 君惜   | 2298630081 | 18500178899 |
| 嘻哈         | 中國有嘻哈                 | 2017-09-12 16:36:42 | 糖糖   |     234567 | 13256987582 |
| 嚴肅         | 你這輩子就是吃了太嚴肅的虧 | 2017-09-12 16:36:43 | 琳琳   |     345678 | 15636589521 |
| NULL         | NULL                       | NULL                | 李天星 |    5678911 | 13345607861 |
| NULL         | NULL                       | NULL                | 王星   |    5678912 | 13345607862 |
| NULL         | NULL                       | NULL                | 張星星 |    5678913 | 13345607863 |
+--------------+----------------------------+---------------------+--------+------------+-------------+
6 rows in set (0.00 sec)

mysql> select title, content, create_time, name, qq, phone from article as a right join author as u on u.id=a.author_id where title is not null;
+--------------+----------------------------+---------------------+------+------------+-------------+
| title        | content                    | create_time         | name | qq         | phone       |
+--------------+----------------------------+---------------------+------+------------+-------------+
| 流暢的python | Python各類拽               | 2017-09-12 16:36:41 | 君惜 | 2298630081 | 18500178899 |
| 嘻哈         | 中國有嘻哈                 | 2017-09-12 16:36:42 | 糖糖 |     234567 | 13256987582 |
| 嚴肅         | 你這輩子就是吃了太嚴肅的虧 | 2017-09-12 16:36:43 | 琳琳 |     345678 | 15636589521 |
+--------------+----------------------------+---------------------+------+------------+-------------+
3 rows in set (0.00 sec)
複製代碼

先記錄到這了。

相關文章
相關標籤/搜索