1 小時 SQL 極速入門(一)

前幾天,我在論壇溜達。看到一我的發帖說sql

作了6年的企業級開發,老是被互聯網行業的人認爲沒技術含量,不就是CRUD麼 先解釋下 CRUD 是什麼。CRUD 就是咱們常說的增刪改查(Create,Retrieve,Update,Delete)數據庫

其實,對這個問題,我也思考過。咱們全部的業務流程,最終都會抽象出數據模型,保存到數據庫中。把業務之間的聯繫抽象成數據庫中表與表,字段與字段之間的聯繫。實際上,企業的各類系統,在技術層面上確實是在 CRUD。併發

不過話說回來了,互聯網的系統不是 CRUD 嗎?只不過 CRUD 的姿式不一樣罷了,互聯網多是面對高併發的 CRUD, 咱們是面對的是複雜業務流程的 CRUD。這些業務邏輯還須要必定的行業積澱才能捋清楚。因此在企業級開發上業務和技術基本是五五開,業務比重甚至要大於技術。函數

因此,今天咱們就花很短的時間,來學學簡單的 SQL.瞭解下 CRUD 的姿式。 假如咱們有下面一個訂單表 ORDER_HEADER,不要在乎表裏的數據,爲了方便說明,瞎填的。 高併發

ORDER_HEADER.png

查詢

查詢是咱們平日使用最多的,下面着重說一下: 查詢使用 SELECT 關鍵字,基本結構以下spa

SELECT <列名> FROM <表名> WHERE <條件>3d

假如咱們想查找全部已經完工的訂單信息,那麼 SQL 怎麼寫呢?code

SELECT * FROM order_header WHERE order_status = '完工'
複製代碼

執行後會看到咱們須要的結果 cdn

SELECT.png

SELECT * 表明查詢全部列,通常咱們會關注咱們須要的字段,好比咱們要找到訂單類型爲 1 的而且完工的訂單號,咱們能夠這麼寫blog

SELECT order_no FROM order_header WHERE order_status = '完工' AND order_type = 1
複製代碼

咱們能夠看到只有下面兩個符合條件的訂單號被選中。在寫 SQL 中咱們要儘可能避免 SELECT * ,咱們須要哪一個字段就取哪一個字段,能夠節省 SQL 查詢的時間。

SELECT1.png

若是要查詢訂單類型爲 1 的或者處於下達狀態的訂單,SQL 怎麼寫呢?

SELECT order_no FROM order_header WHERE order_type = 1 OR order_status = '下達'
複製代碼

若是要查找開工,下達和完工狀態的訂單,咱們能夠用 IN 關鍵字

SELECT
    order_no,
    order_type,
    order_status
FROM
    order_header
WHERE
    order_status IN ( '開工', '完工', '下達' )
複製代碼

除了 IN 咱們可使用 LIKE 進行模糊查詢,好比咱們要查詢訂單狀態中包含 「工」 的全部訂單

SELECT order_no FROM order_header WHERE  order_status LIKE '%工%'
複製代碼

這裏的 "%" 表示通配符,"%工"表示以工結尾的全部匹配,"工%"表示以工開頭的全部匹配。 此外,咱們能夠用 NOT IN , NOT LIKE 來取相反的邏輯。

經過 GROUP BY 能夠進行分組,好比咱們按照訂單狀態來分組,就能夠很方便的查看當前有幾種狀態的訂單

SELECT order_status FROM order_header GROUP BY order_status
複製代碼

結果以下圖

GROUP.png

若是咱們想看到每一個分組中有多少訂單,那個咱們可使用 COUNT() 函數

SELECT order_status, COUNT(1) FROM order_header GROUP BY order_status
複製代碼

結果以下圖,能夠看到每一個分組中訂單的數量。除了COUNT(),還有 MAX(),MIN(),SUM()等函數

COUNT.png

若是咱們只想看到數量大於 2 的分組,該怎麼寫?

SELECT order_status, COUNT(1) FROM order_header GROUP BY order_status HAVING COUNT(1) > 2
複製代碼

能夠看到,只有數量大於2的分組被查到了。

HAVING.png

若是僅僅想去重,好比想知道總共有幾種訂單類型,那麼咱們只須要對此列用 DISTINCT 便可。

SELECT DISTINCT order_type FROM order_header
複製代碼

結果中的訂單類型列已經被去重了。

DISTINCT.png

CASE WHEN ,有時咱們會須要簡單的判斷邏輯,就能夠用 CASE WHEN 了。好比咱們想讓 訂單類型爲1 的表示生產訂單,訂單類型爲2 的表示更改訂單,訂單類型爲3 的表示廢棄訂單。那麼咱們能夠這麼寫

SELECT
    order_no,
    order_type,
    order_status,
CASE
    WHEN order_type = 1 THEN '生產訂單'
    WHEN order_type = 2 THEN '更改訂單'
    WHEN order_type = 3 THEN '廢棄訂單'
    ELSE '未知類型'
    END AS type_desc
FROM
order_header
複製代碼

結果以下圖

CASEWHEN.png

子查詢,有時候咱們須要從一個結果集中再次查找,就會用到子查詢。好比下面這樣寫

SELECT
    order_no,
    type_desc
FROM
    (
SELECT
    order_no,
    order_type,
    order_status,
CASE
    WHEN order_type = 1 THEN '生產訂單'
    WHEN order_type = 2 THEN '更改訂單'
    WHEN order_type = 3 THEN '廢棄訂單'
    ELSE '未知類型'
    END AS type_desc
FROM
    order_header
) t
複製代碼

下節課咱們說一下 鏈接查詢和經常使用到的分析函數,在企業中,單表查詢狀況是不多的,要關聯查詢。

插入數據

插入數據咱們使用 INSERT 語句

INSERT INTO order_header ( order_no, order_type, order_status, order_date, createdon )
VALUES
    ( '2018102109', 2, '下達', sysdate( ), sysdate( ) )
複製代碼

看到,最下面就是咱們新插入的一行

INSERT.png

更新數據

更新數據使用 UPDATE 語句,咱們更新一下剛纔插入的數據的訂單號

UPDATE order_header SET order_no = '112109' WHERE order_no = '2018102109'
複製代碼

咱們把 訂單號爲'2018102109'的一行數據更新爲了'112109',在update時必定要寫好 WHERE 條件,若是沒有 WHERE 條件,會更新表中全部數據。

刪除數據

咱們刪除剛纔加入的一條數據

DELETE FROM order_header WHERE order_no = '112109'
複製代碼

運行後,訂單號爲'112109'的訂單就被刪除了,DELETE 時一樣要寫好 WHERE 條件,若是沒有 WHERE 條件,會刪除表中全部數據。

下節重點說說 多表鏈接,經常使用分析函數。不要走開哦。

相關文章
相關標籤/搜索