[TOC]mysql
SQL 是 Structure Query Language(結構化查詢語言)的縮寫,是關係型數據庫的基本語言,由 IBM 在 20 世紀 70 年代開發出來,做爲 IBM 關係數據庫原型 System R 的原型關係語言,實現了關係數據庫中的信息檢索。sql
20 世紀 80 年代初,美國國家標準局(ANSI)開始着手製做 SQL 標準,並於 1986 年完成,被叫作 SQL-86。數據庫
SQL 標準幾經修改,日趨完善,大多數關係型數據庫系統都支持,而 (My)SQL 是在標準 SQL 的基礎上進行了擴展。函數
CREATE DATABASE db_name;
DROP DATABASE db_name;
CREATE TABLE table_name( field1_name field1_type [field1_constraints], field2_name field2_type [field2_constraints], field3_name field3_type [field3_constraints], ... [PRIMARY KEY ( field1_name ),] [INDEX `idx_field1_name`(`field1_name`) USING BTREE COMMENT '',] ... ) [table_constraints];
說明:命令行
update_at
。int(11)
。
zerofill
約束,則會以 0 來填充。1264 - Out of range value for column xxxx
varcahr(5)
406 - Data too long for column xxxx
。NOT NULL
不容許爲空,默認容許爲空。AUTO_INCREMENT
設置爲自增列,在 MySQL 中不管 InnoDB 引擎仍是 MyISAM 引擎的表,只能有一個自增列,而且自增列必定是索引列,不管是二級索引仍是主鍵索引。DEFAULT
默認值,默認 NULL。COMMENT '註釋信息'
字段註釋unsigned
數值型字段無符號,默認有符合。zerofill
當所插入字段值的長度沒有達到在字段類型中設置的長度時,用 0 來補全。CHARACTER SET utf8mb4
設置字段的字符集。COLLATE utf8mb4_bin
ENGINE=InnoDB
設置表的存儲引擎,默認 InnoDB,MySQL5.x 如下默認 MyISAM。
DEFAULT CHARSET=utf8
設置默認字符集AUTO_INCREMENT=10
設置自增列的開始位置,查看錶中自增字段的下一個值,使用 SHOW TABLE STATUS LIKE 'table_name';
獲取字段 Auto_increment 的值。COMMENT '註釋信息'
表的註釋信息查看錶的定義code
DESC table_name; -- 或 SHOW CREATE TABLE table_name \G;
DROP TABLE table_name; -- 刪除多張表,而且刪除以前先判斷是否存在 DROP TABLE IF EXISTS table1_name,table2_name,.....;
注意 ⚠️:orm
關鍵字
CHANGE
和FIRST
|AFTER COLUMN
屬於 MySQL 在標準 SQL 上的擴展,並不必定適用於其它數據庫。對象field_definition 至少包含字段名和字段類型。排序
修改表類型索引
ALTER TABLE table_name MODIFY [COLUMN] field_definition [FIRST | AFTER field_name];
增長表字段
ALTER TABLE table_name ADD [COLUMNM] field_definition [FIRST | AFTER field_name];
刪除表字段
ALTER TABLE table_name DROP [COLUMN] field_name;
修改字段名
ALTER TABLE table_name CHANGE [COLUMN] old_field_name field_definition [FIRST | AFTER field_name];
修改字段排列順序
使用前面的可選參數 [FIRST | AFTER field_name]
,其中:
更改表名
ALTER TABLE table_name RENAME [TO] new_table_name;
-- 添加 ALTER TABLE table1 ADD CONSTRAINT fk_table1_table2 FOREIGN KEY (table1) REFERENCES table2 (id); -- 刪除 ALTER TABLE table1 DROP FOREIGN KEY fk_table1_table2;
這裏只介紹了經過修改表結構的方式建立索引,此外還有其它兩種方式(CREATE INDEX
或 在 CREATE TABLE
時指定 `),詳見後續文章索引部分。
普通索引
-- 添加 ALTER TABLE table1 ADD INDEX idx_name(field1); -- 刪除 ALTER TABLE table1 DROP INDEX idx_name;
主鍵索引
-- 添加 -- 先修改要設置爲主鍵的字段:無符號、非空、自增 ALTER TABLE table1 MODIFY COLUMN `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, ADD PRIMARY KEY (`id`); -- 刪除 ALTER TABLE table1 DROP PRIMARY KEY;
惟一索引
-- 添加 ALTER table mytable ADD UNIQUE [idx_name] (field1(length)) -- 刪除 ALTER TABLE table1 DROP UNIQUE field1;
查詢表的索引
SHOW INDEX FROM table_name;
-- 插入一條 INSERT INFO table_name(field1,field2,...,fieldn) VALUES(val1,val2,...,valn); -- 插入多條 INSERT INTO table_name(field1,field2,...,fieldn) VALUES (record1_val1,record1_val2,...,record1_valn), (record2_val1,record2_val2,...,record2_valn), ... (recordn_val1,recordn_val2,...,recordn_valn);
field1,field2,...,fieldn
能夠不用寫,可是後面 VALUES
裏值的順序須要與表中的字段順序保持一致;DELETE FROM table_name [WHERE condition]; -- 一次刪除多張表 DELETE t1,t2,... FROM table1 t1,table2 t2,... [WHERE condition];
UPDATE table_name SET field1=val1,field2=val2,...,fieldn=valn [WHERE condition]; -- 一次更新多個表 UPDATE table1 a,table2 b, tablen n SET a.field1=val1,...,n.fieldn=valn [WHERE condition];
基本
SELECT * FROM table_name [WHERE condition] [ORDER BY field1 [DESC|ASC], field2 [DESC|ASC], ...] [LIMIT offset_start,row_count];
說明:
[WHERE condition]
過濾條件[ORDER BY field1 [DESC|ASC], field2 [DESC|ASC], ...]
排序
[LIMIT offset_start,row_count]
限制去重查詢
SELECT distinct field1 FROM table_name [WHERE condition];
聚合(彙總統計)
SELECT [field1,field2,...] func_name FROM table_name [WHERE condition] [GROUP BY field1,field2,...] [WITH ROLLUIP] [HAVING condition]
說明:
func_name
聚合函數,經常使用:sum 求和、count(*) 記錄數、max 最大值、min 最小值。[WHERE condition]
聚合前按條件對結果進行過濾,應儘可能使用此過濾以減小待聚合的結果集,提升聚合效率。[GROUP BY field1,field2,...]
分類聚合字段[WITH ROLLUIP]
是否對分類聚合後的結果進行再彙總。[HAVING condition]
對聚合後的結果再進行條件過濾。內鏈接
僅獲取兩張表中互相匹配的記錄
SELECT field1,field2 FROM table1 t1,table2 t2 WHERE t1.outid=t2.outid
其中 field1,field2,...
分別存儲在兩張表中。
外鏈接
左鏈接
包含全部左邊表中的記錄,甚至是右邊表中沒有和它匹配的記錄。
SELECT field1,field2,... FROM table1 t1 LEFT JOIN table2 t2 ON t2.outid=t1.outid
右鏈接
包含全部右邊表中的記錄,甚至是右邊表中沒有和它匹配的記錄。
SELECT field1,field2,... FROM table1 t1 RIGHT JOIN table2 t2 ON t2.outid=t1.outid
子查詢
當進行查詢時,須要的條件是另外一個 select 語句的結果時將用到子查詢功能。
SELECT field1,field2,... FROM table1 WHERE outid IN( SELECT outid FROM table2 );
除了 IN,用於子查詢的關鍵字還有:NOT IN
、=
、!=
、EXISTS
、NOT EXISTS
等。
MySQL4.1 之前的版本不支持子查詢,須要用錶鏈接來實現,如:
SELECT t1.* FROM table1 t1,table2 t2 WHERE t1.outid=t2.outid
聯合(合併結果集)
SELECT * FROM table1 UNION | UNION ALL SELECT * FROM table2 ... UNION | UNION ALL SELECT * FROM tablen
說明:
UNION ALL
把結果集直接合並在一塊兒。UNION
是將 UNION ALL
的結果集執行一次 DISTINCT
,去除重複記錄後的結果。GRANT select,insert ON db1.* TO 'user1'@'localhost' IDENTIFIED BY '123';
REVOKE insert ON db1.* FROM 'user1'@'localhost';
mysql [-h127.0.0.1] [-P3306] -uroot -p[password]
參數說明:
-h
可選,數據庫地址(IP或域名),默認 127.0.0.1。-P
可選,數據庫端口號,默認 3306.-u
數據庫登陸用戶-p
數據庫登陸用戶對應的密碼示例:
$ mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 4 Server version: 5.7.24-log MySQL Community Server (GPL) Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MySQL [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec) MySQL [(none)]> exit Bye
在命令行模式下,使用 ? contents
命令查看對應分類的幫助信息。
如:
-- 查看 show 相關的全部命令等 mysql> ? show
元數據指數據的數據,好比表名、列名、列類型、索引名等表的各類屬性名稱。MySQL 5.0 以後提供來一個新的數據庫 information_schema
,用來記錄 MySQL 中的元數據信息。
show tables
顯示的各類「表」也並非實際存在的物理表,而所有是視圖。經常使用的視圖以下:
SCHEMATA
提供當前 MySQL 實例中全部的數據庫信息,對應 show databases;
的結果。TABLES
提供關於數據庫中的表信息(包括視圖),詳細表述裏某個表屬於那個 schema、表類型、表引擎、建立時間等,對應 show tables from schemaname;
的結果。COLUMNS
提供全部表中的列信息,對應 show columns from schemaname.tablename;
的結果。STATISTICS
提供關於表索引的信息,對應 show index from schemaname.tablename;
的結果。