本筆記為阿里云天池龍珠計劃SQL訓練營的學習內容,鏈接為:https://tianchi.aliyun.com/specials/promotion/aicampsql
一、SQL陳述句分類
根據對 RDBMS 賦予的指令種類的不同,SQL 陳述句可以分為以下三類.
DDL
DDL(Data Definition Language,資料定義語言) 用來創建或者洗掉存盤資料用的資料庫以及資料庫中的表等物件。DDL 包含以下幾種指令。
CREATE : 創建資料庫和表等物件
DROP : 洗掉資料庫和表等物件
ALTER : 修改資料庫和表等物件的結構
DML
DML(Data Manipulation Language,資料操縱語言) 用來查詢或者變更表中的記錄。DML 包含以下幾種指令。
SELECT :查詢表中的資料
INSERT :向表中插入新資料
UPDATE :更新表中的資料
DELETE :洗掉表中的資料
DCL
DCL(Data Control Language,資料控制語言) 用來確認或者取消對資料庫中的資料進行的變更。除此之外,還可以對 RDBMS 的用戶是否有權限操作資料庫中的物件(資料庫表等)進行設定。DCL 包含以下幾種指令。
COMMIT : 確認對資料庫中的資料進行的變更
ROLLBACK : 取消對資料庫中的資料進行的變更
GRANT : 賦予用戶操作權限
REVOKE : 取消用戶的操作權限
實際使用的 SQL 陳述句當中有 90% 屬于 DML
二、基礎陳述句
1.資料庫的創建( CREATE DATABASE 陳述句)
CREATE DATABASE < 資料庫名稱 > ;
exp:CREATE DATABASE shop;
2.表的創建( CREATE TABLE 陳述句)
CREATE TABLE < 表名 >
( < 列名 1> < 資料型別 > < 該列所需約束 > ,
< 列名 2> < 資料型別 > < 該列所需約束 > ,
< 列名 3> < 資料型別 > < 該列所需約束 > ,
< 列名 4> < 資料型別 > < 該列所需約束 > ,
.
.
.
< 該表的約束 1> , < 該表的約束 2> ,……);
exp:CREATE TABLE product(
product_id CHAR(4) NOT NULL,
product_name VARCHAR(100) NOT NULL,
product_type VARCHAR(32) NOT NULL,
sale_price INTEGER,
purchase_price INTEGER,
regist_date DATE,
PRIMARY KEY(product_id)
) ;
注意:
2.1.命名規則
2.1.1只能使用半角英文字母、數字、下劃線(_)作為資料庫、表和列的名稱
2.1.2名稱必須以半角英文字母開頭
2.2.資料型別的指定
資料庫創建的表,所有的列都必須指定資料型別,每一列都不能存盤與該列資料型別不符的資料。
四種最基本的資料型別
2.2.1INTEGER 型
用來指定存盤整數的列的資料型別(數字型),不能存盤小數。
2.2.2CHAR 型
用來存盤定長字串,當列中存盤的字串長度達不到最大長度的時候,使用半角空格進行補足,由于會浪費存盤空間,所以一般不使用。
2.2.3VARCHAR 型
用來存盤可變長度字串,定長字串在字符數未達到最大長度時會用半角空格補足,但可變長字串不同,即使字符數未達到最大長度,也不會用半角空格補足。
2.2.4DATE 型
用來指定存盤日期(年月日)的列的資料型別(日期型)
2.3.約束的設定
約束是除了資料型別之外,對列中存盤的資料進行限制或者追加條件的功能。
2.3.1NOT NULL是非空約束,即該列必須輸入資料。
2.3.2PRIMARY KEY是主鍵約束,代表該列是唯一值,可以通過該列取出特定的行的資料。
3.表的洗掉
DROP TABLE < 表名 > ;
exp:DROP TABLE product;
4.添加列的 ALTER TABLE 陳述句
ALTER TABLE < 表名 > ADD COLUMN < 列的定義 >;
exp:ALTER TABLE product ADD COLUMN product_name_pinyin VARCHAR(100);
5.洗掉列的 ALTER TABLE 陳述句
ALTER TABLE < 表名 > DROP COLUMN < 列名 >;
exp:ALTER TABLE product DROP COLUMN product_name_pinyin;
ALTER TABLE 陳述句和 DROP TABLE 陳述句一樣,執行之后無法恢復。誤添的列可以通過 ALTER TABLE 陳述句洗掉,或者將表全部洗掉之后重新再創建。
6.清空表內容
TRUNCATE TABLE TABLE_NAME;
優點:相比drop``/``delete,truncate用來清除資料時,速度最快。
7.資料的更新
基本語法:
UPDATE <表名>
SET <列名> = <運算式> [, <列名2>=<運算式2>...];
WHERE <條件>; -- 可選,非常重要。
ORDER BY 子句; --可選
LIMIT 子句; --可選
使用 update 時要注意添加 where 條件,否則將會將所有的行按照陳述句修改
-- 修改所有的注冊時間
UPDATE product
SET regist_date = '2009-10-10';
-- 僅修改部分商品的單價
UPDATE product
SET sale_price = sale_price * 10
WHERE product_type = '廚房用具';
使用 UPDATE 也可以將列更新為 NULL(該更新俗稱為NULL清空)。此時只需要將賦值運算式右邊的值直接寫為 NULL 即可。
-- 將商品編號為0008的資料(圓珠筆)的登記日期更新為NULL
UPDATE product
SET regist_date = NULL
WHERE product_id = '0008';
和 INSERT 陳述句一樣, UPDATE 陳述句也可以將 NULL 作為一個值來使用。
**但是,只有未設定 NOT NULL 約束和主鍵約束的列才可以清空為NULL。**如果將設定了上述約束的列更新為 NULL,就會出錯,這點與INSERT 陳述句相同。
多列更新
UPDATE 陳述句的 SET 子句支持同時將多個列作為更新物件。
-- 基礎寫法,一條UPDATE陳述句只更新一列
UPDATE product
SET sale_price = sale_price * 10
WHERE product_type = '廚房用具';
UPDATE product
SET purchase_price = purchase_price / 2
WHERE product_type = '廚房用具';
該寫法可以得到正確結果,但是代碼較為繁瑣。可以采用合并的方法來簡化代碼。
-- 合并后的寫法
UPDATE product
SET sale_price = sale_price * 10,
purchase_price = purchase_price / 2
WHERE product_type = '廚房用具';
需要明確的是,SET 子句中的列不僅可以是兩列,還可以是三列或者更多。
2.9 向 product 表中插入資料
為了學習INSERT陳述句用法,我們首先創建一個名為productins的表,建表陳述句如下:
CREATE TABLE productins
(product_id CHAR(4) NOT NULL,
product_name VARCHAR(100) NOT NULL,
product_type VARCHAR(32) NOT NULL,
sale_price INTEGER DEFAULT 0,
purchase_price INTEGER ,
regist_date DATE ,
PRIMARY KEY (product_id));
基本語法:
INSERT INTO <表名> (列1, 列2, 列3, ……) VALUES (值1, 值2, 值3, ……);
對表進行全列 INSERT 時,可以省略表名后的列清單。這時 VALUES子句的值會默認按照從左到右的順序賦給每一列。
-- 包含列清單
INSERT INTO productins (product_id, product_name, product_type,
sale_price, purchase_price, regist_date) VALUES ('0005', '高壓鍋', '廚房用具', 6800, 5000, '2009-01-15');
-- 省略列清單
INSERT INTO productins
VALUES ('0005', '高壓鍋', '廚房用具', 6800, 5000, '2009-01-15');
原則上,執行一次 INSERT 陳述句會插入一行資料。插入多行時,通常需要回圈執行相應次數的 INSERT 陳述句。其實很多 RDBMS 都支持一次插入多行資料
-- 通常的INSERT
INSERT INTO productins VALUES ('0002', '打孔器',
'辦公用品', 500, 320, '2009-09-11');
INSERT INTO productins VALUES ('0003', '運動T恤',
'衣服', 4000, 2800, NULL);
INSERT INTO productins VALUES ('0004', '菜刀',
'廚房用具', 3000, 2800, '2009-09-20');
-- 多行INSERT ( DB2、SQL、SQL Server、 PostgreSQL 和 MySQL多行插入)
INSERT INTO productins VALUES ('0002', '打孔器',
'辦公用品', 500, 320, '2009-09-11'),
('0003', '運動T恤', '衣服', 4000, 2800, NULL),
('0004', '菜刀', '廚房用具', 3000, 2800, '2009-09-20');
-- Oracle中的多行INSERT
INSERT ALL INTO productins VALUES ('0002', '打孔器', '辦公用品', 500, 320, '2009-09-11')
INTO productins VALUES ('0003', '運動T恤', '衣服', 4000, 2800, NULL)
INTO productins VALUES ('0004', '菜刀', '廚房用具', 3000, 2800, '2009-09-20')
SELECT * FROM DUAL;
-- DUAL是Oracle特有(安裝時的必選項)的一種臨時表A。因此“SELECT *FROM DUAL” 部分也只是臨時性的,并沒有實際意義。
INSERT 陳述句中想給某一列賦予 NULL 值時,可以直接在 VALUES子句的值清單中寫入 NULL。想要插入 NULL 的列一定不能設定 NOT NULL 約束。
INSERT INTO productins (product_id, product_name, product_type,
sale_price, purchase_price, regist_date) VALUES ('0006', '叉子',
'廚房用具', 500, NULL, '2009-09-20');
還可以向表中插入默認值(初始值)。可以通過在創建表的CREATE TABLE 陳述句中設定DEFAULT約束來設定默認值。
CREATE TABLE productins
(product_id CHAR(4) NOT NULL,
(略)
sale_price INTEGER
(略) DEFAULT 0, -- 銷售單價的默認值設定為0;
PRIMARY KEY (product_id));
可以使用INSERT … SELECT 陳述句從其他表復制資料。
-- 將商品表中的資料復制到商品復制表中
INSERT INTO productocpy (product_id, product_name, product_type, sale_price, purchase_price, regist_date)
SELECT product_id, product_name, product_type, sale_price,
purchase_price, regist_date
FROM Product;
本課程用表插入資料sql如下:
- DML :插入資料
STARTTRANSACTION;
INSERT INTO product VALUES('0001', 'T恤衫', '衣服', 1000, 500, '2009-09-20');
INSERT INTO product VALUES('0002', '打孔器', '辦公用品', 500, 320, '2009-09-11');
INSERT INTO product VALUES('0003', '運動T恤', '衣服', 4000, 2800, NULL);
INSERT INTO product VALUES('0004', '菜刀', '廚房用具', 3000, 2800, '2009-09-20');
INSERT INTO product VALUES('0005', '高壓鍋', '廚房用具', 6800, 5000, '2009-01-15');
INSERT INTO product VALUES('0006', '叉子', '廚房用具', 500, NULL, '2009-09-20');
INSERT INTO product VALUES('0007', '擦菜板', '廚房用具', 880, 790, '2008-04-28');
INSERT INTO product VALUES('0008', '圓珠筆', '辦公用品', 100, NULL, '2009-11-11');
COMMIT;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/282497.html
標籤:基礎類
上一篇:小米路由器
