SQL中語句的基本用法
基本介紹
- DML(data manipulation language): 它們是SELECT、UPDATE、INSERT、DELETE,就象它的名字一樣,這4條命令是用來對資料庫裡的資料進行操作的語言 。
- DDL(data definition language): DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定義或改變表(TABLE)的結構,資料型別,表之間的連結和約束等初始化工作上,他們大多在建立表時使用 。
- DCL(Data Control Language): 是資料庫控制功能。是用來設定或更改資料庫使用者或角色許可權的語句,包括(grant,deny,revoke等)語句。在預設狀態下,只有sysadmin, dbcreator,db_owner 或者 db_securityadmin 等人員才有權力執行DCL。
模式定義了資料如何儲存、儲存什麼樣的資料以及資料如何分解等資訊,資料庫和表都有模式。
主鍵的值不允許修改,也不允許複用(不能使用已經刪除的主鍵值賦給新資料行的主鍵)。
# 註釋
SELECT *
FROM mytable; -- 註釋
/* 註釋1
註釋2 */
資料庫建立與使用:
CREATE DATABASE test;
USE test;
建立表
CREATE TABLE mytable ( id INT NOT NULL AUTO_INCREMENT, col1 INT NOT NULL DEFAULT 1, col2 VARCHAR(45) NULL, col3 DATE NULL, PRIMARY KEY (`id`));
修改表
新增列
ALTER TABLE mytable ADD col CHAR(20);
刪除列(需要DROP 刪除需要制定行、列、表格名)
ALTER TABLE mytable DROP COLUMN col;
刪除表
DROP TABLE mytable;
插入
普通插入(列名存在,但是資料原先不存在)
INSERT INTO mytable col1,col2 VALUES(val1,val2);
插入搜尋出來的資料。(將mytable2中的col3和col4中的內容,插入到表mytable1中的col1和col2列中)
INSERT INTO mytable1 col1,col2 SELECT col3,col4 FROM mytable2
將表mytable中的列col1和col2,資料檢索出來,組成一個新表(表名為newTable)
CREATE TABLE newTable AS SELECT col1,col2 FROM mytable;
更新表
主要是將原來有值的列資料更新為新的值,將表mytable中,id值為1的,列col所有值更新為val。
UPDATE mytable SET col = val WHERE id=1;
刪除
-- 刪除表結構
DROP table mytable;
TRUNCATE table mytable;
多種條件
查詢條件
- 去除重複行 DISTINCT
- 獲得指定範圍 n 到 m (n < m)內容的行數,只有一個引數表示前n行。 limit n,m
- 查詢出來的行按照指定順序進行排序 ORDER BY col1 DESC, col2 ASC
其它過濾條件
操作符 | 說明 |
---|---|
= | 等於 |
< | 小於 |
> | 大於 |
<> != | 不等於 |
<= !> | 小於等於 |
>= !< | 大於等於 |
BETWEEN | 在兩個值之間 |
IS NULL 為 NULL | 值 |
基本和Java沒有什麼區別,主要是有個 BETWEEN。也可以使用 AND 和 OR 兩個關鍵詞來連線
- IN 操作符,類似從指定的結果中列舉。
-- 從 Persons 的表格中,取出LastName列為 Adams 和 Carter 的人
SELECT * FROM Persons
WHERE LastName IN ('Adams','Carter')
- NOT 操作符,就是否操作。
萬用字元 LIKE
就類似與正則表示式
- % 表示任意的多個符號
- _ 表示一個符號
- [] 表示限定範圍內的符號
-- 不以 A 和 B 開頭的任意文字
SELECT *FROM mytable
WHERE col LIKE '[^AB]%';
多種內建的函式
-- CONCAT 進行字串的拼接, TRIM 表示取出行的字串
SELECT CONCAT(TRIM(col1), '(', TRIM(col2), ')') AS concat_col
FROM mytable;
還有一些專門用於文字處理的函式
分組 Group By
就是把具有相同值的資料值放到同一組之中。
-- 把 mytable 中具有相同名字的資訊進行分組
SELECT name FROM mytable GROUP BY name;
-- 統計下相同名稱的個數,並按照個數進行升序排序
SELECT name,count(*) as num FROM mytable GROUP BY name ORDER BY num;
WHERE 過濾行,HAVING 過濾分組,行過濾應當先於分組過濾。
-- 取出id為 4-10 的資料進行分組
SELECT name FROM mytable WHERE id BETWEEN 4 AND 10;
-- 進行 having 操作,取出分組後個數小於3的列
SELECT name,count(*) as num FROM mytable WHERE id BETWEEN 4 AND 10 group by name ORDER BY name having num <= 3;
分組規定:
- GROUP BY 子句出現在 WHERE 子句之後,ORDER BY 子句之前;
- 除了彙總欄位外,SELECT 語句中的每一欄位都必須在 GROUP BY 子句中給出;
- NULL 的行會單獨分為一組;
- 大多數 SQL 實現不支援 GROUP BY 列具有可變長度的資料型別。
子查詢
子查詢中只能返回一個欄位的資料。
-- 利用子查詢找出 A 表中那些,在 A 表和 B 表中相同的欄位
-- 子查詢作為過濾條件
SELECT col1 FROM table_A WHERE col1 IN (SELECT col1 FROM table_B);
下面的語句可以檢索出客戶的訂單數量,子查詢語句會對第一個查詢檢索出的每個客戶執行一次:
SELECT cust_name, (SELECT COUNT(*) FROM Orders
WHERE Orders.cust_id = Customers.cust_id) AS orders_num
FROM Customers ORDER BY cust_name;
連線-內連線、外連線
連線用於將多張表連線到一起,使用 JOIN 來,條件中使用 ON 而不是 WHERE。
內連線(等值連線)
SELECT A.value,B.value # 連線後的值
FROM tablea AS A INNER JOIN tableb AS B # tablea 和 tableb 進行內連線
ON A.key=B.key; # 內連線的等值條件
-- 將上面的內連線改為WHERE的等值方法
SELECT A.value,B.value
FROM tablea AS A,tableb AS B
WHERE A.key=B.key;
自連線
自連線可以看成內連線的一種,只是連線的表是自身而已。
-- 一張員工表,包含『員工姓名』和『員工所屬部門』,要找出與 Jim 處在同一部門的所有員工姓名。
SELECT e1.name
FROM employee AS e1 INNER JOIN employee AS e2
ON e1.department = e2.department
AND e2.name = "Jim";
-- 非自連線版本
SELECT name FROM employee WHERE department = (SELECT department FROM employee WHERE name="Jim");
自然連線
表示將不同表格中,列名相同的資料自動的連線起來,同名列可以有多個。
和內連線的區別是,內連線是連線指定的連線條件,而自然連線是自動連線相同列名的列。
SELECT A.value,B.value FROM tablea AS A NATURAL JOIN tableb AS B;
外連線
外連線保留了沒有關聯的那些行。分為左外連線,右外連線以及全外連線,左外連線就是保留左表沒有關聯的行。
customers 表:
cust_id | cust_name |
---|---|
1 | a |
2 | b |
3 | c |
orders 表:
order_id | cust_id |
---|---|
1 | 1 |
2 | 1 |
3 | 3 |
4 | 3 |
預期執行結果:
cust_id | cust_name | order_id |
---|---|---|
1 | a | 1 |
1 | a | 2 |
3 | c | 3 |
3 | c | 4 |
2 | b | Null |
SELECT customers.cust_id,customers.cust_name,orders.order_id FROM customers LEFT JOIN orders On customers.cust_id=orders.cust_id;
組合查詢
使用 UNION 來組合兩個查詢,如果第一個查詢返回 M 行,第二個查詢返回 N 行,那麼組合查詢的結果一般為 M+N 行。
每個查詢必須包含相同的列、表示式和聚集函式。
預設會去除相同行,如果需要保留相同行,使用 UNION ALL。
只能包含一個 ORDER BY 子句,並且必須位於語句的最後。
SELECT col FROM mytable WHERE col = 1
UNION
SELECT col FROM mytable WHERE col =2;
檢視
檢視是虛擬的表,本身不包含資料,也就不能對其進行索引操作。
對檢視的操作和對普通表的操作一樣。
檢視具有如下好處:
- 簡化複雜的 SQL 操作,比如複雜的連線;
- 只使用實際表的一部分資料;
- 通過只給使用者訪問檢視的許可權,保證資料的安全性;
- 更改資料格式和表示。
CREATE VIEW myview AS
SELECT Concat(col1, col2) AS concat_col, col3*col4 AS compute_col
FROM mytable
WHERE col5 = val;
其它
還有很多高階的應用,這裡不說了,給出參考連結
實際的一個應用場景 CMS 管理系統
CMS(Student Manager System)學生管理系統(資料庫),裡面包含了
學生基本資訊(INFO): 學號 idno、姓名 name、年齡 age
學生成績資訊(CLASS_INFO): 學號 idno、 課程編號 class_id、 課程名稱 class_name、 課程成績 class_score
1 建立資料庫,並使用
CREATE DATABASE mybase;
USE mybase
2 建立資料庫表
CREATE TABLE mytable(
id INT(10) NOT NULL AUTO_INCREMENT;
col1 INT(10) NOT NULL default 1;
col2 VARCHAR(12) NOT NULL; # 註釋: 建立不允許為空的字串表名
-- ... 省略其它屬性
PRIMARY KEY(`id`); # 設定主鍵,主鍵是 ` 符號,而不是' 號
);
3. 修改資料表- 刪除行、列、表
-- 增加名稱為 col1 的列
ALTER TABLE mytable ADD col1 VARCHAR(12);
-- 刪除名稱為 col1 的列
ALTER TABLE mytable DROP COLUMN col1;
4. 插入表結構、修改已插入的表結構
-- 插入具體的到表格中
INSERT INTO mytable(id,name) VALUES(12,"zhangsan");
-- 從其它的表格中選取資料插入到表格
INSERT INTO mytable(id,name) SELECT col1,col2 FROM othertable;
-- 更新已經存在表格屬性,例如,將 id 為 12 的改為"lisi"
UPDATE mytable SET name="lisi" WHERE id=12;
SQL truncate 、delete與drop區別
相同點
- 都是執行刪除操作
- truncate 和 drop 都是 DDL 語言,執行後會自動提交,而 delete 不會
不同點
- truncate 和 delete 都是隻刪除資料不刪除表結構
- drop 語句將刪除表的結構被依賴的約束(constrain)、觸發器(trigger)、索引(index);依賴於該表的儲存過程/函式將保留,但是變為 invalid 狀態。
- 安全性:小心使用 drop 和 truncate,尤其沒有備份的時候.否則哭都來不及
- 想刪除部分資料行用 delete,注意帶上where子句. 回滾段要足夠大.
- 想刪除表,當然用 drop
- 想保留表而將所有資料刪除,如果和事務無關,用truncate即可。如果和事務有關,或者想觸發trigger,還是用delete。
- 如果是整理表內部的碎片,可以用truncate跟上reuse stroage,再重新匯入/插入資料。
5. 刪除表格
-- 刪除表格mytable 中 id 為 13 的行
DELETE FROM mytable WHERE id=13
-- TRUNCATE TABLE 可以清空表,也就是刪除所有行。
TRUNCATE TABLE mytable;
6、查詢表結構、去除相同值、指定範圍、升序(降序)
-- 查詢 mytable表中非相同的值
SELECT DISTINT col1,col2 FROM mytable;
-- 取查詢結果的前5條
SELECT * FROM mytable WHERE ... LIMIT 5;
-- 去查詢結果的 5-15條
SELECT * FROM mytable WHERE ... LIMIT 5,10;
-- 可以按多個列進行排序,並且為每個列指定不同的排序方式:
SELECT * FROM mytable ORDER BY col1 DESC,col2 ASC;
注意:
LIMIT m,n : 表示從第m+1條開始,取n條資料;
LIMIT n : 表示從第0條開始,取n條資料,是limit(0,n)的縮寫。