1 小時 SQL 極速入門(一)

来源:https://www.cnblogs.com/injet/archive/2018/11/22/10000372.html
-Advertisement-
Play Games

前幾天,我在論壇溜達。看到一個人發帖說 做了6年的企業級開發,總是被互聯網行業的人認為沒技術含量,不就是CRUD麽 先解釋下 CRUD 是什麼。CRUD 就是我們常說的增刪改查(Create,Retrieve,Update,Delete) 其實,對這個問題,我也思考過。我們所有的業務流程,最終都會抽 ...


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

做了6年的企業級開發,總是被互聯網行業的人認為沒技術含量,不就是CRUD麽
先解釋下 CRUD 是什麼。CRUD 就是我們常說的增刪改查(Create,Retrieve,Update,Delete)

其實,對這個問題,我也思考過。我們所有的業務流程,最終都會抽象出數據模型,保存到資料庫中。把業務之間的聯繫抽象成資料庫中表與表,欄位與欄位之間的聯繫。實際上,企業的各種系統,在技術層面上確實是在 CRUD。

不過話說回來了,互聯網的系統不是 CRUD 嗎?只不過 CRUD 的姿勢不同罷了,互聯網可能是面對高併發的 CRUD, 我們是面對的是複雜業務流程的 CRUD。這些業務邏輯還需要一定的行業積澱才能捋清楚。所以在企業級開發上業務和技術基本是五五開,業務比重甚至要大於技術。

所以,今天我們就花很短的時間,來學學簡單的 SQL.瞭解下 CRUD 的姿勢。
假如我們有下麵一個訂單表 ORDER_HEADER,不要在意表裡的數據,為了方便說明,瞎填的。
ORDER_HEADER.png

查詢

查詢是我們平日使用最多的,下麵著重說一下:
查詢使用 SELECT 關鍵字,基本結構如下

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

假如我們想查找所有已經完工的訂單信息,那麼 SQL 怎麼寫呢?

SELECT * FROM order_header WHERE order_status = '完工'

執行後會看到我們需要的結果
SELECT.png

SELECT * 代表查詢所有列,一般我們會關註我們需要的欄位,比如我們要找到訂單類型為 1 的並且完工的訂單號,我們可以這麼寫

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 條件,會刪除表中所有數據。

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 緒論 大數據處理 數據的價值 受眾較少 一種不同的方法 Hadoop 基於Amazon web Service的雲計算 雲太多 第三種方法 不同類型的成本 AWS:Amazon的彈性架構 本書內容 安裝並運行Hadoop 基於本地Ubuntu主機的Hadoop系統 實踐環節:檢查是否已安裝JDK 實... ...
  • 表值函數創建註意事項 用戶定義表值函數返回 table 數據類型。 對於內聯表值函數,沒有函數主體,表是單個 SELECT 語句的結果集。 表值函數主要用於數據計算出來返回結果集。 使用SSMS資料庫管理工具和T-SQL腳本創建表值函數語法相同。 使用T-SQL腳本創建表值函數 語法: 語法一: - ...
  • [20181122]模擬ORA-08103錯誤.txt$ oerr ora 810308103, 00000, "object no longer exists"// *Cause: The object has been deleted by another user since the oper ...
  • 這兩觸發器比較精簡,容易理解 1、簡單觸發器 CREATE TRIGGER [dbo].[TriggerLog] ON [dbo].[Users] AFTER UPDATEAS BEGIN SET NOCOUNT ON; Insert into dbo.[log](LogContent) selec ...
  • 前陣子一資料庫伺服器的事務日誌開始暴增,當時使用下麵腳本檢查發現該資料庫的log_reuse_wait_desc 一直處於REPLICATION狀態, 也就是說在事務複製過程中,與發佈相關的事務仍未傳遞到分發資料庫。剛好前一天有個同事配置了AWS的DMS相關作業。 SELECT name, log_... ...
  • DCL (Data Control Language,資料庫控制語言)用於定義資料庫許可權 一、用戶許可權 1.1 建立用戶以及授權: Eg :CREATE USER 用戶名 IDENTIFIED BY 密碼 ; 1.2 GRANT 許可權 TO 用戶名 ; Eg:GRANT CREATE SESSION ...
  • 學習方式,有很多種,有的人會選擇提前去預習,提前去學習,將很多知識都自己去提前學習一步,他將時間用在將來要學的知識上。而有些人則是循序漸進,一步一個腳印的學習,雖然節奏慢,但很穩,大學留給每個人的學習時間都是足夠的,只要你能夠堅持,也必定能夠站在和他人一樣的高度。 我還是要推薦下我自己創建的大數據資 ...
  • ThinkerPop Apache 頂級項目 概述 TinkerPop是一個面向實時事務處理(OLAP)以及批量、分析型(OLTP)的開源的圖計算框架。TinkerPop是一個可以應用於不同圖形資料庫的抽象層,避免應用程式與特定資料庫高度依賴。 目標 提供通用的API和工具,使開發人員可以基於不同圖 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...