1. 程式人生 > >SQL中語句的基本用法

SQL中語句的基本用法

基本介紹

  1. DML(data manipulation language): 它們是SELECT、UPDATE、INSERT、DELETE,就象它的名字一樣,這4條命令是用來對資料庫裡的資料進行操作的語言 。
  2. DDL(data definition language): DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定義或改變表(TABLE)的結構,資料型別,表之間的連結和約束等初始化工作上,他們大多在建立表時使用 。
  3. 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;

多種條件

查詢條件

  1. 去除重複行 DISTINCT
  2. 獲得指定範圍 n 到 m (n < m)內容的行數,只有一個引數表示前n行。 limit n,m
  3. 查詢出來的行按照指定順序進行排序 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 不會

不同點

drop、truncate、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)的縮寫。