標籤:多個 har table not 姓名 關鍵字 highlight 內串連 sql
一、基礎
模式定義了資料如何儲存、儲存什麼樣的資料以及資料如何分解等資訊,資料庫和表都有模式。
主鍵的值不允許修改,也不允許複用(不能使用已經刪除的主索引值賦給新資料行的主鍵)。
SQL 陳述式不區分大小寫,但是資料庫表名、列名和值是否區分依賴於具體的 DBMS 以及配置。
SQL 支援以下三種注釋:
# 注釋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 mytableADD col CHAR(20);
刪除列
ALTER TABLE mytableDROP COLUMN col;
刪除表
DROP TABLE mytable;
四、插入
普通插入
INSERT INTO mytable(col1, col2)VALUES(val1, val2);
插入檢索出來的資料
INSERT INTO mytable1(col1, col2)SELECT col1, col2FROM mytable2;
將一個表的內容插入到一個新表
CREATE TABLE newtable ASSELECT * FROM mytable;
五、更新
UPDATE mytableSET col = valWHERE id = 1;
六、刪除
DELETE FROM mytableWHERE id = 1;
TRUNCATE TABLE 可以清空表,也就是刪除所有行。
TRUNCATE TABLE mytable;
使用更新和刪除操作時一定要用 WHERE 子句,不然會把整張表的資料都破壞。可以先用 SELECT 語句進行測試,防止錯誤刪除。
七、查詢DISTINCT
相同值只會出現一次。它作用於所有列,也就是說所有列的值都相同才算相同。
SELECT DISTINCT col1, col2FROM mytable;
LIMIT
限制返回的行數。可以有兩個參數,第一個參數為起始行,從 0 開始;第二個參數為返回的總行數。
返回前 5 行:
SELECT *FROM mytableLIMIT 5;
SELECT *FROM mytableLIMIT 0, 5;
返回第 3 ~ 5 行:
SELECT *FROM mytableLIMIT 2, 3;
八、排序
可以按多個列進行排序,並且為每個列指定不同的排序方式:
SELECT *FROM mytableORDER BY col1 DESC, col2 ASC;
九、過濾
不進行過濾的資料非常大,導致通過網路傳輸了多餘的資料,從而浪費了網路頻寬。因此盡量使用 SQL 陳述式來過濾不必要的資料,而不是傳輸所有的資料到用戶端中然後由用戶端進行過濾。
SELECT *FROM mytableWHERE col IS NULL;
十、子查詢
子查詢中只能返回一個欄位的資料。
可以將子查詢的結果作為 WHRER 語句的過濾條件:
SELECT *FROM mytable1WHERE col1 IN (SELECT col2 FROM mytable2);
下面的語句可以檢索出客戶的訂單數量,子查詢語句會對第一個查詢檢索出的每個客戶執行一次:
SELECT cust_name, (SELECT COUNT(*) FROM Orders WHERE Orders.cust_id = Customers.cust_id) AS orders_numFROM CustomersORDER BY cust_name;
十一、串連
串連用於串連多個表,使用 JOIN 關鍵字,並且條件陳述式使用 ON 而不是 WHERE。
串連可以替換子查詢,並且比子查詢的效率一般會更快。
可以用 AS 給列名、計算欄位和表名取別名,給表名取別名是為了簡化 SQL 陳述式以及串連相同表。
內串連
內串連又稱等值串連,使用 INNER JOIN 關鍵字。
SELECT A.value, B.valueFROM tablea AS A INNER JOIN tableb AS BON A.key = B.key;
可以不明確使用 INNER JOIN,而使用普通查詢並在 WHERE 中將兩個表中要串連的列用等值方法串連起來。
SELECT A.value, B.valueFROM tablea AS A, tableb AS BWHERE A.key = B.key;
在沒有條件陳述式的情況下返回笛卡爾積。
自串連
自串連可以看成內串連的一種,只是串連的表是自身而已。
一張員工表,包含員工姓名和員工所屬部門,要找出與 Jim 處在同一部門的所有員工姓名。
子查詢版本
SELECT nameFROM employeeWHERE department = ( SELECT department FROM employee WHERE name = "Jim");
自串連版本
SELECT e1.nameFROM employee AS e1 INNER JOIN employee AS e2ON e1.department = e2.department AND e2.name = "Jim";
自然串連
自然串連是把同名列通過等值測試連接起來的,同名列可以有多個。
內串連和自然串連的區別:內串連提供串連的列,而自然串連自動連接所有同名列。
SELECT A.value, B.valueFROM tablea AS A NATURAL JOIN tableb AS B;
外串連
外串連保留了沒有關聯的那些行。分為左外串連,右外串連以及全外串連,左外串連就是保留左表沒有關聯的行。
檢索所有顧客的訂單資訊,包括還沒有訂單資訊的顧客。
SELECT Customers.cust_id, Orders.order_numFROM Customers LEFT OUTER JOIN OrdersON Customers.cust_id = Orders.cust_id;
十二、組合查詢
使用 UNION 來組合兩個查詢,如果第一個查詢返回 M 行,第二個查詢返回 N 行,那麼組合查詢的結果一般為 M+N 行。
每個查詢必須包含相同的列、運算式和聚集合函式。
預設會去除相同行,如果需要保留相同行,使用 UNION ALL。
只能包含一個 ORDER BY 子句,並且必須位於語句的最後。
SELECT colFROM mytableWHERE col = 1UNIONSELECT colFROM mytableWHERE col =2;
簡單SQL語句