MySQL語法速查1:基礎命令篇

[TOC]mysql


1.1. 關於 SQL

SQL 是 Structure Query Language(結構化查詢語言)的縮寫,是關係型數據庫的基本語言,由 IBM 在 20 世紀 70 年代開發出來,做爲 IBM 關係數據庫原型 System R 的原型關係語言,實現了關係數據庫中的信息檢索。sql

20 世紀 80 年代初,美國國家標準局(ANSI)開始着手製做 SQL 標準,並於 1986 年完成,被叫作 SQL-86。數據庫

SQL 標準幾經修改,日趨完善,大多數關係型數據庫系統都支持,而 (My)SQL 是在標準 SQL 的基礎上進行了擴展。函數

1.2. SQL 分類

  • DDL(Data Definition Language):數據定義語句
    • 主要用於操做數據庫對象
    • 經常使用關鍵字 create、drop、alter等;
  • DML(Data Manipulation Language):數據操做語句
    • 主要用於操做數據庫記錄;
    • 經常使用關鍵字 insert、delete、update、select等;
  • DCL(Data Control Language):數據控制語句
    • 主要用於控制數據的訪問權限
    • 經常使用關鍵字 grant、revoke等。

1.3. DDL

1.3.1. 建立數據庫

CREATE DATABASE db_name;

1.3.2. 刪除數據庫

DROP DATABASE db_name;

1.3.3. 建立表

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

說明:命令行

  • field1_name 字段名,建議如下劃線分隔單詞,如 update_at
  • field1_type 字段類型
    • int、char、varchar、float、decimal、datatime等。
    • 數值型的字段後跟括號,用於設置字段的顯示寬度,如 int(11)
      • 若是所插入數值的位數小於指定的寬度時會用空格填充;若同時使用 zerofill 約束,則會以 0 來填充。
      • 注意:顯示寬度只用於顯示,並不能限制取值範圍和佔用空間,每種數據類型的實際取值範圍決定數據可否最終插入數據庫
      • 若是插入的值超過字段的實際取值範圍,則提示:1264 - Out of range value for column xxxx
    • 字符型的字段後跟括號,用於設置可存放值的範圍,如:varcahr(5)
      • 嚴格模式下,若是插入 6 位字符串,則提示:406 - Data too long for column xxxx
      • 非嚴格模式下,若是插入 6 位字符串,則會進行截取後成功插入數據庫,而且顯示一個 warning。
  • field1_constraints 字段約束條件
    • NOT NULL 不容許爲空,默認容許爲空。
    • AUTO_INCREMENT 設置爲自增列,在 MySQL 中不管 InnoDB 引擎仍是 MyISAM 引擎的表,只能有一個自增列,而且自增列必定是索引列,不管是二級索引仍是主鍵索引。
    • DEFAULT 默認值,默認 NULL。
    • COMMENT '註釋信息' 字段註釋
    • unsigned 數值型字段無符號,默認有符合。
    • zerofill 當所插入字段值的長度沒有達到在字段類型中設置的長度時,用 0 來補全。
    • CHARACTER SET utf8mb4 設置字段的字符集。
    • COLLATE utf8mb4_bin
  • table_constraints 表約束條件
    • ENGINE=InnoDB 設置表的存儲引擎,默認 InnoDB,MySQL5.x 如下默認 MyISAM
      • MyISAM 支持全文本搜索
      • InnoDB 支持事務處理
      • MEMORY 相似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;

1.3.4. 刪除表

DROP TABLE table_name;

-- 刪除多張表,而且刪除以前先判斷是否存在
DROP TABLE IF EXISTS table1_name,table2_name,.....;

1.3.5. 修改表

注意 ⚠️:orm

  1. 關鍵字 CHANGEFIRST | AFTER COLUMN 屬於 MySQL 在標準 SQL 上的擴展,並不必定適用於其它數據庫。對象

  2. 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],其中:

    • ADD 新增的字段默認在表的最後位置;
    • CHANGE 或 MODIFY 默認不改變字段的位置。
  • 更改表名

    ALTER TABLE table_name RENAME [TO] new_table_name;

1.3.6. 修改表-外鍵

-- 添加
ALTER TABLE table1 ADD CONSTRAINT fk_table1_table2 FOREIGN KEY (table1) REFERENCES table2 (id);

-- 刪除
ALTER TABLE table1 DROP FOREIGN KEY fk_table1_table2;

1.3.7. 修改表-索引

這裏只介紹了經過修改表結構的方式建立索引,此外還有其它兩種方式(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;

1.4. DML

1.4.1. 新增記錄(增)

-- 插入一條
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 裏值的順序須要與表中的字段順序保持一致;
  • 若是待插入的數據,不包含如下類型的字段,能夠不用寫
    • 可空:自動設置爲 NULL;
    • 有默認值:自動設置爲默認值;
    • 自增:自動設置爲下一個自增值。

1.4.2. 刪除記錄(刪)

DELETE FROM table_name [WHERE condition];

-- 一次刪除多張表
DELETE t1,t2,... FROM table1 t1,table2 t2,... [WHERE condition];

1.4.3. 更新記錄(改)

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

1.4.4. 查詢記錄(查)

  • 基本

    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], ...] 排序
      • ASC 升序(默認)
      • DESC 降序
    • [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=!=EXISTSNOT 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,去除重複記錄後的結果。

1.5. DCL

1.5.1. 授予權限

GRANT select,insert ON db1.* TO 'user1'@'localhost' IDENTIFIED BY '123';

1.5.2. 收回權限

REVOKE insert ON db1.* FROM 'user1'@'localhost';

1.6. 附錄

1.6.1. 鏈接數據庫

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

1.6.2. 如何使用系統幫助

在命令行模式下,使用 ? contents 命令查看對應分類的幫助信息。

如:

-- 查看 show 相關的全部命令等
mysql> ? show

1.6.3. 什麼是元數據信息

元數據指數據的數據,好比表名、列名、列類型、索引名等表的各類屬性名稱。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; 的結果。
相關文章
相關標籤/搜索