1. 程式人生 > >簡單SQL語句

簡單SQL語句

varchar 包括 大小 font ins mas size ble name

一、基礎

模式定義了數據如何存儲、存儲什麽樣的數據以及數據如何分解等信息,數據庫和表都有模式。

主鍵的值不允許修改,也不允許復用(不能使用已經刪除的主鍵值賦給新數據行的主鍵)。

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語句