DDL 語句


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)

;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM