1 創建和操縱表(CREATE)
1.1 創建表CREATE
利用CREATE TABLE創建表,需給出以下信息:
- 新表的名字,在關鍵字CREATE TABLE之后給出。
- 表列的名字和定義,用逗號分隔。
- 有的DBMS還要求指定表的位置。
創建產品Products表:
CREATE TABLE Products
(
prod_id char(10) NOT NULL ,
vend_id char(10) NOT NULL ,
prod_name char(255) NOT NULL ,
prod_price decimal(8,2) NOT NULL ,
prod_desc text NULL
);
添加默認值的時候,使用關鍵字DEFAULT。
創建訂單明細OrderItems表:
CREATE TABLE OrderItems
(
order_num int NOT NULL ,
order_item int NOT NULL ,
prod_id char(10) NOT NULL ,
quantity int NOT NULL DEFAULT 1,
item_price decimal(8,2) NOT NULL
);
1.2 更新表ALTER
利用ALTER TABLE更新表,要考慮:
- 理想情況下,不要在表中包含數據的時候對其進行更新,應該在創建表的時候,考慮未來的擴展性,避免對表的結構做大改動。
- 所有的DBMS都允許對現有表增加列,不過對所增加列的數據類型(以及NULL和DEFAULT的使用)有所限制。
- 多數DBMS允許重命名表中的列,不允許刪除或更改表中的列。
給供應商Vendors表添加vend_phone列:
ALTER TABLE Vendors
ADD vend_phone CHAR(20);
刪除供應商Vendors表的vend_phone列:
ALTER TABLE Vendors
DROP COLUMN vend_phone;
2 插入數據(INSERT)
2.1 數據插入
INSERT用來將行插入(或添加)到數據庫表。
插入有幾種方式:
- 插入完整的行。
- 插入行的一部分。
- 插入某些查詢的結果。
2.2 插入完整的行
INSERT指定表名和插入到新行中的值。
INSERT INTO Customers
VALUES('1000000006','Toy Land','123 Any Street',
'New York','NY','11111','USA',NULL,NULL);
插入數據時,各列必須以它們在表定義中出現的次序填充。
上面的SQL語句高度依賴于表中列的定義次序,還依賴于其容易獲得的次序信息。即使可以得到這種次序信息,也不能保證各列在下一次表結構變動后保持完全相同的次序。因此,編寫依賴于特定列次序的SQL語句是很不安全的。
實際上,在插入數據的時候,最好給出填充列的順序。
INSERT INTO Customers(cust_id,cust_contact,cust_email,
cust_name,cust_address,cust_city,
cust_state,cust_zip)
VALUES('1000000006',NULL,NULL,'Toy Land','123 Any Street',
'New York','NY','11111');
注意:不管使用哪種INSERT語法,VALUES的數目都必須正確。
2.3 插入部分行
插入部分行,表示可以只給某些列提供值,其他列不提供值。
INSERT INTO Customers(cust_id,cust_name,cust_address,
cust_city,cust_state,cust_zip)
VALUES('1000000006','Toy Land','123 Any Street',
'New York','NY','11111');
省略的列必須滿足以下某個條件:
- 該列定義為允許NULL值(無值或空值)。
- 在表定義中給出默認值。這表示如果不給出值,將使用默認值。
2.4 插入檢索出的數據
INSERT可以將SELECT語句的查詢結果插入表中,這就是所謂的INSERT SELECT。它由一條INSERT語句和一條SELECT語句組成。
假如想把另一個表中的顧客列合并到Customers表中。
INSERT INTO Customers(cust_id,cust_contact,cust_email,
cust_name,cust_address,cust_city,
cust_state,cust_zip,cust_country)
SELECT cust_id,cust_contact,cust_email,cust_name,cust_address,
cust_city,cust_state,cust_zip,cust_country
FROM CustNew;
INSERT SELECT中SELECT語句可以包含WHERE子句,以過濾插入的數據。
INSERT通常只插入一行,需要插入多行,必須執行多個INSERT語句。INSERT SELECT是個例外,它可以用一條INSERT插入多行,不管SELECT語句返回多少行,都將被INSERT插入。
2.5 從一個表復制到另一個表
有一種數據插入不使用INSERT語句。要將一個表的內容復制到一個全新的表(運行中創建的表),可以使用SELECT INTO語句。
MariaDB、MySQL、Oracle、PostgreSQL和SQLite的語法如下:
CREATE TABLE CustCopy AS SELECT * FROM Customers;
在使用SELECT INTO時,需要知道的事情:
- 任何SELECT選項和子句都可以使用,包括WHERE和GROUP BY。
- 可利用聯結從多個表插入數據。
- 不管從多少個表中檢索數據,數據都只能插入到一個表中。
3 更新和刪除數據(UPDATE、DELETE)
3.1 更新數據UPDATE
兩種使用UPDATE的方式:
- 更新表中的特定行。
- 更新表中的所有行。
基本的UPDATE語句由三部分組成:
- 要更新的表。
- 列名和它們的新值。
- 確定要更新哪些行的過濾條件。
UPDATE 表名
SET key1 = value1, key2 = value2
WHERE 滿足條件、過濾條件
顧客ID為1000000005現在有了Email,需要更新他的記錄。
UPDATE Customers
SET cust_email = 'kim@thetoystore.com'
WHERE cust_id = '1000000005';
更新多個列:
UPDATE Customers
SET cust_contact = 'Sam Roberts',
cust_email = 'sam@toyland.com'
WHERE cust_id = '1000000006';
要刪除某個列的值,可設置它為NULL(加入表定義允許NULL值)。
UPDATE Customers
SET cust_email = NULL
WHERE cust_id = '1000000005';
注意:UPDATE語句也可使用子查詢,使得能用SELECT語句檢索出的數據更新列數據。
3.2 刪除數據DELETE
兩種使用DELETE的方式:
- 從表中刪除特定的行。
- 從表中刪除所有行。
基本的DELETE語句由兩部分組成:
- 要刪除的表。
- 確定要刪除哪些行的過濾條件。
DELETE FROM 表名
WHERE 滿足條件、過濾條件
DELETE FROM Customers
WHERE cust_id = '1000000006';
DELETE不需要列名或通配符,刪除的是整行而不是刪除列。要刪除指定的列,可以使用UPDATE語句。
DELETE語句從表中刪除行,甚至是刪除表中的所有行,但是,DELETE不刪除表本身。
如果想從表中刪除所有行,不要使用DELETE。可使用TRUNCATE TABLE語句,它完成相同的工作,而速度更快(因為不記錄數據的變動)。
3.3 使用UPDATE和DELETE的指導原則
- 除非確實打算更新和刪除每一行,否則絕對不要使用不帶WHERE子句的UPDATE或DELETE語句。
- 在UPDATE或DELETE語句使用WHERE子句前,應該先用SELETE進行測試,保證它過濾的是正確的記錄,以防編寫的WHERE子句不正確。
- 增加DBMS更新和刪除數據庫的權限,防止執行不帶WHERE子句的UPDATE或DELETE語句。
如果您發現文中有不清楚或者有問題的地方,請在下方評論區留言,我會根據您的評論,更新文中相關內容,謝謝!