簡單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 mytable
ADD col CHAR(20);
刪除列
ALTER TABLE mytable
DROP COLUMN col;
刪除表
DROP TABLE mytable;
四、插入
普通插入
INSERT INTO mytable(col1, col2)
VALUES(val1, val2);
插入檢索出來的數據
INSERT INTO mytable1(col1, col2)
SELECT col1, col2
FROM mytable2;
將一個表的內容插入到一個新表
CREATE TABLE newtable AS
SELECT * FROM mytable;
五、更新
UPDATE mytable
SET col = val
WHERE id = 1;
六、刪除
DELETE FROM mytable
WHERE id = 1;
TRUNCATE TABLE 可以清空表,也就是刪除所有行。
TRUNCATE TABLE mytable;
使用更新和刪除操作時一定要用 WHERE 子句,不然會把整張表的數據都破壞。可以先用 SELECT 語句進行測試,防止錯誤刪除。
七、查詢
DISTINCT
相同值只會出現一次。它作用於所有列,也就是說所有列的值都相同才算相同。
SELECT DISTINCT col1, col2
FROM mytable;
LIMIT
限制返回的行數。可以有兩個參數,第一個參數為起始行,從 0 開始;第二個參數為返回的總行數。
返回前 5 行:
SELECT *
FROM mytable
LIMIT 5;
SELECT *
FROM mytable
LIMIT 0, 5;
返回第 3 ~ 5 行:
SELECT *
FROM mytable
LIMIT 2, 3;
八、排序
- ASC :升序(默認)
- DESC :降序
可以按多個列進行排序,並且為每個列指定不同的排序方式:
SELECT *
FROM mytable
ORDER BY col1 DESC, col2 ASC;
九、過濾
不進行過濾的數據非常大,導致通過網絡傳輸了多余的數據,從而浪費了網絡帶寬。因此盡量使用 SQL 語句來過濾不必要的數據,而不是傳輸所有的數據到客戶端中然後由客戶端進行過濾。
SELECT *
FROM mytable
WHERE col IS NULL;
十、子查詢
子查詢中只能返回一個字段的數據。
可以將子查詢的結果作為 WHRER 語句的過濾條件:
SELECT *
FROM mytable1
WHERE col1 IN (SELECT col2
FROM mytable2);
下面的語句可以檢索出客戶的訂單數量,子查詢語句會對第一個查詢檢索出的每個客戶執行一次:
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。
連接可以替換子查詢,並且比子查詢的效率一般會更快。
可以用 AS 給列名、計算字段和表名取別名,給表名取別名是為了簡化 SQL 語句以及連接相同表。
內連接
內連接又稱等值連接,使用 INNER JOIN 關鍵字。
SELECT A.value, B.value
FROM tablea AS A INNER JOIN tableb AS B
ON A.key = B.key;
可以不明確使用 INNER JOIN,而使用普通查詢並在 WHERE 中將兩個表中要連接的列用等值方法連接起來。
SELECT A.value, B.value
FROM tablea AS A, tableb AS B
WHERE A.key = B.key;
在沒有條件語句的情況下返回笛卡爾積。
自連接
自連接可以看成內連接的一種,只是連接的表是自身而已。
一張員工表,包含員工姓名和員工所屬部門,要找出與 Jim 處在同一部門的所有員工姓名。
子查詢版本
SELECT name
FROM employee
WHERE department = (
SELECT department
FROM employee
WHERE name = "Jim");
自連接版本
SELECT e1.name
FROM employee AS e1 INNER JOIN employee AS e2
ON e1.department = e2.department
AND e2.name = "Jim";
自然連接
自然連接是把同名列通過等值測試連接起來的,同名列可以有多個。
內連接和自然連接的區別:內連接提供連接的列,而自然連接自動連接所有同名列。
SELECT A.value, B.value
FROM tablea AS A NATURAL JOIN tableb AS B;
外連接
外連接保留了沒有關聯的那些行。分為左外連接,右外連接以及全外連接,左外連接就是保留左表沒有關聯的行。
檢索所有顧客的訂單信息,包括還沒有訂單信息的顧客。
SELECT Customers.cust_id, Orders.order_num FROM Customers LEFT OUTER 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語句