DDL 是數據定義語言的縮寫,簡單來說,就是對數據庫內部的對象進行創建、刪除、修改的操作語言。它和 DML 語言的最大區別是 DML 只是對表內部數據的操作,而不涉及到表的定義、結構的修改,更不會涉及到其他對象。DDL 語句更多的被數據庫管理員(DBA)所使用,一般的開發人員很少使用。
下面通過一些例子來介紹 MySQL 中常用 DDL 語句的使用方法。
1.創建數據庫
啟動 MySQL 服務之后,輸入以下命令連接到 MySQL 服務器:
[mysql@db3 ~]$ mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 7344941 to server version: 5.1.9-beta-log
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
在以上命令行中,mysql 代表客戶端命令,-u 后面跟連接的數據庫用戶,-p 表示需要輸入密碼。如果數據庫設置正常,並輸入正確的密碼,將看到上面一段歡迎界面和一個 mysql>提示符。在歡迎界面中介紹了以下幾部分內容。
命令的結束符:用;或者\g 結束。
客戶端的連接 ID:這個數字記錄了 MySQL 服務到目前為止的連接次數,每個新連接都會自動加 1,本例中是 7344941。
MySQL 服務器的版本:本例中是“5.1.9-beta-log”,說明是 5.1.9 的測試版,如果是標准版,則會用 Standard 代替 Beta。
通過“help;”或者“\h”命令來顯示幫助內容:通過“\c”命令來清除命令行 buffer。
在 mysql>提示符后面輸入所要執行的的 SQL 語句,每個 SQL 語句以分號或者\g 結束,按回車鍵執行。
因為所有的數據都存儲在數據庫中,因此需要學習的第一個命令是創建數據庫,語法如下所示:
CREATE DATABASE dbname
例如,創建數據庫 test1,命令執行如下:
mysql> create database test1;
Query OK, 1 row affected (0.00 sec)
可以發現,執行完創建命令后,下面有一行提示“Query OK, 1 row affected (0.00 sec)”,這段提示可以分為 3 部分,“Query OK”表示上面的命令執行成功,讀者可能奇怪,又不是執行查詢操作,為什么顯示查詢成功?其實這是 MySQL 的一個特點,所有的 DDL 和 DML(不包括 SELECT)操作執行成功后都顯示“Query OK”,這里理解為執行成功就可以了;“1 row
affected”表示操作只影響了數據庫中一行的記錄,“0.00 sec”則記錄了操作執行的時間。這個時候,如果需要知道系統中都存在哪些數據庫,可以用以下命令來查看:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| cluster |
| mysql |
| test |
| test1 |
+--------------------+
5 rows in set (0.00 sec)
可以發現,在上面的列表中除了剛剛創建的 test1 外,還有另外 4 個數據庫,它們都是安裝MySQL 時系統自動創建的,其各自功能如下。
information_schema:主要存儲了系統中的一些數據庫對象信息。比如用戶表信息、列信息、權限信息、字符集信息、分區信息等。
cluster:存儲了系統的集群信息。
mysql:存儲了系統的用戶權限信息。
test:系統自動創建的測試數據庫,任何用戶都可以使用。
在查看了系統中已有的數據庫后,可以用如下命令選擇要操作的數據庫:USE dbname
然后再用以下命令來查看 test1 數據庫中創建的所有數據表:mysql>show tables;
2.刪除數據庫
刪除數據庫的語法很簡單,如下所示:drop database dbname;
例如,要刪除 test1 數據庫可以使用以下語句:mysql> drop database test1;
注意:數據庫刪除后,下面的所有表數據都會全部刪除,所以刪除前一定要仔細檢查並做好相應備份。
3.創建表
在數據庫中創建一張表的基本語法如下:
CREATE TABLE tablename (
column_name_1 column_type_1 constraints,
column_name_2 column_type_2 constraints ,
……
column_name_n column_type_n constraints)
因為 MySQL 的表名是以目錄的形式存在於磁盤上,所以表名的字符可以用任何目錄名允許的字符。column_name 是列的名字,column_type 是列的數據類型,contraints 是這個列的約束條件。
例如,創建一個名稱為 emp 的表。表中包括 3 個字段,ename(姓名),hiredate(雇用日期)、sal(薪水),字段類型分別為 varchar(10)、date、int(2):
mysql> create table emp(
ename varchar(10),
hiredate date,
sal decimal(10,2),deptno int(2));
Query OK, 0 rows affected (0.02 sec)
表創建完畢后,如果需要查看一下表的定義,可以使用如下命令:DESC tablename
雖然 desc 命令可以查看表定義,但是其輸出的信息還是不夠全面,為了查看更全面的表定義信息,有時就需要通過查看創建表的 SQL 語句來得到,可以使用如下命令實現:mysql> show create table emp \G;
*************************** 1. row ***************************
Table: emp
Create Table: CREATE TABLE 'emp' (
'ename' varchar(20) DEFAULT NULL,
'hiredate' date DEFAULT NULL,
'sal' decimal(10,2) DEFAULT NULL,
'deptno' int(2) DEFAULT NULL,
KEY idx_emp_ename' ('ename')
) ENGINE=InnoDB DEFAULT CHARSET=gbk
1 row in set (0.02 sec)
ERROR:
No query specified
mysql>
從上面表的創建 SQL 語句中,除了可以看到表定義以外,還可以看到表的engine(存儲引擎)和charset(字符集)等信息。“\G”選項的含義是使得記錄能夠按照字段豎着排列,對於內容比較長的記錄更易於顯示。
4.刪除表
表的刪除命令如下:DROP TABLE tablename
例如,要刪除數據庫 emp 可以使用以下命令:mysql> drop table emp;
5.修改表(重要)
對於已經創建好的表,尤其是已經有大量數據的表,如果需要對表做一些結構上的改變,我們可以先將表刪除(drop),然后再按照新的表定義重建表。這樣做沒有問題,但是必然要做一些額外的工作,比如數據的重新加載。而且,如果有服務在訪問表,也會對服務產生影響。因此,在大多數情況下,表結構的更改一般都使用 alter table語句,以下是一些常用的命令。
(1) 修改表類型,語法如下:
ALTER TABLE tablename MODIFY [COLUMN] column_definition [FIRST | AFTER col_name]
例如,修改表 emp 的 ename 字段定義,將 varchar(10)改為 varchar(20):mysql> alter table emp modify ename varchar(20);
(2) 增加表字段,語法如下:
ALTER TABLE tablename ADD [COLUMN] column_definition [FIRST | AFTER col_name]
例如,表 emp 上新增加字段 age,類型為 int(3):mysql> alter table emp add column age int(3);
(3)刪除表字段,語法如下:
ALTER TABLE tablename DROP [COLUMN] col_name
例如,將字段 age 刪除掉:mysql> alter table emp drop column age;
(4)字段改名,語法如下:
ALTER TABLE tablename CHANGE [COLUMN] old_col_name column_definition [FIRST|AFTER col_name]
例如,將 age 改名為 age1,同時修改字段類型為 int(4):mysql> alter table emp change age age1 int(4) ;
注意:change 和 modify 都可以修改表的定義,不同的是 change 后面需要寫兩次列名,不方便。但是 change 的優點是可以修改列名稱,modify 則不能。
(5)修改字段排列順序。
前面介紹的的字段增加和修改語法(ADD/CNAHGE/MODIFY)中,都有一個可選項first|after column_name,這個選項可以用來修改字段在表中的位置,默認 ADD 增加的新字段是加在表的最后位置,而 CHANGE/MODIFY 默認都不會改變字段的位置。
例如,將新增的字段 birth date 加在 ename 之后:mysql> alter table emp add birth date after ename;
修改字段 age,將它放在最前面:mysql> alter table emp modify age int(3) first;
注意:CHANGE/FIRST|AFTER COLUMN 這些關鍵字都屬於 MySQL 在標准 SQL 上的擴展,在其他數據庫上不一定適用。
(6)表改名,語法如下:ALTER TABLE tablename RENAME [TO] new_tablename
例如,將表 emp 改名為 emp1,命令如下:mysql> alter table emp rename emp1;
DML 語句:
DML 操作是指對數據庫中表記錄的操作,主要包括表記錄的插入(insert)、更新(update)、刪除(delete)和查詢(select),是開發人員日常使用最頻繁的操作。下面將依次對它們進行介紹。
1.插入記錄
表創建好后,就可以往里插入記錄了,插入記錄的基本語法如下:
INSERT INTO tablename (field1,field2,……fieldn) VALUES(value1,value2,……valuesn);
例如,向表 emp 中插入以下記錄:ename 為 zzx1,hiredate 為 2000-01-01,sal 為 2000,deptno
為 1,命令執行如下:
mysql> insert into emp (ename,hiredate,sal,deptno) values('zzx1','2000-01-01','2000',1);
Query OK, 1 row affected (0.00 sec)
也可以不用指定字段名稱,但是 values 后面的順序應該和字段的排列順序一致:
mysql> insert into emp values('lisa','2003-02-01','3000',2);
Query OK, 1 row affected (0.00 sec)
對於含可空字段、非空但是含有默認值的字段、自增字段,可以不用在 insert 后的字段列表
里面出現,values 后面只寫對應字段名稱的 value,這些沒寫的字段可以自動設置為 NULL、
默認值、自增的下一個數字,這樣在某些情況下可以大大縮短 SQL 語句的復雜性。
例如,只對表中的 ename 和 sal 字段顯式插入值:
mysql> insert into emp (ename,sal) values('dony',1000);
Query OK, 1 row affected (0.00 sec)
來查看一下實際插入值:
mysql> select * from emp;
+--------+------------+---------+--------+
| ename | hiredate | sal | deptno |
+--------+------------+---------+--------+
| zzx | 2000-01-01 | 100.00 | 1 |
| lisa | 2003-02-01 | 400.00 | 2 |
| bjguan | 2004-04-02 | 100.00 | 1 |
|dony | NULL | 1000.00 | NULL|
+--------+------------+---------+--------+
果然,設置為可空的兩個字段都顯示為 NULL。
在 MySQL 中,insert 語句還有一個很好的特性,可以一次性插入多條記錄,語法如下:
INSERT INTO tablename (field1, field2,……fieldn)
VALUES
(record1_value1, record1_value2,……record1_valuesn),
(record2_value1, record2_value2,……record2_valuesn),
……
(recordn_value1, recordn_value2,……recordn_valuesn)
;