SQL必知必會(huì)

SQL 必知必會(huì)

第1章 了解SQL

定義

  • 結(jié)構(gòu)化查詢語言(Structured Query Language)

主鍵

  • 定義

    • 一行或一組列,其值能夠唯一標(biāo)識(shí)表中每一行
  • 要求

    • 任意兩行不能有相同的主鍵值
    • 每一行都必須有一個(gè)主鍵值
    • 主鍵列中的值不能更改或更新
    • 主鍵值不能重用(一旦刪除,不能夠再賦予給以后的新行)

第2章 檢索數(shù)據(jù):SELECT

基本語法

  • SELECT Col1,Col2, FROM table

選擇全部列

  • 星號(hào) *

選擇不同行

  • DISTINCT

    • 作用于所有行,不僅僅是跟在其后的一行:即只要兩行不是所有列完全相同,則會(huì)被檢索出來。

限制查詢結(jié)果行數(shù)

  • SQL SERVER: TOP 5

    • SELECT TOP 5 student_name FROM Students
  • MYSQL :LIMIT 5 OFFESET 3

    • SELECT prod_name FROM Products LIMIT 5 OFFSET 5
    • 可以簡寫為LIMIT 3,5
    • 索引序號(hào)從0開始

第3章 排序檢索數(shù)據(jù):ORDER BY

語句位置

  • SELECT 語句的最后一條

指定排序列的方式

  • 按列位置(序號(hào))排序

    • '位置'指的是SELECT語句后的列排序順序,而不是原表中的順序

    • 序號(hào)從1開始

    • 缺點(diǎn)

      • 對(duì)SELECT 清單修改時(shí),如果沒有同時(shí)修改ORDER BY的序號(hào),容易出錯(cuò)。
  • 指定準(zhǔn)確列名

    • SELECT .....
      ORDER BY col1,col2

指定順序

  • DESC/ASC

    • 位置

      • 對(duì)應(yīng)列名后
    • 默認(rèn)為ASC,可省略

第4章 過濾數(shù)據(jù):WHERE

基本操作符

  • 不等于:<>/!=

    • MSSQL和MYSQL兩者都可使用
    • 可以用于字符串匹配檢查
  • 不大于,不小于:!>, !<

  • BETWEEN

    • 支持字符串,日期/時(shí)間,數(shù)值的比較
  • NULL值的比較檢測

    • IS NULL/IS NOT NULL

      • 專門用于NULL值得匹配
    • <=>

      • 當(dāng)且僅當(dāng)兩個(gè)值都為NULL時(shí)才返回NULL
    • 不能使用=/<>來對(duì)NULL值進(jìn)行比較或檢驗(yàn)

    • MYSQL的NULL值處理(RUNOOB)

第5章 高級(jí)數(shù)據(jù)過濾

AND

OR

  • 注意:AND優(yōu)先級(jí)高于OR。多使用括號(hào)確立優(yōu)先級(jí),即使知曉優(yōu)先級(jí)。

IN

  • 語法

    • col in (a,b,c) 等價(jià)于col1 =a or col1 = b or col =c
  • 優(yōu)點(diǎn)

    • 比對(duì)應(yīng)的OR語句更快
    • 更直觀
    • 配合其他select查詢進(jìn)行嵌套

NOT

  • 作用

    • 否認(rèn)其后的條件
  • 位置

    • 位于其他判斷關(guān)鍵詞前:NOT IN

第6章 通配符:LIKE

%

  • 作用

    • 任意字符出現(xiàn)任意次數(shù)

      • 任意字?jǐn)?shù):可以匹配0個(gè)字符

      • 一個(gè)使用場景:字段后填補(bǔ)的空格的解決

        • 在匹配字符串后再加一個(gè)%,來匹配空格
  • 語法

    • SELECT *
      FROM Customers
      WHERE cust_name LIKE 'F%'
  • 不匹配NULL

    • '%'不會(huì)匹配為NULL的行
  • ACCESS 使用的是*

下劃線_

  • 作用

    • 僅匹配單個(gè)字符,且不可匹配0個(gè)字符

字符集匹配

  • [ ]

    • 作用

      • 匹配字符集
    • 使用

      • SQL SERVER

        • SELECT *
          FROM Customers
          WHERE cust_name LIKE '[FV]%';
    • 語法

      • SELECT *
        FROM Customers
        WHERE cust_name RLIKE '^[FV]';
  • 正則表達(dá)式RLIKE(FOR MYSQL)

    • MYSQL不支持使用[]匹配字符集

    • MySQL 中使用 REGEXP 或 NOT REGEXP (或 RLIKE 和 NOT RLIKE) 和正則表達(dá)式來實(shí)現(xiàn)字符串匹配。

    • 語法

      • SELECT *
        FROM course
        WHERE Tno REGEXP '^[張王].*'
    • RUNOOB鏈接

^

  • 作用

    • 對(duì)[ ]進(jìn)行否定:即不在方擴(kuò)內(nèi)的字母才能夠匹配
  • 使用

    • [^JMK]

注意點(diǎn)

  • 使用技巧

    • ① 不要過度使用通配符
    • ② 盡量不要在搜索模式的開始使用通配符
    • ③ 特別注意通配符位置的正確使用
    • ④默認(rèn)不區(qū)分大小寫

第7章 創(chuàng)建計(jì)算字段

位置

  • 緊貼在SELECT后

別名(ALIAS)

  • 作用

    • 一個(gè)字段或值的替換名
    • 為拼接等字符操作創(chuàng)建的字段提供名稱
  • 使用

    • AS

      • MYSQL,MSSQL都可以省略 AS

拼接字段(concatenate)

  • SQL SERVER

    • +(使用與Python相似)
  • Oracle,SQLite等

    • ||
  • MySQL,MariaDB

    • Concat()語句

      • SELECT CONCAT(id, name, work_date)
        FROM employee_tbl;

算術(shù)計(jì)算

  • +-*/
  • ()改變計(jì)算順序

第8章 使用函數(shù)處理數(shù)據(jù)

DBMS差異:函數(shù)在各DBMS的通用度較低,只有少數(shù)函數(shù)通用。

  • 可移植

    • 代碼可在不同系統(tǒng)上運(yùn)行
    • 眾多程序員建議只使用可移植的函數(shù)
  • 建議

    • 使用函數(shù)時(shí),盡量進(jìn)行注釋,以幫助其他DBMS系統(tǒng)的使用者理解。

使用函數(shù)

  • 字符處理

    • TRIM/RTRIM/LTRIM

      • 去除空格
    • UPPER/LOWER

      • 轉(zhuǎn)化為大/小寫
    • LEFT/RIGHT

      • 返回字符左/右指定長度的字符

      • 使用

        • LEFT('ZENG'',2)
          返回: ‘ZE'
    • SOUNDEX

      • 匹配發(fā)音類似的項(xiàng)

      • 使用

        • SOUNDEX(colname) = SOUNDEX('charact')
  • 日期和時(shí)間處理

    • 可移植性最差
    • ONENOTE有網(wǎng)頁裁剪
  • 數(shù)值處理函數(shù)

    • ABS

      • 絕對(duì)值
    • EXP

      • 自然底數(shù)的指數(shù)函數(shù)
    • SQRT

      • 平方根
    • PI

      • 圓周率
    • COS/SIN/TAN

      • 三角函數(shù)
    • MYSQL數(shù)值函數(shù)(RUNOOB)

第9章 匯總數(shù)據(jù)

匯集數(shù)據(jù)

  • COUNT

    • 計(jì)行數(shù)

      • count(*)

        • 返回總行數(shù)
      • count(col_name)

        • 返回col_name中非空行數(shù)
  • MAX

  • MIN

  • AVG

  • SUM

  • MIN,MAX,AVG,SUM的括號(hào)內(nèi)都能進(jìn)行列之間的數(shù)值計(jì)算

聚集函數(shù)內(nèi)部的可用參數(shù)

  • DISTINCT

    • 作用

      • 聚集不同的值
    • 用法

      • AGG_FUNC(DISTINCT col_name)
  • TOP/TOP PERCENT

    • 僅支持sqlserver

組合聚集函數(shù)

  • 一個(gè)SELECT語句可以包含多個(gè)聚集函數(shù)

  • 舉例

    • SELECT COUNT(*) AS num_itesm,
      MIN(prod_price) AS min_price

第10章 分組數(shù)據(jù)

創(chuàng)建分組:GROUP BY

  • 位置

    • WHERE后,ORDER前
  • 注意點(diǎn)

    • ONLY_FULL_GROUP_BY參數(shù)

      • 參數(shù)為打開狀態(tài)時(shí)

        • 除聚集語句(COUNT,SUM,MAX等),所有SELECT中出現(xiàn)的列名,都必須在GROUP BY中出現(xiàn)。

過濾分組:HAVING

  • 與WHERE的關(guān)系

    • 基本語法與WHERE一致,但位置位于GROUP BY后
    • WHERE 過濾行,而HAVING過濾組
  • 使用

    • 一定是配合GROUP BY使用,一定是對(duì)分組進(jìn)行過濾

    • 可以與WHERE共同使用(兩者對(duì)行和分組進(jìn)行過濾,不互斥)

    • 舉例

      • SELECT col1,FUC(col2)
        FROM table1
        WHERE col3>0
        GROUP BY col1
        HAVING FUNC(col2) >0
      • SELECT order_num,SUM(quantity*item_price) as total_price
        FROM OrderItems
        GROUP BY order_num
        HAVING total_price>1000

第11章 使用子查詢

定義

  • 嵌套在其他查詢中的查詢

作用

  • 利用子查詢進(jìn)行過濾

    • 使用

      • SELECT col1
        FROM table1
        WHERE col2 = (SELECT col2
        FROM table2
        WHERE con1)
    • 注意

      • 子查詢的SELECT只能用來返回單列,不能返回多個(gè)列
  • 將子查詢做為一個(gè)字段

    • 使用

      • SELECT cust_name,
        cust_state,
        (SELECT COUNT(*)
        FROM Orders
        WHERE Orders.cust_id=Customers.cust_id) AS orders
        FROM Customers
        ORDER BY cust_name
    • 注意

      • WHERE條件處要使用完全限定名
      • 等價(jià)聯(lián)結(jié)語句

第12章 連接表

聯(lián)結(jié)表

  • 內(nèi)聯(lián)結(jié)

    • 使用

      • 內(nèi)聯(lián)結(jié)(inner join)

        • SELECT vend_name,prod_name,prod_price
          FROM Vendors INNER JOIN Products
          ON Vendors.prod_id = Products.prod_id

          • 解釋

            • SELECT 的列后的各列名,來自兩個(gè)以上的不同表
              FROM 各名來自的表名
              WHERE語句指示匹配列(注意使用帶表名的完全限定名)

              • 缺少WHERE/ON的聯(lián)結(jié)條件語句,將返回m*n行的笛卡爾積表。m,n為兩表各自的行數(shù)。
      • 等值語句

        • SELECT vend_name,prod_name,prod_price
          FROM Vendors,Products
          WHERE Vendors.prod_id = Products.prod_id
      • 聯(lián)結(jié)多個(gè)表

        • 可以通過多個(gè)聯(lián)結(jié)連接多個(gè)表
    • 可用于替代子查詢

      • 子查詢

        • SELECT cust_name,cust_contact
          FROM Customers
          WHERE Customers.cust_id in(
          SELECT cust_id
          FROM Orders
          WHERE order_num in(
          SELECT order_num
          FROM OrderItems
          WHERE prod_id='RGAN01'
          )
          )
      • 等價(jià)內(nèi)聯(lián)結(jié)語句

        • SELECT cust_name,cust_contact
          FROM Customers
          WHERE Customers.cust_id in(
          SELECT cust_id
          FROM Orders
          WHERE order_num in(
          SELECT order_num
          FROM OrderItems
          WHERE prod_id='RGAN01'
          )
          )
    • 使用建議及注意

      • 根據(jù)SELECT 需求的列選擇最少的表格及聯(lián)結(jié)
      • 表格盡量少,使用的聯(lián)結(jié)盡量少。 以節(jié)省運(yùn)算力
      • 需滿足引用完整性

第13章 高級(jí)聯(lián)結(jié)

表別名

  • 在FROM語句中定義

  • SQL SERVER中,F(xiàn)ROM語句最先運(yùn)行,因此表別名可在SELECT語句中的任意階段被使用。

  • 作用

    • 縮短SQL語句
    • 可以在一條語句中使用同一表多次,且避免歧義

使用不同類型的聯(lián)結(jié)

  • 自聯(lián)結(jié)

    • 需要自己控制返回的列,來避免列重復(fù)

    • 使用場景

      • 替代需要自身子查詢的場景

        • SELECT *
          FROM OrderItems oi1,OrderItems oi2
          WHERE oi1.order_item=oi2.order_item AND
          oi2.prod_id='BR01'
  • 自然聯(lián)結(jié)

    • SELECT *
      FROM Customers NATURAL JOIN Orders
  • 自然連接和內(nèi)聯(lián)結(jié)的關(guān)系和區(qū)別

    • 自然聯(lián)結(jié)是特殊的內(nèi)聯(lián)結(jié),自然連接自動(dòng)尋找相同的列名作為匹配項(xiàng)
    • 內(nèi)連接自己指定聯(lián)結(jié)列(ON/WHERE指定),SELECT 后為*。
    • 兩者返回的列數(shù)相同。
    • 但自然聯(lián)結(jié)不包含兩表用作匹配的列不相同的行,而inner join包含不同的列。
    • INNER JOIN 配合USING(col list) 可以達(dá)到與natural join 相同的結(jié)果
    • 小總結(jié):NATURAL JOIN=SELECT * FROM TABLE1,TABLE2 WHERE table1.同名columns=table2.同名columns
    • 詳見diigo標(biāo)注部分
  • 外聯(lián)結(jié)

    • 與內(nèi)聯(lián)結(jié)區(qū)別

      • 包含了那些在相關(guān)表中沒有關(guān)聯(lián)的行
    • 使用

      • LEFT OUTER JOIN

      • RIGHT OUTER JOIN

      • FULL OUTER JOIN

        • MSSQL 支持
        • MYSQL,ACCESS,SQLite等不支持

第14章 組合查詢

UNION

  • 作用

    • 組合多個(gè)查詢結(jié)果
    • 每個(gè)組合查詢都有等效的單個(gè)使用復(fù)WHERE的語句
  • 使用

    • SELECT col1,col2,FUNC(col3)
      ...
      UNION
      SELECT col1,col2,FUNC(col3)
  • 使用注意點(diǎn)

    • ①包含兩個(gè)及兩個(gè)以上的SELECT語句
    • ②每個(gè)查詢都具有相同的列名或別名,表達(dá)式或聚集函數(shù)(不要求順序一致)
    • ③列類型必須可兼容(不一定相同,但需要可相互轉(zhuǎn)換)
    • ④查詢多個(gè)表時(shí),若表名不匹配可以使用別名,別名一致即可,不要求原列名一致。
    • ⑤使用ORDER BY,只需在最后一個(gè)SELECT語句中指定排序方式即可作用在整個(gè)查詢結(jié)果上

UNION ALL

  • UNION ALL保留各個(gè)SELECT語句中相同的行(UNION和等效的WHRER語句都默認(rèn)去除)

EXCEPT/MINUS

  • 檢索只在第一個(gè)SELECT檢索的表中存在而不在第二個(gè)SELECT查詢結(jié)果中的行

  • 舉例

    • SELECT cust_id,cust_name,cust_contact
      FROM Customers
      WHERE cust_name='FUn4All'
      EXCEPT
      SELECT cust_id,cust_name,cust_contact
      FROM Customers
      WHERE cust_contact='Jim Jones'
  • 注意

    • ①僅部分DBMS支持
    • ②MSSQL使用EXCEPT

INTERCEPT

  • 檢索在兩個(gè)表格中都存在的行(交集∩)

  • 注意

    • ①部分DBMS支持
    • ②MSSQL支持
    • ③可以使用FULL OUTER JOIN 代替

第15章 插入數(shù)據(jù)

INSERT

  • 插入完整的行

    • 實(shí)例

      • INSERT INTO table1(col1_name,col2_name,..,coln_name)
        VALUES(col1_value,col2_value,...,coln_value);

        • 注意

          • 兩個(gè)tuple的順序互相一致即可,不需要與原表的列順序一致
          • table1后的表名tuple可以省略。但不建議,因?yàn)槭÷栽搕uple后VALUES的列tuple順序必須與table1的實(shí)際列順序一致。
  • 插入部分行

    • 允許條件

      • 被省略的列允許NULL或者設(shè)置了默認(rèn)值
    • 實(shí)例

      • 與插入完整行相似,只是兩個(gè)tuple可以不完整。
      • INSERT INTO后的tuple不可省略
  • 注意

    • 一個(gè)INSERT INTO 語句只能插入一行內(nèi)容

INSERT INTO ...SELECT

  • 實(shí)例

    • INSERT INTO table1(col1_name,col2_name,..,coln_name)
      SELECT col1_value,col2_value,...,coln_value
      FROM table2
      WHERE...

      • 注意

        • SELECT語句后的列名序列不需要使用括號(hào)
        • 兩個(gè)列名序列的名稱不要求一致
        • 兩個(gè)列名序列的位置必須正確
  • 注意

    • INSERT INTO...SELECT是特殊的INSERT INTO 語句??梢愿鶕?jù)SELECT返回結(jié)果的行數(shù)插入數(shù)據(jù)。即可以一次性插入多行。

SELECT INTO

  • 作用

    • 將SELECT選出的表插入一個(gè)新創(chuàng)立的table1中
  • 實(shí)例

    • SELECT col_name_tuple
      INTO table1
      FROM table2,table3
      WHERE...
      GROUP BY...
      ORDER BY...

      • 注意

        • 所有SELECT語句中可用的子語句和方法都可以用
        • table1是在該語句中新創(chuàng)立的表
  • 使用場景

    • 測試新的SQL語句前,創(chuàng)立一個(gè)新的表格用做測試
  • MYSQL不支持SELECT INTO

    • MYSQL 如何創(chuàng)建一個(gè)表的復(fù)制?:

      • show create table orders + insert into ... SELECT

第16課 更新和刪除數(shù)據(jù)

更新數(shù)據(jù)

  • UPDATE SET

    • 實(shí)例

      • UPDATE table1
        SET col_name1 = col_value1,
        col_name2 = col_value2
        WHERE cons
  • UPDATE SELECT

    • 基本格式

      • UPDATE A a INNER JOIN B b ON b.key_id = a.key_id
        SET a.val = 2
        WHERE b.satisfy = 1
    • LEFT JOIN/RIGHT JOIN 配合GOURP BY 來修改表格

      • UPDATE course c
        RIGHT JOIN (
        SELECT Cno,AVG(score) avg_score
        FROM sc
        GROUP BY Cno
        HAVING avg_score>=75
        ) sc
        ON c.Cno=sc.Cno
        SET c.Tno="厲害老師";

SELECT *
FROM course;

  • UPDATE FROM

刪除數(shù)據(jù)

  • 刪除某表中的部分?jǐn)?shù)據(jù)

    • DELETE FROM

      • DELETE FROM table
        WHERE cons
  • 刪除全部數(shù)據(jù)

    • DELETE FROM table1

    • TRUNCATE table1

      • 比DELETE更快

使用更新和刪除注意點(diǎn)

  • 建議UPDATE或刪除前使用SELECT進(jìn)行測試,保證進(jìn)行正確的操作(對(duì)WHERE語句)
  • 務(wù)必考慮并實(shí)施引用完整性的數(shù)據(jù)庫
  • 部分DBMS有強(qiáng)制使用WHERE的選項(xiàng),盡量使用

第17章 創(chuàng)建和操縱表

創(chuàng)建表

  • 實(shí)例

    • CREATE TABLE table_name
      (col1_name char(10) NOT NULL,
      col2_name DECIMAL(8,2) NULL,
      ...
      coln_name (data_type) (NULL/NOT NULL)
      )
  • 注意點(diǎn)

    • 大部分DBMS NULL/NOT NULL一項(xiàng)默認(rèn)NULL,因此NULL可省略

    • 設(shè)定默認(rèn)值:對(duì)應(yīng)列的NULL/NOT NULL后添加DEFAULT default_value(常使用日期函數(shù)做為默認(rèn)值)

      • 日期函數(shù)

        • MSSQL

          • GETDATE()
        • MYSQL

          • CURRENT_DATE()
    • 注意一個(gè)字段的名稱,類型,是否為空之間是不需要空格的。

  • 建議

    • 盡量給定DEFAULT值,而定義為NULL

更新表

  • 注意點(diǎn)

    • 盡量在創(chuàng)立表時(shí),就考慮好未來需求,減少表的修改。
    • 大多數(shù)表支持新增列或者更改無內(nèi)容填充的列的操作
    • 大多數(shù)表不支持 刪除或更改表中的列,重新命名表中的列,對(duì)已有內(nèi)容填充的表的修改
  • 示例

    • 新增列

      • ALTER TABLE table1
        ADD col_name data_type NULL/NOTNULL
      • 大多數(shù)DBMS支持
    • 刪除列

      • ALTER TABLE table1
        DROP col_name
      • DBMS 支持通用度不高
    • 修改表

      • ALTER CHANGE
      • ALTER MODIFY
    • 修改表名

      • ALTER TABLE testalter_tbl RENAME TO alter_tbl;
    • 復(fù)雜表更改的一般流程

      • 按照新需求創(chuàng)建一個(gè)新的表格
      • 復(fù)制原表仍需要的數(shù)據(jù)內(nèi)容到新表(UPDATE SELECT)
      • 檢查插入數(shù)據(jù)后的新表
      • 更改原表表名或直接刪除
      • 將新表更改為原表表名
      • 根據(jù)需要,重新建立觸發(fā)器,儲(chǔ)存過程,索引和外鍵
    • 注意點(diǎn)

      • ALTER的使用需盡量小心,更改前做好備份
    • RUNNOOB關(guān)于ALTER TABLE

刪除表

  • DROP table1

    • 遵循引用完整性的等關(guān)系規(guī)則
  • MYSQL

    • DROP TABLE table_name

重命名表格

  • sp_rename 儲(chǔ)存過程

    • MSSQL
  • RENAME

    • MSSQL,SQLite外的大多數(shù)DBMS

第18課 使用視圖

視圖作用

  • 重用SQL語句,簡化操作
  • 權(quán)限管理,只允許查看視圖內(nèi)容,而非整個(gè)表
  • 展示與原表不同的數(shù)據(jù)格式和內(nèi)容

注意

  • 每次使用視圖,都會(huì)重新運(yùn)行一次查詢。因此復(fù)雜視圖會(huì)影響性能

限制規(guī)則

  • 命名唯一

  • 可進(jìn)行權(quán)限管理

  • 可以嵌套(但嵌套會(huì)提高復(fù)雜度,占用更多運(yùn)算力)

  • 眾多DBMS進(jìn)制在視圖的定義時(shí)的查詢語句中使用ORDER BY

    • SQL SERVER不允許。但是如果SELECT語句后添加TOP 關(guān)鍵字,則可以使用。
  • 部分DBMS將視圖設(shè)置為只讀,即不可更新視圖內(nèi)容并寫入底層原表

  • 部分DBMS允許創(chuàng)建一種視圖,視圖限制原表內(nèi)容修改會(huì)導(dǎo)致視圖行數(shù)減少的操作

  • 參照具體的DBMS

創(chuàng)建視圖

  • CREATE VIEW view_name AS
    SELECT 語句

使用建議

  • 創(chuàng)建不綁定特定數(shù)據(jù)的視圖(如限定某個(gè)id為具體值),而在使用視圖時(shí)再進(jìn)行限定。

第19課 使用儲(chǔ)存過程

定義

  • 為以后使用而保存的一條或多條SQL語句。可以視為批處理(但不只是批處理)

使用

  • 計(jì)Customers中帶郵件的行數(shù)

    • 創(chuàng)建

      • CREATE PROCEDURE MailingListCounting
        AS
        DECLARE @cnt INTEGER
        SELECT @cnt = COUNT(*)
        FROM Customers
        WHERE NOT cust_email IS NULL
    • 使用

      • DECLARE @RETURNVALUE INT
        @RETURNVALUE = MailingListCounting
        SELECT @RETURNVALUE
  • 在ORDERS表單插入新訂單

    • 創(chuàng)建方法①

      • CREATE PRODUCE NewOrder @cust_id CHAR(10)
        AS
        DECLARE @order_num INTEGER
        SELECT @order_num=MAX(order_num)
        FROM Orders
        SELECT @order_num = @order_num+1
        INSERT INTO Orders(order_num,order_date,cust_id)
        VALUES(@order_num,GETDATE(),@cust_id)

RETURN @order_num

- 創(chuàng)建方法②

    - CREATE PRODUCE NewOrder @cust_id CHAR(10)

AS
INSERT INTO Orders(cust_id)
VALUES(cust_id)

SELECT cust_num = @@IDENTITY

        - 方法②的日期由創(chuàng)建表格時(shí)的DEFAULT GETDATE()給出

order_num由標(biāo)識(shí)字段(identity field)給出

注意點(diǎn)

  • 使用頻率遠(yuǎn)高于創(chuàng)建,創(chuàng)建與使用權(quán)限可分隔

第20課 管理事務(wù)處理

事務(wù)處理

  • 可回退的語句

    • INSERT
    • UPDATE
    • DELETE
  • 不可回退的語句

    • SELECT
    • DROP
    • CREATE

控制事務(wù)處理

  • 事務(wù)(TRANSCATION)

    • BEGIN TRANSCATION
      ...
      COMMIT TRANSCATION
    • 省略號(hào)部分,要么全部執(zhí)行,如果中間某句出錯(cuò),則全部不執(zhí)行
  • 回滾(ROLLBACK)

    • 作用

      • 使數(shù)據(jù)庫回到上次COMMIT或者TRANCATION的狀態(tài)
  • 保留點(diǎn)(SAVE)

    • 實(shí)例

      • SAVE TRANSACTION delete1;

ROLLBACK TRANSACTION delete1:

- 注意

    - 每個(gè)回滾點(diǎn)的名稱必須唯一(本實(shí)例為delete1)
    - 常用回滾條件:

IF @@ERROR <>0 ROLLBACK TRANSCATION delete1;

補(bǔ)充

ONLY_FULL_GROUP_BY

  • Mysql的WHERE 語句的聯(lián)結(jié)Group by似乎不要求聚合函數(shù)外的所有列。但JOIN ON 要求有

    • SELECT c.cust_id,c.cust_name,c.cust_state,COUNT(o.order_num) nums
      FROM Customers c,Orders o
      WHERE c.cust_id=o.cust_id
      GROUP BY c.cust_id;

    • ANSWER

      • sql_mode下的ONLY_FULL_GROUP_BY默認(rèn)打開

大小寫區(qū)分

  • 默認(rèn)大小寫不區(qū)分,但可以通過設(shè)置更改為敏感

注釋

  • 符號(hào)

    • 單行注釋

      • -- comments
    • 多行注釋

      • /* comments1
        comments2 */

數(shù)值型補(bǔ)零前后的值大小相同

  • 3.49,3.490大小相同,條件篩選不用區(qū)分

MSSQL語句順序

  • 運(yùn)行順序

    • (1) FROM < left_table>

(3) < join_type> JOIN < right_table> (2) ON < join_condition>

(4) WHERE < where_condition>

(5) GROUP BY < group_by_list>

(6) WITH {cube | rollup}

(7) HAVING < having_condition>

(8) SELECT (9) DISTINCT (11) < top_specification> < select_list>

(10) ORDER BY < order_by_list>

    - FORM: 對(duì)FROM的左邊的表和右邊的表計(jì)算笛卡爾積。產(chǎn)生虛表VT1

ON: 對(duì)虛表VT1進(jìn)行ON篩選,只有那些符合<join-condition>的行才會(huì)被記錄在虛表VT2中。
JOIN: 如果指定了OUTER JOIN(比如left join、 right join),那么保留表中未匹配的行就會(huì)作為外部行添加到虛擬表VT2中,產(chǎn)生虛擬表VT3, rug from子句中包含兩個(gè)以上的表的話,那么就會(huì)對(duì)上一個(gè)join連接產(chǎn)生的結(jié)果VT3和下一個(gè)表重復(fù)執(zhí)行步驟1~3這三個(gè)步驟,一直到處理完所有的表為止。
WHERE: 對(duì)虛擬表VT3進(jìn)行WHERE條件過濾。只有符合<where-condition>的記錄才會(huì)被插入到虛擬表VT4中。
GROUP BY: 根據(jù)group by子句中的列,對(duì)VT4中的記錄進(jìn)行分組操作,產(chǎn)生VT5.
CUBE | ROLLUP: 對(duì)表VT5進(jìn)行cube或者rollup操作,產(chǎn)生表VT6.
HAVING: 對(duì)虛擬表VT6應(yīng)用having過濾,只有符合<having-condition>的記錄才會(huì)被 插入到虛擬表VT7中。
SELECT: 執(zhí)行select操作,選擇指定的列,插入到虛擬表VT8中。
DISTINCT: 對(duì)VT8中的記錄進(jìn)行去重。產(chǎn)生虛擬表VT9.
ORDER BY: 將虛擬表VT9中的記錄按照<order_by_list>進(jìn)行排序操作,產(chǎn)生虛擬表VT10.
LIMIT:取出指定行的記錄,產(chǎn)生虛擬表VT11, 并將結(jié)果返回。

        - 理解:FROM 中定義的別名,可以全局引用
  • 書寫順序

    • SELECT DISTINCT
      FROM
      JOIN
      ON
      WHERE
      GROUP BY
      HAVING
      ORDER
      LIMIT
  • 因此別名在SELECT創(chuàng)建,則只能在SELECT和ORDER BY語句中使用。

NULL不是空字符串

  • NULL是沒有值,而“”可以理解為0長度的字符串
SQL 必知必會(huì).png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容