以前一直使用的django的orm模型,最近想學習下原生sql語句的編寫。之後工做中可能不使用django,爲了更好的工做和提升本身的知識全面點,記錄下經常使用的sql語句編寫。
CREATE DATABASE IF NOT EXISTS blog CHARACTER SET utf8 COLLATE utf8_general_ci;
DROP DATABASE IF EXISTS blog;
USE blog; SHOW TABLES;
grant all on blog.* to blog@'%' identified by '123456';
SHOW DATABASES LIKE 'blog%';
mysqldump -uroot -p'123456' blog > /backup/blog_$(date -d "today" +"%Y-%m-%d").sql
flush privileges;
show create table "table_name";
truncate table "table_name";
SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
USE mysql; UPDATE USER SET PASSWORD = PASSWORD ("new-password") WHERE USER = "root"; FLUSH PRIVILEGES;
mysqld_safe --console --skip-grant-tables& # 啓動完畢而後使用mysql命令進入數據庫 use mysql; update user set password=PASSWORD("new-password") where user="root"; flush privileges;
mysql> show status like 'Threads%'; +-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | Threads_cached | 58 | | Threads_connected | 57 | ###這個數值指的是打開的鏈接數 | Threads_created | 3676 | | Threads_running | 4 | ###這個數值指的是激活的鏈接數,這個數值通常遠低於connected數值 +-------------------+-------+ Threads_connected 跟show processlist結果相同,表示當前鏈接數。準確的來講,Threads_running是表明當前併發數 這是是查詢數據庫當前設置的最大鏈接數 mysql> show variables like '%max_connections%'; 能夠在/etc/my.cnf裏面設置數據庫的最大鏈接數 [mysqld] max_connections = 1000 max_connections 參數能夠用於控制數據庫的最大鏈接數: mysql> show variables like '%connect%'; 不少開發人員都會碰見」MySQL: ERROR 1040: Too many connections」的異常狀況,形成這種狀況的一種緣由是訪問量太高,MySQL服務器抗不住,這個時候就要考慮增長從服務器分散讀壓力;另外一種緣由就是MySQL配置文件中max_connections值太小。 查看mysql的最大鏈接數: mysql> show variables like '%max_connections%'; 查看服務器響應的最大鏈接數: mysql> show global status like 'Max_used_connections'; 對於mysql服務器最大鏈接數值的設置範圍比較理想的是:服務器響應的最大鏈接數值佔服務器上限鏈接數值的比例值在10%以上,若是在10%如下,說明mysql服務器最大鏈接上限值設置太高。 mysql> show variables like '%max_connections%'; mysql> show global status like 'Max_used_connections'; 上面咱們知道怎麼查看mysql服務器的最大鏈接數值,而且知道了如何判斷該值是否合理,下面咱們就來介紹一下如何設置這個最大鏈接數值。 方法1: mysql> set GLOBAL max_connections=256; 方法2: 修改mysql配置文件my.cnf,在[mysqld]段中添加或修改max_connections值: max_connections=128 重啓mysql服務便可。 Threads_created:建立過的線程數,若是發現Threads_created值過大的話,代表MySQL服務器一直在建立線程,這也是比較耗資源,能夠適當增長配置文件中thread_cache_size值 優化參數thread_cache_size thread_cache_size:當客戶端斷開以後,服務器處理此客戶的線程將會緩存起來以響應下一個客戶而不是銷燬(前提是緩存數未達上限) 便可以從新利用保存在緩存中線程的數量,當斷開鏈接時若是緩存中還有空間,那麼客戶端的線程將被放到緩存中,若是線程從新被請求,那麼請求將從緩存中讀取,若是緩存中是空的或者是新的請求,那麼這個線程將被從新建立,若是有不少新的線程,增長這個值能夠改善系統性能。 thread_cache_size大小的設置: 若是是短鏈接,適當設置大一點,由於短鏈接每每須要不停建立,不停銷燬,若是大一點,鏈接線程都處於取用狀態,不須要從新建立和銷燬,因此對性能確定是比較大的提高。 對於長鏈接,不能保證鏈接的穩定性,因此設置這參數仍是有必定必要,可能鏈接池的問題,會致使鏈接數據庫的不穩定性,也會出現頻繁的建立和銷燬,但這個狀況比較少,若是是長鏈接,能夠設置成小一點,通常在50-100左右。 物理內存設置規則:經過比較Connections 和 Threads_created 狀態的變量,能夠看到這個變量的做用。(-->表示要調整的值) 根據物理內存設置規則以下: 1G ---> 8 2G ---> 16 3G ---> 32 >3G ---> 64 查詢thread_cache_size設置 show variables like 'thread_cache_size'; 優化方法: 一、mysql> set global thread_cache_size=16 二、編輯/etc/my.cnf 更改/添加 thread_concurrency = 16
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) | 單精度 <br/> 浮點數值 |
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) | 雙精度 <br/> 浮點數值 |
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類型,有相同的最大長度和存儲需求。
建立MySQL數據表須要如下信息:
表名
表字段名
定義每一個表字段
語法
如下爲建立MySQL數據表的SQL通用語法:python
CREATE TABLE table_name (column_name column_type);
如下例子中咱們將在blog數據庫中建立數據表author、article、tag以及article和tag的關聯表article_tag
建立author表:mysql
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表:sql
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表:express
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表結構:django
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字段。
DROP TABLE IF EXISTS article_tag;
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 | +----+------------+--------+
MySQL 數據庫使用SQL SELECT語句來查詢數據。
你能夠經過 mysql> 命令提示窗口中在數據庫中查詢數據,或者經過PHP腳原本查詢數據。
語法
如下爲在MySQL數據庫中查詢數據通用的 SELECT 語法:
SELECT column_name,column_name FROM table_name [WHERE Clause] [OFFSET M ][LIMIT N]
實例
如下實例將返回數據表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各類拽 | | 嘻哈 | 中國有嘻哈 | | 嚴肅 | 你這輩子就是吃了太嚴肅的虧 | +--------------+----------------------------+
咱們知道從 MySQL 表中使用 SQL SELECT 語句來讀取數據。
如需有條件地從表中選取數據,可將 WHERE 子句添加到 SELECT 語句中。
語法
如下是 SQL SELECT 語句使用 WHERE 子句從數據表中讀取數據的通用語法:
SELECT field1, field2,...fieldN FROM table_name1, table_name2... [WHERE condition1 [AND [OR]] condition2.....
如下爲操做符列表,可用於 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 | +----+-------+------------+-----------+---------------------+
若是咱們須要修改或更新 MySQL 中的數據,咱們可使用 SQL UPDATE 命令來操做。
語法
如下是 UPDATE 命令修改 MySQL 數據表數據的通用 SQL 語法:
UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause]
當你須要更新數據表中指定行的數據時 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)
你可使用 SQL 的 DELETE FROM 命令來刪除 MySQL 數據表中的記錄。
你能夠在 mysql> 命令提示符或 PHP 腳本中執行該命令。
語法
如下是 SQL DELETE 語句從 MySQL 數據表中刪除數據的通用語法:
DELETE FROM table_name [WHERE Clause]
當你想刪除數據表中指定的記錄時 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)
咱們知道在 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'
實例
插入幾條數據:
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)
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];
參數
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)
咱們知道從 MySQL 表中使用 SQL SELECT 語句來讀取數據。
若是咱們須要對讀取的數據進行排序,咱們就可使用 MySQL 的 ORDER BY 子句來設定你想按哪一個字段哪一種方式來進行排序,再返回搜索結果。
語法
如下是 SQL SELECT 語句使用 ORDER BY 子句將查詢數據排序後再返回數據:
SELECT field1, field2,...fieldN table_name1, table_name2... ORDER BY field1, [field2...] [ASC [DESC]]
實例
嘗試如下實例,結果將按升序及降序排列。
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)
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)
在真正的應用中常常須要從多個數據表中讀取數據。下面將向你們介紹如何使用 MySQL 的 JOIN 在兩個或多個表中查詢數據。
你能夠在 SELECT, UPDATE 和 DELETE 語句中使用 Mysql 的 JOIN 來聯合多表查詢。
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)
先記錄到這了。