完成目標:
知識點:
1.DDL和DML的補充
知識點 | 核心內容 | 重點 |
快速創建表 | 使用CREATE TABLE...AS SELECT語句基于現有表快速創建新表 | 結構和數據復制 vs 僅復制結構(WHERE 1=2) |
數據刪除操作 | DELETE FROM逐條刪除 vs TRUNCATE TABLE重建表結構 | DML操作 vs DDL操作、效率差異、自增ID重置 |
部分數據復制 | 通過指定列名和WHERE條件選擇性復制數據 | 列篩選(SELECT s_no,s_name,age)與行篩選(WHERE s_no=2)的組合使用 |
操作類型區分 | DDL(CREATE/DROP/TRUNCATE)與DML(INSERT/UPDATE/DELETE) | 數據庫對象操作 vs 數據操作的語法差異 |
2.DQL##表的準備
知識點 | 核心內容 | 重點 |
DQL查詢操作 | 數據庫中最重要且最常用的部分,涵蓋單表查詢、多表查詢、子查詢 | 多表關聯邏輯(如自關聯)、NULL與零值的區別(comm字段) |
表結構設計 | 四張表(部門表dept、員工表emp、薪資等級表sale grade、獎金表bonus) | 外鍵關聯(emp.dept_no參考dept,emp.mgr自關聯)、字段含義(如loc=location) |
Oracle與MySQL對比 | Oracle安裝后自帶四張表,MySQL需手動創建 | 表移植差異(字段兼容性) |
數據插入與驗證 | 批量運行SQL腳本初始化表數據 | 數據完整性檢查(如部門與員工的關聯性) |
薪資等級邏輯 | sale grade表定義工資區間等級(1-5級) | 區間邊界值理解(如1200屬于1級還是2級) |
3.最簡單的SQL語句
知識點 | 核心內容 | 重點 |
單表查詢基礎 | SELECT * FROM emp 查詢整表數據,SELECT 列名 篩選部分列,WHERE 子句過濾行 | 星號(*)表示所有列,WHERE 條件需注意數據類型匹配 |
列別名與特殊字符處理 | 使用 AS 或直接空格定義別名(如 empno AS 員工編號),含空格/特殊符號時需加單/雙引號 | 別名含空格時必須加引號,否則報錯(如 "漲薪后工資") |
算術運算符應用 | 在查詢中直接計算(如 sal+1000),但 NULL 參與運算結果為 NULL | NULL 與 0 的區別,需后續學習 NVL 函數處理 |
去重操作 | DISTINCT 對單列或多列組合去重(如 DISTINCT job, deptno) | 多列去重時針對組合結果,非單列獨立去重 |
排序規則 | ORDER BY 默認升序(ASC),降序需顯式聲明(DESC),支持多列混合排序 | 多列排序時優先級按字段順序,如 ORDER BY sal ASC, deptno DESC |
經典案例 | Oracle 示例表 emp 包含 14 條記錄,如用戶 SCOTT(密碼 TIGER)為早期員工數據 | 表設計巧妙覆蓋多數查詢場景,適合教學 |
4.where子句
知識點 | 核心內容 | 重點 |
WHERE子句基礎 | 通過WHERE子句添加過濾條件篩選數據,支持關系運算符(=、>、<、>=、<=、!=) | 區分=與!=的寫法(<>或!=均有效) |
字符型數據查詢 | 字符串比較默認不區分大小寫,需用BINARY關鍵字強制區分(如WHERE BINARY job='CLERK') | 單引號/雙引號通用,但大小寫敏感需特殊處理 |
日期與數值過濾 | 支持日期比較(如hiredate < '1981-12-25')和數值區間查詢(sal BETWEEN 1500 AND 3000) | BETWEEN AND包含邊界值,而> AND <不包含 |
邏輯運算符 | AND(與)、OR(或)及符號替代(&&、` | |
IN運算符 | 替代多條件OR(如deptno IN (10,20)),支持字符型(job IN ('MANAGER','CLERK')) | IN列表內為精確匹配,非范圍 |
模糊查詢 | LIKE配合通配符:%(任意多字符)、_(單個字符),如ename LIKE '_A%'(第二位為A) | 通配符位置影響匹配結果 |
NULL值處理 | 需用IS NULL/IS NOT NULL判斷空值,不可用=NULL | 零值(0)與NULL本質不同 |
綜合查詢示例 | 多條件組合(如(job='SALESMAN' OR job='CLERK') AND sal>=1500) | 括號對邏輯表達式的關鍵影響 |
5.函數的分類
知識點 | 核心內容 | 重點 |
SQL函數概念 | 封裝特定功能的可調用模塊(類似JAVA方法/Python函數),通過名稱直接調用 | 函數不改變原數據值,僅對展示結果加工處理 |
單行函數 | 對每條記錄獨立計算(如LOWER()/UPPER()),輸入輸出記錄數一致 | 與多行函數的核心區別:逐條處理 vs 聚合計算 |
多行函數(分組函數) | 對一組數據聚合運算(如MAX()/SUM()),返回單一結果 | 僅5種:MAX/MIN/COUNT/SUM/AVG |
函數分類記憶技巧 | “除多行函數外均為單行函數”(因單行函數數量龐大) | 易混淆點:分類依據是處理邏輯而非結果行數 |
函數作用 | 提升查詢能力(如大小寫轉換、數值統計) | 注意:LOWER(e_name)等單行函數會保留原表行數 |
6.單行函數(1)
知識點 | 核心內容 | 重點 |
單行函數分類 | 分為字符函數、數值函數、日期與時間函數等類型 | 注意與多行函數的區別 |
字符函數 | LENGTH()獲取字符串長度,SUBSTRING()進行字符串截取 | SUBSTRING參數含義:第一個參數是起始下標(從1開始),第二個參數是截取長度 |
數值函數 | ABS()取絕對值,CEIL()向上取整,FLOOR()向下取整,ROUND()四舍五入,MOD()取模 | DUAL虛擬表的使用場景 |
日期時間函數 | CURRENT_DATE獲取年月日,CURRENT_TIME獲取時分秒,NOW()和SYSDATE()獲取完整時間 | 關鍵區別:NOW()返回SQL開始執行時間,SYSDATE()返回函數執行時刻時間 |
函數應用場景 | 演示了在SELECT查詢、數據插入等場景下的函數使用 | 注意字段類型與函數返回值的匹配(如DATE類型不存儲時分秒) |
7.單行函數(2)
知識點 | 核心內容 | 重點 |
字符串/數值/日期函數 | 回顧內容,包含字符串、數值、日期與時間函數的SQL示例 | 空值處理(如NULL參與計算時需用IFNULL轉換) |
流程函數-IF | IF(條件, 真值, 假值)實現雙分支邏輯,示例:薪資分級(高薪/低薪) | 單分支邏輯:IFNULL(com,0)解決NULL計算問題 |
流程函數-NULLIF | NULLIF(值1,值2):相等返回NULL,不等返回值1 | 適用場景較少,需注意與IFNULL區別 |
流程函數-CASE(等值判斷) | CASE job WHEN 'clerk' THEN '店員'...實現職位中英文映射 | 必須包含END結尾,ELSE處理默認情況 |
流程函數-CASE(區間判斷) | CASE WHEN salary<=1000 THEN 'A級'...實現薪資分級(A/B/C/D) | 區間條件需嚴格遞進(如1000-2000需隱含>1000) |
其他函數 | DATABASE()/USER()/VERSION()查詢當前庫/用戶/版本信息 | 版本號識別(如8.0.21對應MySQL 5.8+) |