數(shù)據(jù)庫入門
數(shù)據(jù)庫: 保存有組織的數(shù)據(jù)的容器(通常是一個(gè)文件或一組文件).數(shù)據(jù)庫軟件應(yīng)該稱為 DBMS(DataBase Manage System) 數(shù)據(jù)庫管理系統(tǒng)唧席,數(shù)據(jù)庫是指通過 DBMS 創(chuàng)建和操縱的容器,數(shù)據(jù)庫可以是保存在硬盤上的文件吞鸭,但也可以不是。你不能直接訪問數(shù)據(jù)庫逗载,而是使用 DBMS 來訪問塘安,他替你訪問數(shù)據(jù)庫。
表: 某種特定類型數(shù)據(jù)的結(jié)構(gòu)化清單。存儲在表中的數(shù)據(jù)是一種類型的數(shù)據(jù)或一個(gè)清單憎茂,數(shù)據(jù)庫中的每個(gè)表都有一個(gè)名字珍语,用來標(biāo)識自己,此名字是唯一的,這表示數(shù)據(jù)庫中沒有其他表具有相同的名字竖幔。
表具有一些特性板乙,這些特定定義了數(shù)據(jù)在表中如何存儲,如存儲什么樣的數(shù)據(jù)拳氢,數(shù)據(jù)如何分解募逞,個(gè)部分信息如何命名等等,描述這組信息就是所謂的模式
模式: 關(guān)于數(shù)據(jù)庫和表的布局及特性的信息.
列:表中的一個(gè)字段馋评,所有的表都是由一個(gè)或多個(gè)列組成的放接。
數(shù)據(jù)類型: 所容許的數(shù)據(jù)的類型,每個(gè)表都有相對應(yīng)的數(shù)據(jù)類型栗恩,他限制(容許)該列中存儲的數(shù)據(jù)透乾。數(shù)據(jù)類型限制可存儲在列中的數(shù)據(jù)種類,數(shù)據(jù)類型還幫助正確的排序數(shù)據(jù)磕秤,并在優(yōu)化磁盤使用方面起重要的作用乳乌,因此,在創(chuàng)建表時(shí)必須對數(shù)據(jù)類型給予特別的關(guān)注
行:表中的一個(gè)記錄市咆,
主鍵:一列(或一組列)汉操,其值能夠唯一區(qū)分表中的每個(gè)行。唯一標(biāo)識表中每行的這個(gè)列稱為主鍵蒙兰,主鍵用來表示一個(gè)特定的行磷瘤,沒有主鍵,更新或刪除表中特定行很困難搜变,因?yàn)闆]有安全的方法保證只涉及相關(guān)的行采缚。表中的任何列都可以作為主鍵,只要它滿足以下條件:
- 任何兩行都不具有相同的主鍵值
- 每個(gè)行都必須具有一個(gè)主鍵值(主鍵值不允許 NULL 值)挠他。
SQL: 結(jié)構(gòu)化查詢語言(Structured Query Language),是一種專門用來與數(shù)據(jù)庫通信的語言扳抽。
基礎(chǔ)操作
了解數(shù)據(jù)庫和表(SHOW)
-
SHOW DATABASES
: 返回一個(gè)數(shù)據(jù)庫列表,包含在這個(gè)列表中的可能是 MYSQL 內(nèi)部使用的數(shù)據(jù)庫. -
SHOW TABLES
: 返回當(dāng)前選擇的數(shù)據(jù)庫內(nèi)可用表的列表 -
SHOW COLUMS FROM customers
: 要求給出一個(gè)表名殖侵,對每個(gè)字段返回一行贸呢。包含 該字段的信息。
創(chuàng)建和操縱表
創(chuàng)建表
MySQL 不僅用于表數(shù)據(jù)操作拢军,而且還可以用來執(zhí)行數(shù)據(jù)庫和表的所有操作楞陷,包括表本身的創(chuàng)建和處理。
創(chuàng)建表的方法:
- 使用具有交互式創(chuàng)建和管理表的工具
- 使用 MySQL 語句操縱
-
表創(chuàng)建基礎(chǔ)(CREATE TABLE)
- 新的表明名再關(guān)鍵字
CREATE TABLE
之后給出 - 表列的名字和定義茉唉,用逗號分隔
- 新的表明名再關(guān)鍵字
- 使用 NULL 值: Null 值就是沒有值或者缺值固蛾,允許 NULL 值的列也允許再插入行時(shí)不給出該列的值结执,不允許 NULL 值的列不接受該列沒有值的行,換句話說艾凯,在插入或更新行時(shí)該列必須有值昌犹。NULL 為默認(rèn)值,如果不指定 NOT NULL, 則認(rèn)為指定的是 NULL览芳, NULL 值就是沒有值斜姥,他不是空串,空串是一個(gè)有效的值沧竟。
- 主鍵: 主鍵的值必須唯一铸敏,即,表中的每個(gè)行必須具有唯一的主鍵值悟泵,如果主鍵使用單個(gè)列杈笔,則他的值必須唯一,如果使用多個(gè)列糕非,則這些列的組合值必須唯一蒙具。
-
使用 AUTO_INCREMENT: 告訴 MySQL ,本列每當(dāng)增加一行時(shí)自動(dòng)增量朽肥,每次執(zhí)行一個(gè) INSERT 操作時(shí)禁筏,
MySQL
會(huì)對該列增量,每個(gè)表只允許一個(gè)AUTO_INCREMENT
列衡招,而且他必須被索引
更改表(ALTER TABLE)
- 增加列:
ALTER TABLE vendors ADD vend_phone CHAR(20)
- 刪除列:
ALTER TABLE vendors DROP COLUMN vend_phone
刪除表 (DROP TABLE)
重命名表 (RENAME TABLE)
插入數(shù)據(jù)
使用 INSERT 語句將數(shù)據(jù)插入表中篱昔,
INSERT
是用來插入(或添加)行到數(shù)據(jù)庫表的,插入可以用集中方式使用
- 插入完整行始腾,使用 INSERT 州刽,要求指定表明和被插入到新行的值,最好是寫上列名,這樣可以保證列明是正確的浪箭。
- 插入多個(gè)行: INSERT 可以插入一行到一個(gè)表中穗椅,如果想一次性插入多行的話,就需要使用多個(gè) INSERT 或者使用單條 INSERT 語句有多組值奶栖,每組值用一對圓括號括起來
更新和刪除數(shù)據(jù)
更新數(shù)據(jù)
為了更新(修改)表中的數(shù)據(jù)匹表,可使用 UPDATE 語句,可采用兩種方式使用 UPDATE:
使用 UPDATE 的時(shí)候一定要注意驼抹,不要省略 WHERE 子句桑孩,使用 UPDATE 語句總是以要更新的表的名字開始.要以 WHERE
子句(用來告訴 MySQL 更新哪一行)結(jié)束拜鹤。在更新多個(gè)列時(shí)框冀,只需要使用單個(gè) SET
命令,每個(gè) 列=值
對之間用逗號分隔(最后一列之后不用逗號);
- 更新表中特定行
- 更新表中所有行
刪除數(shù)據(jù)
為了從一個(gè)表中刪除(去掉)數(shù)據(jù)敏簿,使用 DELETE 語句明也,可依兩種方式使用 DELETE
- 從表中刪除特定的行
DELETE FROM products WHERE cust_id = 1006
更新和刪除的指導(dǎo)原則
如果執(zhí)行 UPDATE 而不帶 WHERE 子句宣虾,則表中每行都將應(yīng)用新值更新,類似的温数,如果執(zhí)行
DELETE
語句而不帶WHERE
子句绣硝,表的所有數(shù)據(jù)都將被刪除。
- 除非缺失打算更新和刪除每一行撑刺,否則絕對不要使用不帶
WHERE
子句的UPDATE
或DELETE
語句 - 保證每個(gè)表都有主鍵鹉胖,盡可能像
WHERE
子句那樣使用它 - 在對 UPDATE 或 DELETE 語句使用 WHERE 子句前,最好先用 SELECT 進(jìn)行測試够傍,保證它過濾的是正確的記錄甫菠,以防止編寫的 WHERE 子句不正確
- 使用強(qiáng)制實(shí)施引用完整性的數(shù)據(jù)庫,這樣 MySQL 將不允許刪除具有與其他表相關(guān)聯(lián)的數(shù)據(jù)的行冕屯。
檢索數(shù)據(jù)(SELECT)
從一個(gè)或多個(gè)表中檢索信息寂诱,為了使用 SELECT 檢索數(shù)據(jù),必須至少給出兩條數(shù)據(jù) -- 項(xiàng)選擇什么安聘,以及從什么地方選擇痰洒。
檢索單個(gè)列:
SELECT prod_name FROM products
檢索多個(gè)列:
SELECT prod_id,prof_name FROM product
檢索所有列:
SELECT * FROM product
檢索不同的行:
SELECT DISTINCT vend_id FROM products
,DISTINCT
關(guān)鍵字必須直接方法在列名的前面-
限制結(jié)果: LIMIT :
SELECT prod_name FROM products LIMIT 5
SELECT prod_name FROM products LIMIT 5,5
使用完全限定的表名:
SELECT products.prod_name FROM crashcourse.products
;
排序檢索數(shù)據(jù)
將會(huì)講授如何使用 SELECT 語句的 ORDER_BY 子句,根據(jù)需要排序檢索出的數(shù)據(jù).
子句(clause): SQL 語句由子句構(gòu)成浴韭,有些子句是必需的丘喻,而有的是可選的,一個(gè)子句通常由一個(gè)關(guān)鍵字和所提供的數(shù)據(jù)組組成念颈,子句的例子有 SELECT 語句的 FROM 子句仓犬。
- 單列排序:
SELECT prod_name FROM products ORDER BY prod_id
- 多列排序:
SELECT prod_name FROM products ORDER BY prod_price,prod_name
, 排序完全按照所規(guī)定的順序進(jìn)行,也就是說僅在多行具有相同的 price 的時(shí)候才會(huì)根據(jù) name 進(jìn)行排序 - 指定排序方向: 數(shù)據(jù)排序不限于升序順序(A-Z),還可以使用 ORDER BY 子句以降序(Z-A)順序排序舍肠,為了進(jìn)行降序排序搀继,必須指定 DESC 關(guān)鍵字.
SELECT prod_id, prod_price,prod_name FROM products ORDER BY prod_price DESC
.DESC
關(guān)鍵字只能應(yīng)用到直接位于其前面的列名。如果想要對多個(gè)列上進(jìn)行降序排列翠语,必須對每個(gè)列指定DESC關(guān)鍵字叽躯。
過濾數(shù)據(jù)
使用
SELECT
語句的WHERE
子句指定搜索條件,只檢索所需的數(shù)據(jù)需要指定搜索條件,搜索條件也稱為過濾條件,在SELECT
語句中,數(shù)據(jù)根據(jù) WHERE 子句中指定的搜索條件進(jìn)行過濾肌括。WHERE
子句在表名 (FROM子句) 之后給出点骑。
SELECT prod_name,prod_price FROM products WHERE prod_price=2.5
;
如果同時(shí)使用 ODRDER BY 子句和 WHERE 子句時(shí),應(yīng)該讓 ORDER BY 位于 WHERE 之后谍夭。-
WHERE
子句操作符-
=
等于 -
<>
不等于 -
!=
不等于 -
<
小于 -
<=
小于等于 -
>
大于 -
>=
大于等于 -
BETWEEN
在指定的兩個(gè)值之間
-
不匹檢查.
SELECT prod_name, prod_price FROM product WHERE prod_location <> 'japan'
, 注意黑滴,單引號用來限定字符串,如果將值與串類型的列來進(jìn)行比較紧索,則需要限定引號袁辈,用來與數(shù)值列進(jìn)行比較的值不用引號。范圍值檢查:
SELECT prod_name,prod_price FROM products WHERE prod_price BETWEEN 5 AND 10
,BETWEEN
是閉合查詢珠漂,也就是意味著包含了起始和結(jié)束空值檢查: 在創(chuàng)建表晚缩,表設(shè)計(jì)人員可以指定其中的列是否可以不包含值尾膊,在一個(gè)列不包含值時(shí),稱其為包含空值 NULL,
SELECT
語句有一個(gè)特殊的WHERE
子句荞彼,可用來檢查具有 NULL值的列冈敛,這個(gè) WHERE 子句就是 IS NULL 子句
數(shù)據(jù)過濾
組織 WHERE 子句建立功能更強(qiáng)的更高級的搜索條件,
MYSQL
允許多個(gè) WHERE 子句鸣皂,這些子句可以以兩種方式使用: 以 AND 子句的方式或者以 OR 子句的方式使用抓谴。操作符用來鏈接或者改變 WHERE 子句中的子句的關(guān)鍵字,也稱為邏輯操作符
AND操作符:
SELECT prod_id,prod_price FROM products WHERE vend_id = 1003 AND prod_price <= 10;
OR操作符: OR 操作符與 AND 操作符不同寞缝,它指示 MySQL 檢索匹配任意條件
SELECT prod_id FROM products WHERE vend_id=1002 OR prod_price=1003
計(jì)算次序:
SELECT prod_name FROM products WHERE (prod_id=1002 OR prod_id=1003) AND prod_price>10
,AND
的計(jì)算次序要優(yōu)先于OR
齐邦,所以需要將OR
-
IN操作符:
IN
操作符用來指定條件范圍,范圍內(nèi)的每個(gè)條件都可以進(jìn)行匹配第租,IN
取合法值的由逗號分隔的清單措拇,全都括在圓括號中。SELECT prod_name FROM products WHERE vend_id IN (1002,1003) ORDER BY prod_name
其實(shí)IN
和OR
的功能相同慎宾。那么為什么要使用IN
操作符呢?- 在使用長的合法選項(xiàng)清單時(shí)丐吓,
IN
操作符的語法更清楚且更直觀 - 在使用 IN 時(shí),計(jì)算的次序更容易管理
- IN 操作符一般比 OR 操作符清單執(zhí)行更快
- IN 的最大優(yōu)點(diǎn)是可以包含其他 SELECT 語句趟据,使得能夠更動(dòng)態(tài)地建立
WHERE 子句
- 在使用長的合法選項(xiàng)清單時(shí)丐吓,
NOT操作符:NOT 操作符用來否定它之后所跟的任何條件
SELECT prod_name FROM products WHERE vend_id NOT IN(1002,1003)
用通配符進(jìn)行過濾
使用 LIKE 操作符來進(jìn)行通配搜索券犁,以便對數(shù)據(jù)進(jìn)行復(fù)雜過濾
-
LIKE 操作符:利用通配符可創(chuàng)建比較特定數(shù)據(jù)的搜索模式,來匹配值的一部分的特殊字符汹碱,搜索模式: 由字面值粘衬,通配符或兩者組合構(gòu)成的搜索條件。為在搜索子句中使用通配符咳促,必須使用 LIKE 操作符稚新,LIKE 指示 MySQL,后跟的搜索模式利用通配符匹配而不是直接相等匹配進(jìn)行比較跪腹。
-
百分號(%)通配符:表示任何字符出現(xiàn)的任意次數(shù)
SELECT prod_id,prod_name FROM products WHERE prod_name LIKE ‘jet%’
-
下劃線_通配符:另一個(gè)有用的通配符是下劃線
_
褂删,下劃線只匹配單個(gè)字符串而不是多個(gè)字符串。SELECT prod_id FROM products WHERE prod_name LIKE '_ton anvil'
; -
使用通配符的技巧:
- 不要過渡使用通配符
- 在確實(shí)需要的時(shí)候再使用通配符
-
百分號(%)通配符:表示任何字符出現(xiàn)的任意次數(shù)
用正則表達(dá)式來進(jìn)行搜索
帶學(xué)
創(chuàng)建計(jì)算字段
filed 可以與列的意思相同冲茸,經(jīng)惩头В互換使用,不過數(shù)據(jù)庫的列稱為一般列轴术,而術(shù)語通常用在計(jì)算字段的連接上.
-
拼接字段:
concatenate
:將值連接到一起構(gòu)成單個(gè)值难衰,解決辦法是把兩個(gè)列拼接起來,在 MySQL 的 SELECT 語句中逗栽,可使用Concat()
函數(shù)來拼接兩個(gè)列盖袭。Concat()
拼接串,即把多個(gè)串連接起來形成一個(gè)較長的串,需要一個(gè)或多個(gè)指定的串苍凛,各個(gè)串之間用逗號分隔。 -
使用別名
SELECT Concat(...) AS newName FROM products
- 執(zhí)行算數(shù)計(jì)算: 計(jì)算字段的另一個(gè)常見用途是對檢索出的數(shù)據(jù)進(jìn)行算術(shù)計(jì)算兵志,
使用數(shù)據(jù)處理函數(shù)
MySQL 支持利用函數(shù)來處理數(shù)據(jù)醇蝴,函數(shù)一般是在數(shù)據(jù)上執(zhí)行的,它給數(shù)據(jù)的轉(zhuǎn)換和處理提供了方便想罕。函數(shù)沒有 SQL 的可移植性強(qiáng)悠栓,多數(shù)的 SQL 語句是可移植的,在 SQL 實(shí)現(xiàn)之間有差異時(shí)按价,這些差異通常不那么難處理惭适,而函數(shù)的可移植性卻不強(qiáng),
使用函數(shù)
大多數(shù) SQL 實(shí)現(xiàn)支持以下類型的函數(shù):
- 用于處理文本串(刪除或填充值楼镐,轉(zhuǎn)換值為大寫或小寫的文本函數(shù))
- 用于在數(shù)值數(shù)據(jù)上進(jìn)行算術(shù)操作(如絕對值癞志,進(jìn)行代數(shù)運(yùn)算)的數(shù)值函數(shù)
- 用于處理日期和時(shí)間值,并且從這些址中提取特定成分
- 返回 DBMS 正使用的特殊信心(如返回用戶登陸信息框产,檢查版本細(xì)節(jié))的系統(tǒng)函數(shù)
文本處理函數(shù)
-
RTrim()
函數(shù)來去除列值右邊的空格凄杯。 -
Upper()
函數(shù),將文本轉(zhuǎn)換為大寫秉宿。 -
Left()
函數(shù)戒突,返回串左邊的字符。
時(shí)期和時(shí)間處理函數(shù)
時(shí)間和日期采用相應(yīng)的數(shù)據(jù)類型和特殊的格式存儲描睦,以便能快速和有效排序或過濾膊存,并且節(jié)省物理存儲空間,一般忱叭,應(yīng)用程序不使用用來存儲日期和時(shí)間的格式隔崎,因此日期和時(shí)間函數(shù)被用來統(tǒng)計(jì),讀取和處理這些值韵丑。
- AddDate() 增加一個(gè)日期(天仍稀,周等)。
- AddTime() 增加一個(gè)時(shí)間(時(shí)埂息,分等)技潘。等,,,,。
數(shù)值處理函數(shù)
數(shù)值處理函數(shù)僅處理數(shù)值數(shù)據(jù)千康,這些函數(shù)一般主要用于代數(shù)享幽,三角或幾何運(yùn)算.
- Abs(). 返回一個(gè)數(shù)的絕對值
- Cos()返回一個(gè)角度的余弦
- ...
匯總數(shù)據(jù)
MySQL 查詢可用于檢索數(shù)據(jù),以便分析和報(bào)表生成拾弃,這種類型的檢索例子有以下幾種:
- 確定表中行數(shù)(或者滿足某個(gè)條件或包含某個(gè)特定值的行數(shù))
- 獲得表中行組的和
- 找出表列(或所有行或某些特定的行)的最大值值桩,最小值和平均值
這些例子都需要對表中數(shù)據(jù)匯總。為了檢索上述的類型豪椿, MySQL 給出了5個(gè)聚集函數(shù)奔坟。聚集函數(shù)運(yùn)行在行組上携栋,計(jì)算和返回單個(gè)值的函數(shù)。
AVG() 函數(shù)
AVG()
通過對表中行數(shù)計(jì)數(shù)并計(jì)算特定列值之和咳秉,求得該列的平均值婉支,AVG()
可用來返回所有列的平均值,也可以用來返回特定列或行的平均值澜建。SELECT AVG(price) AS price_avg FROM products;
COUNT() 函數(shù)
COUNT()
函數(shù)進(jìn)行計(jì)數(shù)向挖,可利用 COUNT()
確定表中行的數(shù)目或符合特定條件的行的數(shù)目。COUNT()
函數(shù)有兩種使用方式
- 使用
COUNT(*)
對表中行的數(shù)目進(jìn)行計(jì)數(shù)炕舵,不管表列中包含的是空值(NULL)還是非空值何之。 - 使用
COUNT(column)
對特定列中具有值的行進(jìn)行計(jì)數(shù),忽略 NULL 值咽筋。
MAX() 函數(shù)
MAX()
返回指定列中的最大值溶推,MAX()
要求指定列名,
MIN() 函數(shù)
MIN()
的功能正好與 MAX()
功能相反奸攻,他返回指定列的最小值悼潭,與 MAX()
一樣,必須指定列名
SUM() 函數(shù)
SUM()
函數(shù)用來返回指定列值的和(總計(jì))舞箍,SUM()
也可以用來合計(jì)計(jì)算值
分組數(shù)據(jù)
使用分組來匯總表內(nèi)容的子集舰褪,使用
SELECT
的子句GROUP BY
和HAVING
子句。
創(chuàng)建分組
分組是在 SELECT
語句的 GROUP BY
子句中建立的疏橄。
SELECT country, COUNT(*) AS num_prod FROM products GROUP BY country;
使用了 GROUP BY
子句時(shí)占拍,需要知道一些重要的規(guī)定。
-
GROUP BY
子句可以包含任意數(shù)目的列捎迫,這使得能對分組進(jìn)行嵌套晃酒,為數(shù)據(jù)分組提供更細(xì)致的控制。
過濾分組
除了能使用 GROUP BY 分組數(shù)據(jù)外窄绒,MySQL 還允許過濾數(shù)組贝次,規(guī)定包含哪些分組,排除哪些分組彰导。使用 HAVING 過濾分組
SELECT price, COUNT(*) AS price_larger FROM products GROUP BY price HAVING price LIKE '6_000';
SELECT
子句順序:
- SELECT 要返回的列或表達(dá)式
- FROM 從中檢索數(shù)據(jù)的表
- WHERE 行級過濾
- GROUP BY 分組說明
- HAVING 組級過濾
- ORDER BY 輸出排序順序
- LIMIT 限制檢索的行數(shù)
使用子查詢
SQL 允許創(chuàng)建子查詢蛔翅,即嵌套在其他查詢中的查詢
在 SELECT
語句中,子查詢總是從內(nèi)向外處理位谋,在處理上面的 SELECT
語句時(shí)山析, MySQL
實(shí)際上執(zhí)行了兩個(gè)操作
SELECT order_num FROM orderitems WHERE prod_id = 1;
SELECT cust_id FROM orders WHERE order_num = 1;
SELECT * FROM customers WHERE cust_id = 1;
SELECT * FROM customers WHERE cust_id IN (
SELECT cust_id
FROM orders
WHERE order_num IN (
SELECT order_num
FROM orderitems
WHERE prod_id = 1
)
);
雖然子查詢一般與 IN 操作符結(jié)合使用,但也可以用于測試等于(=),不等于(<>) 等掏父。
作為計(jì)算字段使用子查詢
使用子查詢的另一方法是創(chuàng)建字段笋轨。
SELECT cust_name, cust_state,(SELECT COUNT(*) FROM orders WHERE cust_id = customers.cust_id) AS orders FROM customers;
聯(lián)結(jié)表
SQL 最強(qiáng)大功能之一就是能在數(shù)據(jù)檢索查詢的執(zhí)行中聯(lián)結(jié)(join)表,聯(lián)結(jié)是利用 SQL 的 SELECT 能執(zhí)行的最重要的操作,很好地理解聯(lián)結(jié)及其語法是學(xué)習(xí) SQL 的一個(gè)極為重要的組成部分爵政。
關(guān)系表
關(guān)系表的設(shè)計(jì)就是要保證把信息分解成多個(gè)表仅讽,一類數(shù)據(jù)一個(gè)表,各表通過某些常用的值(即關(guān)系設(shè)計(jì)中的關(guān)系)互相關(guān)聯(lián)钾挟。
外鍵:外鍵為某個(gè)表中的一列洁灵,他包含另一個(gè)表的主鍵值,從而定義了兩個(gè)表之間的關(guān)系等龙。
可伸縮性:能夠適應(yīng)不斷增加的工作量而不失敗处渣,
為什么要使用聯(lián)結(jié)
分解數(shù)據(jù)為多個(gè)表中伶贰,更方便地處理蛛砰,并且具有更大的可伸縮性。
使用聯(lián)結(jié)黍衙,可以用單條 SELECT
語句檢索出數(shù)據(jù)泥畅,聯(lián)結(jié)是一種機(jī)制,用來在一條 SELECT 語句中關(guān)聯(lián)表琅翻,因此稱之為聯(lián)結(jié)位仁,
SELECT vend_name,prod_name,prod_id,prod_price FROM vendors,products WHERE vendors.vend_id = products.vend_id;
WHERE 子句的重要性
請記住:在一條 SELECT 語句中聯(lián)結(jié)幾個(gè)表時(shí),相應(yīng)的關(guān)系是在運(yùn)行中構(gòu)造的方椎,在數(shù)據(jù)表的定義中不存在能指示 MySQL 如何對表進(jìn)行聯(lián)結(jié)的東西聂抢,你必須自己做這件事情,
笛卡爾積 由沒有聯(lián)結(jié)條件的表關(guān)系返回的結(jié)果為笛卡爾積棠众,檢索出的行的數(shù)目將是第一個(gè)表中的行數(shù)乘以第二個(gè)表中的行數(shù)琳疏。
內(nèi)部聯(lián)結(jié)
目前為止所用的聯(lián)結(jié)稱為等值聯(lián)結(jié),他基于兩個(gè)表之間的相等測試,這種聯(lián)結(jié)也稱為內(nèi)部聯(lián)結(jié)闸拿,其實(shí)空盼,對于這種聯(lián)結(jié)可以使用稍微不同的語法來明確指定聯(lián)結(jié)的類型,
聯(lián)結(jié)多個(gè)表
SQL 對一條 SELECT 語句中可以聯(lián)結(jié)的表的數(shù)目沒有限制新荤,創(chuàng)建聯(lián)結(jié)的基本規(guī)則也相同揽趾,首先列出所有表,然后定義表之間的關(guān)系苛骨。
創(chuàng)建高級聯(lián)結(jié)
組合查詢
多數(shù) SQL 查詢都只包含一個(gè)或多個(gè)表中返回?cái)?shù)據(jù)的單條 SELECT 語句篱瞎,MySQL 也允許執(zhí)行多個(gè)查詢(多條查詢),并將結(jié)果作為單個(gè)查詢結(jié)果集返回痒芝,這些組合查詢通暢稱為并 (union) 或復(fù)合查詢(compound query).
有兩種基本情況奔缠,其中需要使用組合查詢:
- 再單個(gè)查詢中從不同的表返回類似結(jié)構(gòu)的數(shù)據(jù)
- 對單個(gè)表執(zhí)行多個(gè)查詢,按單個(gè)查詢返回?cái)?shù)據(jù)
創(chuàng)建組合查詢
可用 UNION
操作符來組合數(shù)條 SQL 查詢吼野,利用 UNION, 可給出多條 SELECT 語句校哎,將它們的結(jié)果組合成單個(gè)結(jié)果集。
使用 UNION : 用法,給出每條 SELECT 語句闷哆,在各條 語句之間放上關(guān)鍵字 UNION
腰奋。
UNION 規(guī)則: UNION
必須由兩條或兩條以上的 SELECT
語句組成,語句之間用關(guān)鍵字 UNION 分隔抱怔,UNION
中的每個(gè)查詢必須包含相同的列劣坊,表達(dá)式或聚集函數(shù)。
包含或取消重復(fù)的行: UNION
查詢時(shí)回自動(dòng)去除重復(fù)的行屈留,如果想要返回所有的匹配行局冰,可使用 UNION ALL
而不是 UNION
.
對組合查詢結(jié)果排序: SELECT
語句的輸出用 ORDER BY
子句排序,在用 UNION
組合查詢時(shí)灌危,只能使用一條 ORDER BY 子句康二,他必須出現(xiàn)在最后一條 SELECT 語句之后,對于結(jié)果集勇蝙,不存在用一種方式排序一部分沫勿,用另一種反式排序另一部分。
全文本搜索
為了進(jìn)行全文本搜索味混,必須索引被搜索的列产雹,而且隨著數(shù)據(jù)的改變不斷的被重新索引,在對表列進(jìn)行適當(dāng)設(shè)計(jì)后翁锡,MySQL 會(huì)自動(dòng)進(jìn)行所有的索引和重新索引蔓挖。在索引之后,SELECT 與 Match() 和 Against() 一起使用以時(shí)機(jī)執(zhí)行搜索馆衔。