第一章
- 什麼是數據庫
數據庫是一個以某種有組織的方式存儲的數據的集合,需要區分數據庫和數據庫軟件,數據庫軟件稱爲DBMS(數據庫管理系統),數據庫是通過DBMS創建和操作的容器。我們並不能直接訪問數據庫,而是通過DBMS來訪問數據庫。 - 表
表是某種特定類型數據的結構化清單,表是一種結構化文件,可用來存儲某種特定類型的數據。數據庫中每個表都有自己的名字,用來標示自己,此名字是唯一的。 - 模式
模式是關於數據庫和表的佈局及特性的信息,可以用來描述數據庫中特定的表以及整個數據庫 - 列與行
列是表中的一個字段,所有表都是由一個或多個列組成的。數據庫中每個列都有相應的數據類型,數據類型定義列可以存儲的數據類型
行是表中的一個記錄,每一行是一個記錄 - 主鍵
主鍵是表的一列(或一組列),其值可以唯一區分表中的每一行
表中的任意一列都可以作爲主鍵,只要它滿足:
- 任意兩行都不具有相同的主鍵值
- 每一行都必須具有一個主鍵值(主鍵列不允許NULL值)
使用主鍵的好習慣:
- 不更新主鍵列中的值
- 不重用主鍵列的值
- 不在主鍵列中使用可能會更改的值
- 什麼是SQL
SQL是結構化查詢語言(Structured Query Language),是一種專門用來與數據庫通信的語言
SQL有如下優點:
- SQL不是某個特定數據庫供應商專有的語言,學習此語言可以喝幾乎所有的數據庫打交道
- SQL簡單易學
- SQL儘管看上去簡單,但它實際上是一種強有力的語言,靈活使用其語言元素,可以進行非常複雜和高級的數據庫操作
第二章 MySQL簡介
- 什麼是MySQL
數據的所有存儲,檢索,管理和處理實際上由數據庫軟件完成,MySQL是一種DBMS,即它是一種數據庫軟件
MySQL的優點:
- 成本,MySQL是開源的,一般可以免費使用
- 性能,MySQL執行非常快
- 可信賴,一些主流的大公司都在使用它
- 簡單,MySQL很容易安裝和使用
- DBMS的分類
DBMS分爲兩類:
- 基於共享文件系統的DBMS(
Microsoft Access
和FileMaker
) - 基於客戶機-服務器的DBMS,如
MySQL
,Oracle
,Microsoft SQL Server
服務器部分是負責所有數據的訪問和處理的軟件,這個軟件運行在稱爲數據庫服務器的計算機上,與數據庫打交道的只有服務器軟件,客戶機是與用戶打交道的軟件。客戶機軟件提交請求,服務器軟件處理請求,並將結果送回到客戶機軟件
- 基於共享文件系統的DBMS(
- MySQL工具
- mysql命令行實用程序
- MySQL Administrator
- MySQL Query Browser
第三章 使用MySQL
- 連接
爲了連接到MySQL,需要一下信息:
- 主機名(計算機名),如果連接到本地MySQL服務器,爲localhost
- 端口(如果使用默認端口3306之外的端口)
- 一個合法的用戶名
- 用戶口令(如果需要)
- 選擇數據庫
在最初連接到MySQL時,沒有任何數據庫打開供我們使用,需要選擇一個數據庫,使用USE
關鍵字,USE語句不返回任何結果,依賴於使用的客戶機,顯示某種形式的通知 - 瞭解數據庫和表
數據庫,表,列,用戶,權限等信息被存儲在數據庫和表中,可用SHOW
命令來顯示這些信息
show databases
返回可用數據庫的一個列表,包含在這個表中的可能是MySQL內部使用的數據庫,如mysql
和information_schema
等show tables
返回當前選擇的數據庫內可用表的列表show columns form xx
也可以用describe xx
顯示錶列,對於給定的表名,每個字段返回一行,行中包括字段名,數據類型,是否允許爲NULL,鍵信息,默認值以及其它信息show status
用於顯示廣泛的服務器狀態信息show create database xx
和show create table xx
用於顯示創建特定數據庫或表的信息show grants'
show errors
用來顯示授予用戶的安全權限 </li>
<li>和
show warnings`
用來顯示服務器錯誤或警告信息
第四章 檢索數據
- select語句
它的用途是從一個或多個表中檢索信息,爲了使用select
檢索表數據,必須至少給出兩條信息:
- 想選擇什麼
- 從什麼地方選擇
- 檢索單個列
select xx from yy
利用select
語句從yy
表中檢索出名爲xx
的列,所需的列名在select
關鍵字後給出,from
關鍵字後跟表名。返回的數據沒有過濾,也沒有排序 - 檢索多個列
使用select
關鍵字,需要給出多個列名,列名之間必須以逗號分隔
select xx,yy from zz
這條語句可以返回兩個列 - 檢索所有列
使用通配符*
來達到
select * from xx
如果給定一個通配符*
,則返回表中的所有列,列的順序一般是列在表定義中出現的順序 - 檢索不同的行
解決辦法是使用distinct
關鍵字,此關鍵字指示MySQL只返回不同的值
select distinct xx from yy
這條語句只返回不容的xx行,如果使用distinct
關鍵字,它必須放在列名的前面 - 限制結果
爲了返回第一行或者前幾行,可以使用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
- 使用完全限定的表名和列名
select xx.yy from xx
這條語句指定了表xx中的具體列(yy)select xx.yy from zz.xx
這條語句指定了zz數據庫中的具體表(xx)
第五章 排序檢索數據
- 排序數據
關係數據庫設計理論認爲,如果不明確規定排序順序,則不應該假定檢索出的數據的順序有意義
- 子句
SQL語句由子句構成,有些子句是必需的,有些子句是可選的
爲了明確的排序select語句檢索出的數據,可使用order by
子句,order by
子句取一個或多個列的名字,據此對輸出進行排序
select xx from yy order by xx
排序所使用的列可以爲顯示的列,也可以是其它列
- 子句
- 按多個列排序
經常需要按不止一個列進行數據排序(如果由相同的行,這個很有用)
select xx from yy order aa,bb
這個語句的輸出,盡在多個行具有相同的aa值時纔對yy按bb進行排序,如果aa列中所有值都是唯一的,則不會按照bb排序 - 指定排序方向
數據排序不僅限於升序排序,這只是默認的排序順序,還可以使用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 by
和limit
組合,可以找出一個列中最高或最低的值,limit
子句位於order by
子句之後
第六章 過濾數據
- 使用where子句
數據庫很少需要檢索所有行,至檢索所需數據需要制定搜索條件,搜索條件也稱過濾條件。在select語句中,數據根據where子句中指定的搜索條件進行過濾,where子句在from子句之後給出
select xx from yy where xx = val
這條語句只返回xx=val的行,當同時使用order by子句和where子句時,應將order by子句放到where子句之後,否則將發生錯誤 where子句操作符
MySQL支持的條件操作符:- = 等於
- <> 不等於
- != 不等於
- < 小於
- <= 小於等於
- /> 大於
- />= 大於等於
between 在指定的兩個值之間
檢查單個值
- 不匹配檢查 !=
- 範圍值檢查 使用between操作符,指定的兩個值必須用and分割
- 空值檢查 where xx is null
在創建表時,表設計人員可以指定其中列是否可以不包含值,在一個列不包含值時,稱其爲包含空值NULL.空值和0,空字符串,空格不同
第七章 數據過濾
- 組合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子句可以使用圓括號
- 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子句
- 在使用長的合法清單時,in操作符的語法更清楚直觀
- not操作符
not操作符只有一個功能,就是否定它之後的所有條件
select xx from yy where zz not in (val1,val2)
這條語句匹配val1和val2之外的所有行
MySQL支持not對in,between和exists子句去反
- 爲什麼要用in操作符呢
第八章 用通配符進行過濾
- 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的行 - 下劃線通配符 (_)
下劃線只匹配單個字符
- 百分號通配符(%)
- 使用通配符的技巧
通配符搜索處理一般比前面討論的其他搜索所花的時間長,這裏給出通配符的使用技巧:
- 不要過度使用通配符。如果其他操作符可以達到相同目的,應該使用其他操作符
- 在確實需要使用通配符時,除非絕對必要,否則不要把它們放在搜索模式的開始處,這樣是最慢的
- 仔細注意通配符的位置
第九章 用正則表達式進行搜索
- 正則表達式
正則表達式是用來匹配文本的特殊的串(字符集合)。所有種類的程序設計語言,文本編輯器,操作系統等都支持正則表達式
正則表達式用正則表達式語言建立,正則表達式語言是一種特殊的語言,與任意語言一樣,正則表達式具有我們必須學習的特殊語法和指令 使用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自己解釋一個,正則表達式庫解釋另一個)
- 匹配字符類
字符類有: - [:alnum:] 任意字母和數字([a-zA-Z0-9])
- [:alpha:] 任意字符([a-zA-Z])
- [:blank:] 空格和製表([\t])
- [:cntrl:] ASCII控制字符
- [:digit:] 任意數字([0-9])
- [:graph:] 與[:print:]相同,但不包含空格
- [:lower:] 任意小寫字母([a-z])
- [:print:] 任意可打印字符
- [:punct:] 既不在[:alnum:]又不在[:cntrl:]中的任意字符
- [:space:] 包括空格在內的任意空白字符([\f\n\r\t\v])
- [:upper:] 任意大寫字母([A-Z])
[:xdigit:] 任意十六進制數字([a-fA-F0-9])
匹配多個實例
重複元字符:- * 0個或多個匹配
- /+ 1個或多個匹配({1,})
- ? 0個或1個匹配({0,1})
- {n} 指定書目匹配
- {n,} 不少於指定書目匹配
- {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
第十章 創建計算字段
- 計算字段
存儲在數據庫表中的數據一般不是應用程序所需要的格式,我們需要直接從數據庫中檢索出轉換,計算或格式化過的數據,而不是檢索出數據,然後再在客戶機應用程序中重新格式化
以上就是計算字段發揮的作用,計算字段並不實際存在於數據庫表中,計算字段是運行時在select語句內創建的
字段(field)基本上與列的意思相同,經常互換使用。只有數據庫知道select語句哪些列是實際的表列,哪些列是計算字段 - 拼接字段
拼接是將值連接到一起構成單個值
在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,任何客戶機都可以按名引用這個列,就像它是實際的表列一樣,別名有時也稱導出列
- 使用別名
- 執行算數運算
select xx*yy as xy from zz
這條語句將xx與yy相乘的結果作爲xy列名,MySQL支持+,-,*,/基本運算符,圓括號可以用來區分優先級順序
第十一章 使用數據處理函數
- 函數
與大多數計算機語言一樣,SQL支持利用函數處理數據。函數一般在數據上執行,它給數據的轉換和處理提供了方便 使用函數
大多數SQL實現支持一下類型的函數:- 用於處理文本串,如刪除或填充值,轉換大小寫
- 用於數值數據進行算術操作,如絕對值,代數運算
- 用於處理日期和時間值並從這些值中提取特定成分
返回DBMS正使用的特殊信息,如用戶登陸信息,檢查版本細節的系統函數
文本處理函數
不再詳述- 日期和時間處理函數
不在詳述 - 數值處理函數
這些函數一般用於代數,三角或幾何運算
第十二章 彙總數據
- 聚集函數
我們經常需要彙總數據而不用把它們實際檢索出來,爲此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
第十三章 分組數據
- 數據分組
分組允許把數據分爲多個邏輯組,以便能對每個組進行聚集計算 - 創建分組
分組是在select語句的group by子句中建立的。group by子句指示MySQL分組數據,然後對整個組而不是整個結果進行聚集
使用group by的一些重要規定:
- group by子句可以包含任意數目的列,這使得能對分組進行嵌套
- 如果在group by子句中嵌套了分組,數據將在最後規定的分組上進行彙總
- group by子句中列出的每個列都必須是檢索列或有效的表達式
- 除聚集計算語句外,select語句中的每個列都必須在group by子句中給出
- 如果分組列中具有NULL值,則NULL將作爲一個分組返回
- group by子句必須出現在where子句之後order by子句之前
- 過濾分組
MySQL還允許過濾分組,規定包括哪些分組,排除哪些分組。MySQL爲此目的提供了另外的子句,那就是having子句,having非常類似於where,唯一的差別是where過濾行,having過濾分組
- having和where的差別
where在分組前進行過濾,having在分組後進行過濾
- having和where的差別
- 分組和排序
- order by與group by的差別
group by分組的數據可能不是分組的順序,一般在使用group by子句時,應該也給出order by子句,這是保證數據正確排序的唯一方法
- order by與group by的差別
- select子句順序
select form where group by having order by limit
第十四章 使用子查詢
- 子查詢
查詢:任何SQL語句都是查詢,此術語一般指select語句
SQL還允許創建子查詢,即嵌套在其他查詢中的查詢 - 利用子查詢進行過濾
可以把一條select語句返回的結果用於另一條select語句的where子句中。先執行子查詢,子查詢返回的結果用於外層的where子句
在where子句中使用子查詢能夠編寫功能很強並且很靈活的SQL語句,對於能嵌套的子查詢數目沒有限制 - 作爲計算字段使用子查詢
使用子查詢的另一方法是創建計算字段
第十五章 聯結表
- 聯結
SQL最強大的功能之一就是能在數據檢索查詢的執行中聯結表。聯結是利用SQL的select能執行的最重要的操作
- 關係表
相同的數據出現多次絕不是一件好事,此因素是關係數據庫設計的基礎。關係表的設計就是要保證把信息分解成多個表,一類數據一個表。各表通過某些常用的值(即關係設計中的關係)互相關聯 - 外鍵
外鍵爲某個表中的一列,它包含另一個表的主鍵值,定義了兩個表之間的關係,這樣做的好處如下: - 避免信息重複,從而不浪費時間和空間
- 如果一個表中信息變動,可以只更新該表的單個記錄,相關表中的數據不用改動
- 由於數據無重複,顯然數據是一致的,這是的處理數據更簡單
總之,關係數據可以有效的存儲和方便的處理,因此關係數據庫的可伸縮性遠比非關係數據庫要好 - 可伸縮性
能夠適應不斷增加的工作量而不失敗。設計良好的數據庫或應用程序稱之爲可伸縮性好 - 爲什麼要使用聯結
分解數據爲多個表能更有效的存儲,更方便的處理,並具有更大的可伸縮性
如果數據存儲在多個表中,怎樣用單條select語句檢索出數據?可以使用聯結,簡單的說,聯結是一種機制,用來在一條select語句中關聯表,因此稱之爲聯結。使用特殊的語法,可以聯結多個表返回一組輸出
- 關係表
- 創建聯結
聯結的創建非常簡單,規定要連接的所有表以及它們如何關聯即可
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語句中可以聯結的表的數目沒有限制,創建聯結的基本規則也相同。首先列出所有表,然後定義表之間的關係
第十六章 創建高級聯結
- 使用表別名
別名處理用於列名和計算字段外,SQL還允許給表名起別名,這麼做有兩個理由
- 縮短SQL語句
- 允許在單條select語句中多次使用相同的表
表別名只在查詢執行中使用,與列別名不一樣,表別名不返回到客戶機
- 使用不同類型的聯結
除了內部聯結外,還有三種聯結:
- 自聯結
自聯結可以和子查詢達到相同的功能,而且子聯結比子查詢要快得多 - 自然聯結
標準的聯結返回所有數據,甚至相同的列出現多次,自然聯結排出多次出現,時每個列只返回一次 - 外部聯結
有時會會需要包含沒有關聯行的那些行
聯結包含了那些在相關表中沒有關聯行的行,這種類型的聯結稱爲外部聯結
使用outer join關鍵字,而且需要left和right關鍵字來修飾(right指出的是outer join右邊的表,left指出的是outer join左邊的表)
- 自聯結
- 使用帶聚集函數的聯結
聚集函數可以和聯結一起使用 - 使用聯結和聯結條件
注意:
- 注意所使用的聯結類型,一般我們使用內部聯結
- 保證正確的聯結條件
- 總是提供聯結條件,否則會得到笛卡爾積
第十七章 組合查詢
組合查詢
多數SQL查詢都只包含從一個或多個表中返回數據的單條select語句,MySQL也允許執行多個查詢(多條select語句),並將結果作爲單個查詢結果集返回,這些組合查詢稱爲並或複合查詢
使用組合查詢的兩個情況:- 在單個查詢中從不同的表返回類似結構的數據
對單個表執行多個查詢,按單個查詢返回數據
組合查詢與多個where條件
任何具有多個where子句的select語句都可以用一個組合查詢給出
- 創建組合查詢
利用union操作符組合數條SQL查詢
- 使用union
在各條select語句之間放上關鍵字union,與where子句使用or來連接多個條件效果一樣 - union規則
- 使用union
第十九章 插入數據
- 數據插入
insert是用來插入行到數據庫的,插入可以用幾種方式使用:
- 插入完整的行
- 插入行的一部分
- 插入多行
- 插入某些查詢的結果
- 插入完整的行
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;
第二十章 更新和刪除數據
- 更新數據
爲了更新(修改)表中的數據,可使用update語句,有兩種方式使用update語句:
- 更新表中特定行
- 更新表中所有行
基本的update語句有三部分組成,分別爲: - 要更新的表
- 列名和它們的新值
- 確定要更新行的過濾條件