SQL 包含以下 4 部分: 1 數據定義語言(DDL):DROP、CREATE、ALTER 等語句。 2 數據操作語言(DML):INSERT(插入)、UPDATE(修改)、DELETE(刪除)語句。 3 數據查詢語言(DQL):SELECT 語句。 4 數據控制語言(DCL): GRANT、RE ...
參考資料:C語言中文網
SQL 包含以下 4 部分: 1 數據定義語言(DDL):DROP、CREATE、ALTER 等語句。 2 數據操作語言(DML):INSERT(插入)、UPDATE(修改)、DELETE(刪除)語句。 3 數據查詢語言(DQL):SELECT 語句。 4 數據控制語言(DCL): GRANT、REVOKE、COMMIT、ROLLBACK 等語句。
MySQL之DDL(Data Definition Language): 數據定義語言:CREATE,ALERT,DROP等
DDL:操作資料庫,表(CRUD)
1、操作資料庫(CRUD)
(1)C(Create):創建資料庫
CREATE DATABASE [IF NOT EXISTS] 資料庫名 [[DEFAULT] CHARACTER SET 字元集名] [[DEFAULT] COLLATE 校對規則名]; [ ]中的內容是可選的。 語法說明如下: 資料庫名:創建資料庫的名稱。MySQL 的數據存儲區將以目錄方式表示 MySQL 資料庫,因此資料庫名稱必須符合操作系統的文件夾命名規則,不能以數字開頭,儘量要有實際意義。註意在 MySQL 中不區分大小寫。 IF NOT EXISTS:在創建資料庫之前進行判斷,只有該資料庫目前尚不存在時才能執行操作。此選項可以用來避免資料庫已經存在而重覆創建的錯誤。 [DEFAULT] CHARACTER SET:指定資料庫的字元集。指定字元集的目的是為了避免在資料庫中存儲的數據出現亂碼的情況。如果在創建資料庫時不指定字元集,那麼就使用系統的預設字元集。 [DEFAULT] COLLATE:指定字元集的預設校對規則。
eg.
mysql> CREATE DATABASE IF NOT EXISTS test -> DEFAULT CHARACTER SET utf8 -> DEFAULT COLLATE utf8_general_ci; Query OK, 1 row affected, 1 warning (0.01 sec)
(2)R(Retrieve):查詢
SHOW DATABASES [LIKE '資料庫名']; 語法說明如下: LIKE 從句是可選項,用於匹配指定的資料庫名稱。LIKE 從句可以部分匹配,也可以完全匹配。 資料庫名由單引號' '包圍。
eg.查詢全部
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | | mqcms | | mysql | | performance_schema | | phpmyadmin | | sys | | test | | test_aa | | ultrax | +--------------------+ 9 rows in set (0.00 sec)
eg.查詢某一個(我有test和test_aa兩個庫)
mysql> show databases like 'test'; +-----------------+ | Database (test) | +-----------------+ | test | +-----------------+ 1 row in set (0.00 sec)
mysql> show databases like '%test%'; +-------------------+ | Database (%test%) | +-------------------+ | dedetest | | test | | test_aa | +-------------------+ 3 rows in set (0.00 sec)
這裡的like跟模糊查詢一樣%aa%;%aa;aa%;
eg.查詢某個資料庫的創建語言
mysql> show create database test; +----------+---------------------------------------------------------------+ | Database | Create Database | +----------+---------------------------------------------------------------+ | test | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8 */ | +----------+---------------------------------------------------------------+ 1 row in set (0.00 sec)
(3)U(Update):修改
ALTER DATABASE [資料庫名] { [ DEFAULT ] CHARACTER SET <字元集名> | [ DEFAULT ] COLLATE <校對規則名>} 語法說明如下: ALTER DATABASE 用於更改資料庫的全局特性。 使用 ALTER DATABASE 需要獲得資料庫 ALTER 許可權。 資料庫名稱可以忽略,此時語句對應於預設資料庫。 CHARACTER SET 子句用於更改預設的資料庫字元集。
eg.修改資料庫test的字元集
mysql> ALTER DATABASE test -> DEFAULT CHARACTER SET gb2312 -> DEFAULT COLLATE gb2312_chinese_ci; Query OK, 1 row affected (0.02 sec) mysql> show create database test; +----------+-----------------------------------------------------------------+ | Database | Create Database | +----------+-----------------------------------------------------------------+ | test | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET gb2312 */ | +----------+-----------------------------------------------------------------+ 1 row in set (0.00 sec)
(4)D(Delete):刪除
DROP DATABASE [ IF EXISTS ] <資料庫名> 語法說明如下: <資料庫名>:指定要刪除的資料庫名。 IF EXISTS:用於防止當資料庫不存在時發生錯誤。 DROP DATABASE:刪除資料庫中的所有表格並同時刪除資料庫。使用此語句時要非常小心,以免錯誤刪除。如果要使用 DROP DATABASE,需要獲得資料庫 DROP 許可權。
註意:MySQL 安裝後,系統會自動創建名為 information_schema 和 mysql 的兩個系統資料庫,系統資料庫存放一些和資料庫相關的信息,如果刪除了這兩個資料庫,MySQL 將不能正常工作。
使用 DROP DATABASE 命令時要非常謹慎,在執行該命令後,MySQL 不會給出任何提示確認信息。DROP DATABASE 刪除資料庫後,資料庫中存儲的所有數據表和數據也將一同被刪除,而且不能恢復。因此最好在刪除資料庫之前先將資料庫進行備份。
eg.刪除資料庫test_aa;
mysql> DROP DATABASE IF EXISTS test_aa; Query OK, 0 rows affected (0.02 sec) mysql> show databases like 'test%'; +------------------+ | Database (test%) | +------------------+ | test | +------------------+ 1 row in set (0.00 sec)
2、操作數據表(CRUD)
(1)C(Create)創建表
CREATE TABLE <表名> ([表定義選項])[表選項][分區選項]; 其中,[表定義選項]的格式為: <列名1> <類型1> [,…] <列名n> <類型n> CREATE TABLE 語句的主要語法及使用說明如下: CREATE TABLE:用於創建給定名稱的表,必須擁有表CREATE的許可權。 <表名>:指定要創建表的名稱,在 CREATE TABLE 之後給出,必須符合標識符命名規則。表名稱被指定為 db_name.tbl_name,以便在特定的資料庫中創建表。無論是否有當前資料庫,都可以通過這種方式創建。在當前資料庫中創建表時,可以省略 db-name。如果使用加引號的識別名,則應對資料庫和表名稱分別加引號。例如,'mydb'.'mytbl' 是合法的,但 'mydb.mytbl' 不合法。 <表定義選項>:表創建定義,由列名(col_name)、列的定義(column_definition)以及可能的空值說明、完整性約束或表索引組成。 預設的情況是,表被創建到當前的資料庫中。若表已存在、沒有當前資料庫或者資料庫不存在,則會出現錯誤。
eg.創建一張測試表test_tbl;
欄位名稱 | 欄位類型 | 欄位備註 |
id | int(11) | ID |
name | varchar(20) | 名稱 |
age | int(11) | 年齡 |
sex | tinyint(4) | 性別0 男 1女 2 未知 |
mysql> use test; Database changed mysql> show tables; +----------------+ | Tables_in_test | +----------------+ | board | | data | +----------------+ 2 rows in set (0.01 sec) mysql> CREATE TABLE test_tbl -> ( -> id INT(11), -> name VARCHAR(20), -> age INT(11), -> sex TINYINT(4) -> ); Query OK, 0 rows affected (0.03 sec)
複製表結構:
CREATE TABLE <數據表名> like <被覆制的表名>;
eg.
mysql> CREATE TABLE test_tbl_cp like test_tbl; Query OK, 0 rows affected (0.01 sec)
(2)R(Retrieve)查看表
查看所有表:
SHOW TABLES;
eg.
mysql> show tables; +----------------+ | Tables_in_test | +----------------+ | board | | data | | test_tbl | | test_tbl_cp | +----------------+ 4 rows in set (0.00 sec)
查看表結構:
DESCRIBE <表名>; 或簡寫成: DESC <表名>; DESCRIBE/DESC 語句可以查看表的欄位信息,包括欄位名、欄位數據類型、是否為主鍵、是否有預設值等
eg.
mysql> DESC test_tbl; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(20) | YES | | NULL | | | age | int(11) | YES | | NULL | | | sex | tinyint(4) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 4 rows in set (0.00 sec) 其中,各個欄位的含義如下: Null:表示該列是否可以存儲 NULL 值。 Key:表示該列是否已編製索引。PRI 表示該列是表主鍵的一部分,UNI 表示該列是 UNIQUE 索引的一部分,MUL 表示在列中某個給定值允許出現多次。 Default:表示該列是否有預設值,如果有,值是多少。 Extra:表示可以獲取的與給定列有關的附加信息,如 AUTO_INCREMENT 等。
SHOW CREATE TABLE語句可以用來顯示創建表時的CREATE TABLE語句:
SHOW CREATE TABLE <表名>\G; 提示:使用 SHOW CREATE TABLE 語句不僅可以查看創建表時的詳細語句,而且可以查看存儲引擎和字元編碼。如果不加“\G”參數,顯示的結果可能非常混亂,加上“\G”參數之後,可使顯示的結果更加直觀,易於查看。
eg.
mysql> show create table test_tbl\G; *************************** 1. row *************************** Table: test_tbl Create Table: CREATE TABLE `test_tbl` ( `id` int(11) DEFAULT NULL, `name` varchar(20) DEFAULT NULL, `age` int(11) DEFAULT NULL, `sex` tinyint(4) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=gb2312 1 row in set (0.00 sec)
(3)U(Update)修改
ALTER TABLE <表名> [修改選項]
修改選項的語法格式如下: {
ADD COLUMN <列名> <類型> | CHANGE COLUMN <舊列名> <新列名> <新列類型> | ALTER COLUMN <列名> { SET DEFAULT <預設值> | DROP DEFAULT } | MODIFY COLUMN <列名> <類型> | DROP COLUMN <列名> | RENAME TO <新表名>
}
添加欄位:
ALTER TABLE <表名> ADD <新欄位名> <數據類型> [約束條件] [FIRST|AFTER 已存在的欄位名];
新欄位名為需要添加的欄位的名稱;FIRST 為可選參數,其作用是將新添加的欄位設置為表的第一個欄位;AFTER 為可選參數,其作用是將新添加的欄位添加到指定的已存在的欄位名的後面。
eg.在表test_tbl的name後面添加新欄位name_cp:
mysql> ALTER TABLE test_tbl ADD name_cp VARCHAR(20) AFTER name; Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> desc test_tbl; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(20) | YES | | NULL | | | name_cp | varchar(20) | YES | | NULL | | | age | int(11) | YES | | NULL | | | sex | tinyint(4) | YES | | NULL | | +---------+-------------+------+-----+---------+-------+ 5 rows in set (0.00 sec)
修改欄位名稱:
ALTER TABLE <表名> CHANGE <舊欄位名> <新欄位名> <新數據類型>; 其中,舊欄位名指修改前的欄位名;新欄位名指修改後的欄位名;新數據類型指修改後的數據類型,如果不需要修改欄位的數據類型,可以將新數據類型設置成與原來一樣,但數據類型不能為空。
eg.修改name的名稱改為names
mysql> ALTER TABLE test_tbl -> CHANGE name names VARCHAR(20); Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> desc test_tbl; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | names | varchar(20) | YES | | NULL | | | name_cp | varchar(20) | YES | | NULL | | | age | int(11) | YES | | NULL | | | sex | tinyint(4) | YES | | NULL | | +---------+-------------+------+-----+---------+-------+ 5 rows in set (0.00 sec)
修改/刪除欄位預設值:
ALTER TABLE <表名> ALTER COLUMN <列名> { SET DEFAULT <預設值> | DROP DEFAULT }
eg.將欄位sex的預設值改為2
mysql> ALTER TABLE test_tbl ALTER sex SET DEFAULT 2; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> desc test_tbl; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | names | varchar(20) | YES | | NULL | | | name_cp | varchar(50) | YES | | NULL | | | age | int(11) | YES | | NULL | | | sex | tinyint(4) | YES | | 2 | | +---------+-------------+------+-----+---------+-------+ 5 rows in set (0.00 sec)
修改欄位類型:
ALTER TABLE <表名> MODIFY <欄位名> <數據類型> 其中,表名指要修改數據類型的欄位所在表的名稱,欄位名指需要修改的欄位,數據類型指修改後欄位的新數據類型。
eg.修改name_cp的數據類型varchar(50)
mysql> ALTER TABLE test_tbl -> MODIFY name_cp varchar(50); Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> desc test_tbl; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(20) | YES | | NULL | | | name_cp | varchar(50) | YES | | NULL | | | age | int(11) | YES | | NULL | | | sex | tinyint(4) | YES | | NULL | | +---------+-------------+------+-----+---------+-------+ 5 rows in set (0.00 sec)
刪除欄位:
ALTER TABLE <表名> DROP <欄位名>; 其中,欄位名指需要從表中刪除的欄位的名稱。
eg.刪除sex欄位
mysql> ALTER TABLE test_tbl -> DROP sex; Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> desc test_tbl; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | names | varchar(20) | YES | | NULL | | | name_cp | varchar(50) | YES | | NULL | | | age | int(11) | YES | | NULL | | +---------+-------------+------+-----+---------+-------+ 4 rows in set (0.00 sec)
修改表名:
ALTER TABLE <舊表名> RENAME [TO] <新表名>;
其中,TO
為可選參數,使用與否均不影響結果。
eg.修改表名test_tbl改為test_tb;
mysql> ALTER TABLE test_tbl -> RENAME TO test_tb; Query OK, 0 rows affected (0.02 sec) mysql> show tables; +----------------+ | Tables_in_test | +----------------+ | board | | data | | test_tb | | test_tbl_cp | +----------------+ 4 rows in set (0.00 sec)
(4)D(Delete)刪除表
DROP TABLE [IF EXISTS] 表名1 [ ,表名2, 表名3 ...]