SQL命令(mysql必知必會筆記)

第一章

  1. 什麼是數據庫
    數據庫是一個以某種有組織的方式存儲的數據的集合,需要區分數據庫和數據庫軟件,數據庫軟件稱爲DBMS(數據庫管理系統),數據庫是通過DBMS創建和操作的容器。我們並不能直接訪問數據庫,而是通過DBMS來訪問數據庫。

  2. 表是某種特定類型數據的結構化清單,表是一種結構化文件,可用來存儲某種特定類型的數據。數據庫中每個表都有自己的名字,用來標示自己,此名字是唯一的。
  3. 模式
    模式是關於數據庫和表的佈局及特性的信息,可以用來描述數據庫中特定的表以及整個數據庫
  4. 列與行
    列是表中的一個字段,所有表都是由一個或多個列組成的。數據庫中每個列都有相應的數據類型,數據類型定義列可以存儲的數據類型
    行是表中的一個記錄,每一行是一個記錄
  5. 主鍵
    主鍵是表的一列(或一組列),其值可以唯一區分表中的每一行
    表中的任意一列都可以作爲主鍵,只要它滿足:
    • 任意兩行都不具有相同的主鍵值
    • 每一行都必須具有一個主鍵值(主鍵列不允許NULL值)

使用主鍵的好習慣:
- 不更新主鍵列中的值
- 不重用主鍵列的值
- 不在主鍵列中使用可能會更改的值

  1. 什麼是SQL
    SQL是結構化查詢語言(Structured Query Language),是一種專門用來與數據庫通信的語言
    SQL有如下優點:
    • SQL不是某個特定數據庫供應商專有的語言,學習此語言可以喝幾乎所有的數據庫打交道
    • SQL簡單易學
    • SQL儘管看上去簡單,但它實際上是一種強有力的語言,靈活使用其語言元素,可以進行非常複雜和高級的數據庫操作

第二章 MySQL簡介

  1. 什麼是MySQL
    數據的所有存儲,檢索,管理和處理實際上由數據庫軟件完成,MySQL是一種DBMS,即它是一種數據庫軟件
    MySQL的優點:
    • 成本,MySQL是開源的,一般可以免費使用
    • 性能,MySQL執行非常快
    • 可信賴,一些主流的大公司都在使用它
    • 簡單,MySQL很容易安裝和使用
  2. DBMS的分類
    DBMS分爲兩類:
    • 基於共享文件系統的DBMS(Microsoft AccessFileMaker)
    • 基於客戶機-服務器的DBMS,如MySQLOracleMicrosoft SQL Server
      服務器部分是負責所有數據的訪問和處理的軟件,這個軟件運行在稱爲數據庫服務器的計算機上,與數據庫打交道的只有服務器軟件,客戶機是與用戶打交道的軟件。客戶機軟件提交請求,服務器軟件處理請求,並將結果送回到客戶機軟件
  3. MySQL工具
    • mysql命令行實用程序
    • MySQL Administrator
    • MySQL Query Browser

第三章 使用MySQL

  1. 連接
    爲了連接到MySQL,需要一下信息:
    • 主機名(計算機名),如果連接到本地MySQL服務器,爲localhost
    • 端口(如果使用默認端口3306之外的端口)
    • 一個合法的用戶名
    • 用戶口令(如果需要)
  2. 選擇數據庫
    在最初連接到MySQL時,沒有任何數據庫打開供我們使用,需要選擇一個數據庫,使用USE關鍵字,USE語句不返回任何結果,依賴於使用的客戶機,顯示某種形式的通知
  3. 瞭解數據庫和表
    數據庫,表,列,用戶,權限等信息被存儲在數據庫和表中,可用SHOW命令來顯示這些信息
    • show databases
      返回可用數據庫的一個列表,包含在這個表中的可能是MySQL內部使用的數據庫,如mysqlinformation_schema
    • show tables
      返回當前選擇的數據庫內可用表的列表
    • show columns form xx 也可以用describe xx
      顯示錶列,對於給定的表名,每個字段返回一行,行中包括字段名,數據類型,是否允許爲NULL,鍵信息,默認值以及其它信息
    • show status
      用於顯示廣泛的服務器狀態信息
    • show create database xxshow create table xx
      用於顯示創建特定數據庫或表的信息
    • show grants'
      用來顯示授予用戶的安全權限 </li>
      <li>
      show errorsshow warnings`
      用來顯示服務器錯誤或警告信息

第四章 檢索數據

  1. select語句
    它的用途是從一個或多個表中檢索信息,爲了使用select檢索表數據,必須至少給出兩條信息:
    • 想選擇什麼
    • 從什麼地方選擇
  2. 檢索單個列
    select xx from yy
    利用select語句從yy表中檢索出名爲xx的列,所需的列名在select關鍵字後給出,from關鍵字後跟表名。返回的數據沒有過濾,也沒有排序
  3. 檢索多個列
    使用select關鍵字,需要給出多個列名,列名之間必須以逗號分隔
    select xx,yy from zz
    這條語句可以返回兩個列
  4. 檢索所有列
    使用通配符*來達到
    select * from xx
    如果給定一個通配符*,則返回表中的所有列,列的順序一般是列在表定義中出現的順序
  5. 檢索不同的行
    解決辦法是使用distinct關鍵字,此關鍵字指示MySQL只返回不同的值
    select distinct xx from yy
    這條語句只返回不容的xx行,如果使用distinct關鍵字,它必須放在列名的前面
  6. 限制結果
    爲了返回第一行或者前幾行,可以使用limit子句
    select xx from yy limit 4
    此語句使用select語句檢索單個列,limit 4指示MySQL返回不多於4行
    select xx from yy limit 4,4
    limit 3,4指示MySQL返回從行3開始的以下4行,第一個數爲開始位置,第二個數爲要檢索的行數(第一行從0開始),MySQL 5支持limit的另一種替代語法limit 4 offset 3
  7. 使用完全限定的表名和列名
    • select xx.yy from xx
      這條語句指定了表xx中的具體列(yy)
    • select xx.yy from zz.xx
      這條語句指定了zz數據庫中的具體表(xx)

第五章 排序檢索數據

  1. 排序數據
    關係數據庫設計理論認爲,如果不明確規定排序順序,則不應該假定檢索出的數據的順序有意義
    • 子句
      SQL語句由子句構成,有些子句是必需的,有些子句是可選的
      爲了明確的排序select語句檢索出的數據,可使用order by子句,order by子句取一個或多個列的名字,據此對輸出進行排序
      select xx from yy order by xx
      排序所使用的列可以爲顯示的列,也可以是其它列
  2. 按多個列排序
    經常需要按不止一個列進行數據排序(如果由相同的行,這個很有用)
    select xx from yy order aa,bb
    這個語句的輸出,盡在多個行具有相同的aa值時纔對yy按bb進行排序,如果aa列中所有值都是唯一的,則不會按照bb排序
  3. 指定排序方向
    數據排序不僅限於升序排序,這只是默認的排序順序,還可以使用order by子句以降序排序,爲了進行降序排序,需要使用desc關鍵字
    • select * from xx order by yy desc
      這條語句按照yy列的降序來排序
    • select * from xx order by yy desc,zz
      這條語句先對yy進行降序排序,然後在對zz進行升序排序。desc關鍵字只應用到位於其前的列名,如果想在多列上進行降序排序,必須對每個列制定desc關鍵字。與desc相反的關鍵字是asc,沒多大用處,因爲升序是默認的
    • select * from xx order by yy desc limit 1
      使用order bylimit組合,可以找出一個列中最高或最低的值,limit子句位於order by子句之後

第六章 過濾數據

  1. 使用where子句
    數據庫很少需要檢索所有行,至檢索所需數據需要制定搜索條件,搜索條件也稱過濾條件。在select語句中,數據根據where子句中指定的搜索條件進行過濾,where子句在from子句之後給出

    select xx from yy where xx = val
    這條語句只返回xx=val的行,當同時使用order by子句和where子句時,應將order by子句放到where子句之後,否則將發生錯誤

  2. where子句操作符
    MySQL支持的條件操作符:

    • = 等於
    • <> 不等於
    • != 不等於
    • < 小於
    • <= 小於等於
    • /> 大於
    • />= 大於等於
    • between 在指定的兩個值之間

    • 檢查單個值

    • 不匹配檢查 !=
    • 範圍值檢查 使用between操作符,指定的兩個值必須用and分割
    • 空值檢查 where xx is null
      在創建表時,表設計人員可以指定其中列是否可以不包含值,在一個列不包含值時,稱其爲包含空值NULL.空值和0,空字符串,空格不同

第七章 數據過濾

  1. 組合where子句
    MySQL允許給出多個where子句,這些子句可以兩種方式使用:
    • and子句方式
    • or子句方式
      以上兩個操作符稱爲邏輯操作符
    • and操作符
      select xx,yy from zz where aa = val1 and bb < val2
      and指示DBMS只返回滿足所有給定條件的行,還可以條件多個過濾條件,每添加一條就要使用一個and
    • or操作符
      與and操作符不同,它知識MySQL檢索匹配任一條件的行
      select xx,yy from zz where aa = val1 or aa = val2
      or操作符高速DBMS匹配任一條件而不是同時匹配兩個條件
    • 計算次序
      where可包含任意數目的and和or操作符,允許兩者結合進行復雜和高級的過濾。and的優先級高於or的優先級,優先計算and操作符,爲了解決計算次序問題,where子句可以使用圓括號
  2. in操作符
    圓括號在where子句中還有另外一種用法,in操作符用來指定條件範圍,in取合法值的清單用逗號隔開,全都放在圓括號裏
    select xx from yy where zz in (val1,val2)
    此select語句檢索zz等於val1和val2的所有行,or操作符也能完成相同的功能
    • 爲什麼要用in操作符呢
      • 在使用長的合法清單時,in操作符的語法更清楚直觀
      • 在使用in操作符時,計算次序更容易管理(因爲使用的操作符較少)
      • in操作符一般比or操作符執行的快
      • in的最大優點是可以包含其他select語句,使得能夠動態的建立where子句
    • not操作符
      not操作符只有一個功能,就是否定它之後的所有條件
      select xx from yy where zz not in (val1,val2)
      這條語句匹配val1和val2之外的所有行
      MySQL支持not對in,between和exists子句去反

第八章 用通配符進行過濾

  1. like操作符
    通配符是用來匹配值的一部分的特殊字符
    搜索模式是由字面值,通配符或兩者組合構成的搜索條件
    爲在搜索子句中使用通配符,必須使用like操作符。like指示MySQL後跟的搜索模式利用通配符匹配而不是直接相等匹配進行比較
    • 百分號通配符(%)
      最常使用的通配符是百分號(%),在搜索串中,%表示任何子符出現任意次數
      select xx from yy where zz like 'hello%'
      這條語句檢索任意以hello開頭的詞。%操作符告訴MySQL接受hello之後的任意字符,不管它有多少字符
      select xx from yy where zz like '%hello%'
      通配符可以在搜索模式中任意位置使用,並且可以使用多個通配符。搜索模式%hello%表示匹配任何位置包含文本hello的值
      %代表搜索模式中給定位置的0個,1個或多個字符
      注意where xx like '%'並不能匹配值爲NULL的行
    • 下劃線通配符 (_)
      下劃線只匹配單個字符
  2. 使用通配符的技巧
    通配符搜索處理一般比前面討論的其他搜索所花的時間長,這裏給出通配符的使用技巧:
    • 不要過度使用通配符。如果其他操作符可以達到相同目的,應該使用其他操作符
    • 在確實需要使用通配符時,除非絕對必要,否則不要把它們放在搜索模式的開始處,這樣是最慢的
    • 仔細注意通配符的位置

第九章 用正則表達式進行搜索

  1. 正則表達式
    正則表達式是用來匹配文本的特殊的串(字符集合)。所有種類的程序設計語言,文本編輯器,操作系統等都支持正則表達式
    正則表達式用正則表達式語言建立,正則表達式語言是一種特殊的語言,與任意語言一樣,正則表達式具有我們必須學習的特殊語法和指令
  2. 使用MySQL正則表達式
    正則表達式的作用時匹配文本,將一個模式(正則表達式)與一個文本進行比較。MySQL用where子句對正則表達式提供初步的支持,允許指定正則表達式,過濾select檢索出來的數據。MySQL僅支持正則表達式語言的一個子集

    • 基本字符匹配
      select xx from yy where zz regexp 'hh'
      這條語句看上去非常像使用like的語句。它告訴MySQL:regexp後所跟的東西作爲正則表達式處理
      .是正則表達式語言中一個特殊的字符,它表示匹配任意一個字符

    • like與regexp的區別
      like匹配整個列,如果被匹配的文本在列值中出現,like將不會找到它。regexp在列值內進行匹配,如果被匹配的文本在列值中出現,regexp將會找到它。regexp使用定位符^和$也可以匹配整列

    • 進行or匹配
      爲搜索兩個串之一,使用|
      select xx from yy where zz regexp 'hello|hi'
      這條語句使用正則表達式hello|hi,|爲正則表達式的or操作符,它表示匹配其中之一,因此hello和hi都匹配並返回。
    • 匹配幾個字符之一
      使用[]括起來幾個字符
      select xx from yy where zz regexp '[123]hello'
      這條語句使用了正則表達式[123]hello,[123]定義了一組字符,它的意思是匹配1或2或3。 [123]是[1|2|3]的縮寫,也可以使用後者。[^123]匹配除這些字符外的任何東西
    • 匹配範圍
      例如[1-4]匹配從1到4所有數字,,[a-z]匹配任意字母
      select xx from yy where zz regexp '[1-3]hello'
      這條語句和上面的[123]功能是相同的
    • 匹配特殊字符
      爲了匹配特殊字符,必須用\爲前導。\-表示查找-,\.表示查找.。這種處理就是所謂的轉義。
      爲了匹配\,需要使用\\

    多數正則表達式使用\轉義特殊字符,但MySQL要求使用兩個\轉義(MySQL自己解釋一個,正則表達式庫解釋另一個)

  3. 匹配字符類
    字符類有:
  4. [:alnum:] 任意字母和數字([a-zA-Z0-9])
  5. [:alpha:] 任意字符([a-zA-Z])
  6. [:blank:] 空格和製表([\t])
  7. [:cntrl:] ASCII控制字符
  8. [:digit:] 任意數字([0-9])
  9. [:graph:] 與[:print:]相同,但不包含空格
  10. [:lower:] 任意小寫字母([a-z])
  11. [:print:] 任意可打印字符
  12. [:punct:] 既不在[:alnum:]又不在[:cntrl:]中的任意字符
  13. [:space:] 包括空格在內的任意空白字符([\f\n\r\t\v])
  14. [:upper:] 任意大寫字母([A-Z])
  15. [:xdigit:] 任意十六進制數字([a-fA-F0-9])

  16. 匹配多個實例
    重複元字符:

  17. * 0個或多個匹配
  18. /+ 1個或多個匹配({1,})
  19. ? 0個或1個匹配({0,1})
  20. {n} 指定書目匹配
  21. {n,} 不少於指定書目匹配
  22. {n,m} 匹配數目的範圍(m不超過255)

select xx from yy where zz regexp '\\([0-9] sticks?\\)'
這條語句\(和\)匹配括號,[0-9]匹配任意數字,sticks?匹配stick和sticks(s後的?使s稱爲可選)
使用正則表達式時,編寫的某個特殊的表達式幾乎總是不止一種方法
- 定位符
定位元字符:
- ^ 文本的開始
- $ 文本的結尾
- [[:<:]] 詞的開始
- [[:>:]] 詞的結尾
select xx from yy where zz regexp '^[0-9]\\.'
^匹配串的開始
通過用^開始每個表達式,用$結束每個表達式,可以使regexp與like作用一樣
正則表達式的測試: select 'hello' regexp '[0-9]' 返回0

第十章 創建計算字段

  1. 計算字段
    存儲在數據庫表中的數據一般不是應用程序所需要的格式,我們需要直接從數據庫中檢索出轉換,計算或格式化過的數據,而不是檢索出數據,然後再在客戶機應用程序中重新格式化
    以上就是計算字段發揮的作用,計算字段並不實際存在於數據庫表中,計算字段是運行時在select語句內創建的
    字段(field)基本上與列的意思相同,經常互換使用。只有數據庫知道select語句哪些列是實際的表列,哪些列是計算字段
  2. 拼接字段
    拼接是將值連接到一起構成單個值
    在MySQL的select語句中,可使用Concat()函數來拼接兩個列。多數DBMS使用+或||來實現拼接,MySQL則使用Concat()函數來實現
    Concat()需要一個或多個指定的串,各個串之間用逗號分隔
    select Concat(xx,yy) from zz
    LTrim()和RTrim()分別爲去掉串左邊的空格和去掉串右邊的空格
    • 使用別名
      前面的拼接字段只是一個值,一個未命名的列不能用於客戶機應用中,因爲客戶機沒有辦法引用它,爲了解決這個問題,SQL支持列別名,別名用as關鍵字賦予
      select concat(xx,yy) as xy from zz
      現在列名爲xy,任何客戶機都可以按名引用這個列,就像它是實際的表列一樣,別名有時也稱導出列
  3. 執行算數運算
    select xx*yy as xy from zz
    這條語句將xx與yy相乘的結果作爲xy列名,MySQL支持+,-,*,/基本運算符,圓括號可以用來區分優先級順序

第十一章 使用數據處理函數

  1. 函數
    與大多數計算機語言一樣,SQL支持利用函數處理數據。函數一般在數據上執行,它給數據的轉換和處理提供了方便
  2. 使用函數
    大多數SQL實現支持一下類型的函數:

    • 用於處理文本串,如刪除或填充值,轉換大小寫
    • 用於數值數據進行算術操作,如絕對值,代數運算
    • 用於處理日期和時間值並從這些值中提取特定成分
    • 返回DBMS正使用的特殊信息,如用戶登陸信息,檢查版本細節的系統函數

    • 文本處理函數
      不再詳述

    • 日期和時間處理函數
      不在詳述
    • 數值處理函數
      這些函數一般用於代數,三角或幾何運算

第十二章 彙總數據

  1. 聚集函數
    我們經常需要彙總數據而不用把它們實際檢索出來,爲此MySQL提供了專門的函數。使用這些函數,MySQL查詢可用於檢索數據,以便分析和報表生成,這種類型的檢索例子有以下幾種:
    • 確定表中行數
    • 獲得表中行組的和
    • 找出表列的最大值,最小值和平均值

SQL的5個聚集函數:
- avg() 返回某列的平均值
avg()函數忽略值爲NULL的行
select avg(xx) as avg_xx from yy
這條語句求出xx列的平均值,並將它作爲新的一列返回,avg()只用於單個列,如果爲了獲得多個列的平均值,必須使用多個avg()函數
- count() 返回某列的行數
有兩種用法:
1. 使用count(*)對錶中行的數目進行計數,不管表列中包含的是空值還是非空值
2. 使用count(column)對特定列中具有值的行進行計數,忽略NULL值
- max() 返回某列的最大值
MySQL允許它用來返回任意列中的最大值,包括返回文本中的最大值,在用於文本數據時,如果數據按相應的列排序,則max()返回最後一行,max()忽略列值爲NULL的行
- min() 返回某列的最小值
與max()的功能相反
- sum() 返回某列之和
sum()用來返回指定列值的和。sum()忽略列值爲NULL的行
2. 聚集不同值
以上5個聚集函數都可以如下使用:
- 對所有行執行運算,指定all參數或不給參數(因爲all是默認行爲)
- 只包含不同的值,指定distinct參數
3. 組合聚集函數
select語句可根據需要包含多個聚集函數

select count(*) as num_items 
min(xx) as min_xx
max(xx) as max_xx
avg(xx) as avg_xx
from yy 

第十三章 分組數據

  1. 數據分組
    分組允許把數據分爲多個邏輯組,以便能對每個組進行聚集計算
  2. 創建分組
    分組是在select語句的group by子句中建立的。group by子句指示MySQL分組數據,然後對整個組而不是整個結果進行聚集
    使用group by的一些重要規定:
    • group by子句可以包含任意數目的列,這使得能對分組進行嵌套
    • 如果在group by子句中嵌套了分組,數據將在最後規定的分組上進行彙總
    • group by子句中列出的每個列都必須是檢索列或有效的表達式
    • 除聚集計算語句外,select語句中的每個列都必須在group by子句中給出
    • 如果分組列中具有NULL值,則NULL將作爲一個分組返回
    • group by子句必須出現在where子句之後order by子句之前
  3. 過濾分組
    MySQL還允許過濾分組,規定包括哪些分組,排除哪些分組。MySQL爲此目的提供了另外的子句,那就是having子句,having非常類似於where,唯一的差別是where過濾行,having過濾分組
    • having和where的差別
      where在分組前進行過濾,having在分組後進行過濾
  4. 分組和排序
    • order by與group by的差別
      group by分組的數據可能不是分組的順序,一般在使用group by子句時,應該也給出order by子句,這是保證數據正確排序的唯一方法
  5. select子句順序
    select form where group by having order by limit

第十四章 使用子查詢

  1. 子查詢
    查詢:任何SQL語句都是查詢,此術語一般指select語句
    SQL還允許創建子查詢,即嵌套在其他查詢中的查詢
  2. 利用子查詢進行過濾
    可以把一條select語句返回的結果用於另一條select語句的where子句中。先執行子查詢,子查詢返回的結果用於外層的where子句
    在where子句中使用子查詢能夠編寫功能很強並且很靈活的SQL語句,對於能嵌套的子查詢數目沒有限制
  3. 作爲計算字段使用子查詢
    使用子查詢的另一方法是創建計算字段

第十五章 聯結表

  1. 聯結
    SQL最強大的功能之一就是能在數據檢索查詢的執行中聯結表。聯結是利用SQL的select能執行的最重要的操作
    • 關係表
      相同的數據出現多次絕不是一件好事,此因素是關係數據庫設計的基礎。關係表的設計就是要保證把信息分解成多個表,一類數據一個表。各表通過某些常用的值(即關係設計中的關係)互相關聯
    • 外鍵
      外鍵爲某個表中的一列,它包含另一個表的主鍵值,定義了兩個表之間的關係,這樣做的好處如下:
    • 避免信息重複,從而不浪費時間和空間
    • 如果一個表中信息變動,可以只更新該表的單個記錄,相關表中的數據不用改動
    • 由於數據無重複,顯然數據是一致的,這是的處理數據更簡單
      總之,關係數據可以有效的存儲和方便的處理,因此關係數據庫的可伸縮性遠比非關係數據庫要好
    • 可伸縮性
      能夠適應不斷增加的工作量而不失敗。設計良好的數據庫或應用程序稱之爲可伸縮性好
    • 爲什麼要使用聯結
      分解數據爲多個表能更有效的存儲,更方便的處理,並具有更大的可伸縮性
      如果數據存儲在多個表中,怎樣用單條select語句檢索出數據?可以使用聯結,簡單的說,聯結是一種機制,用來在一條select語句中關聯表,因此稱之爲聯結。使用特殊的語法,可以聯結多個表返回一組輸出
  2. 創建聯結
    聯結的創建非常簡單,規定要連接的所有表以及它們如何關聯即可
select vend_name,prod_name,prod_price
from vendors,products
where vendors.vend_id = products.vend_id
order by vend_name,prod_name;

這裏prod_name和prod_price在一個表中,而vend_name在另一個表中,from子句列出了兩個表,這兩個表用where子句正確聯結,where子句指示MySQL匹配vendors表中的vend_id和products表中的vend_id(需要完全限定列名)
- where子句的重要性
在聯結兩個表時,實際上做的時將第一個表的每一行與第二個表中的每一行配對,where子句作爲過濾跳進啊,它只包含哪些匹配給定條件的行,沒有where子句,第一個表中的每個行將與第二個表中的每個行配對,而不管它們邏輯上是否可以配在一起
- 笛卡爾積
由沒有聯結條件的表關係返回的結果爲笛卡爾積,檢索出的行的數目將是兩個錶行數的乘積
- 內部聯結
目前所有的聯結稱爲等值聯結,它基於兩個表之間的相等測試,這種聯結也稱爲內部聯結。對這種聯結可以用另一種語法,使用inner join

select vend_name,prod_name,prod_price
form vendors inner join products
on vendors.vend_id = products.vend_id;
  • 聯結多個表
    SQL對一條select語句中可以聯結的表的數目沒有限制,創建聯結的基本規則也相同。首先列出所有表,然後定義表之間的關係

第十六章 創建高級聯結

  1. 使用表別名
    別名處理用於列名和計算字段外,SQL還允許給表名起別名,這麼做有兩個理由
    • 縮短SQL語句
    • 允許在單條select語句中多次使用相同的表
      表別名只在查詢執行中使用,與列別名不一樣,表別名不返回到客戶機
  2. 使用不同類型的聯結
    除了內部聯結外,還有三種聯結:
    • 自聯結
      自聯結可以和子查詢達到相同的功能,而且子聯結比子查詢要快得多
    • 自然聯結
      標準的聯結返回所有數據,甚至相同的列出現多次,自然聯結排出多次出現,時每個列只返回一次
    • 外部聯結
      有時會會需要包含沒有關聯行的那些行
      聯結包含了那些在相關表中沒有關聯行的行,這種類型的聯結稱爲外部聯結
      使用outer join關鍵字,而且需要left和right關鍵字來修飾(right指出的是outer join右邊的表,left指出的是outer join左邊的表)
  3. 使用帶聚集函數的聯結
    聚集函數可以和聯結一起使用
  4. 使用聯結和聯結條件
    注意:
    • 注意所使用的聯結類型,一般我們使用內部聯結
    • 保證正確的聯結條件
    • 總是提供聯結條件,否則會得到笛卡爾積

第十七章 組合查詢

  1. 組合查詢
    多數SQL查詢都只包含從一個或多個表中返回數據的單條select語句,MySQL也允許執行多個查詢(多條select語句),並將結果作爲單個查詢結果集返回,這些組合查詢稱爲並或複合查詢
    使用組合查詢的兩個情況:

    • 在單個查詢中從不同的表返回類似結構的數據
    • 對單個表執行多個查詢,按單個查詢返回數據

    • 組合查詢與多個where條件
      任何具有多個where子句的select語句都可以用一個組合查詢給出

  2. 創建組合查詢
    利用union操作符組合數條SQL查詢
    • 使用union
      在各條select語句之間放上關鍵字union,與where子句使用or來連接多個條件效果一樣
    • union規則

第十九章 插入數據

  1. 數據插入
    insert是用來插入行到數據庫的,插入可以用幾種方式使用:
    • 插入完整的行
    • 插入行的一部分
    • 插入多行
    • 插入某些查詢的結果
  2. 插入完整的行
insert into xx 
values(..,..,...);

insert語句一般不會產生輸出。對每個列必須提供一個值,如果某列沒有值,應該使用NULL值,各個列必須以它們在表定義中出現的次序填充。編寫依賴於特定次序的SQL語句是很不安全的,下面是更安全的方法(不過繁瑣)

insert into xx(各列名)
values(..,..,....);

因爲提供了列名,values必須一起指定的次序匹配指定列名,不一定按照各列在實際表的次序。這種方法可以省略某些列
省略的列必須滿足以下某個條件:
- 該列定義允許NULL值
- 在表定義中給出默認值,如果不給出值,將使用默認值
除了以上情況,MySQL將產生一條錯誤信息,並且相應的行插入不成功
如果數據檢索是最重要的,則可以通過在insert和into之間添加關鍵字low_priority,指示mySQL降低insert語句的優先級
3. 插入多個行
可以使用兩種方法:
- 多條insert語句,每條語句用一個分號結束,一次提交
- 單條insert語句多組值,每組值用一對圓括號擴起來,用逗號分隔
4. 插入檢索出的數據
insert還可以將一條seelct語句的結果插入表中,這就是所謂的insert select,它有一條insert語句和一條select語句組成

insert into xx(列名) 
select 列名 from yy;

第二十章 更新和刪除數據

  1. 更新數據
    爲了更新(修改)表中的數據,可使用update語句,有兩種方式使用update語句:
    • 更新表中特定行
    • 更新表中所有行
      基本的update語句有三部分組成,分別爲:
    • 要更新的表
    • 列名和它們的新值
    • 確定要更新行的過濾條件
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章