專門的關(guān)系運算符
- 選擇 σ
選擇(對行進行操作) 它是將數(shù)據(jù)表符合條件的一行或多行記錄提取出來
例如:查詢學生表'IS'系的全體學生 - 投影 Π
投影(對列進行操作) 它從數(shù)據(jù)表中選出若干列組成新的關(guān)系
例如:查詢學生表中都有哪些系牵舱,即查詢關(guān)系student上所在系屬性上的投影
補充:投影過后锹引,會自動避免重復行 - 連接 ??
連接join 它是從兩個關(guān)系的笛卡爾積中選取屬性間滿足一定條件的元組
"這里元組通俗講就是 一條記錄击罪、一行數(shù)據(jù)"
-
等值連接
- 自然連接
一般的連接操作是從行的角度進行運算,但自然連接還需要取消重復列峡懈,因而自然連接是從行和列的角度進行運算。
-
外連接|左外連接|右外連接
在自然連接中被舍棄的元組稱作"懸浮元組"与斤,如果把懸浮元組保存在結(jié)果關(guān)系中肪康,而在其它屬性上填空值(Null),此連接稱作外連接撩穿;如果只保留左邊關(guān)系R中的懸浮元組叫做左外連接磷支;如果只保留右邊關(guān)系S中的懸浮元組叫做右外連接
- 除 ÷
一般使用象集來定義除法。
例如:查詢至少選修1號課程和3號課程的學生學號食寡。
FROM子句
- 引用一個表
方式一:
使用USE語句讓一個數(shù)據(jù)庫成為當前數(shù)據(jù)庫齐唆,在這種情況下,如果在FROM子句中指定表名冻河,則該表應(yīng)該屬于當前數(shù)據(jù)庫
方式二:
指定的時候在表名前帶上表所屬數(shù)據(jù)庫的名字
例如 假設(shè)當前數(shù)據(jù)庫是db1箍邮,現(xiàn)在要顯示數(shù)據(jù)庫db2里的表tb的內(nèi)容
SELECT * FROM db2.tb;
- 多表連接
如果要在不同的表中查詢數(shù)據(jù),則必須在from子句中指定多個表叨叙,這時就要使用到連接锭弊。將不同列的數(shù)據(jù)組合到一個表中叫做表的連接。
(1) 全連接
-- 將各個表用逗號分隔擂错,就指定了一個全連接味滞;
-- FROM子句產(chǎn)生的中間結(jié)果是一個新表,新表是每個表的每行都與其他表中的每行交叉以產(chǎn)生所有可能的組合,列包含了所有表中出現(xiàn)的列剑鞍,也就是笛卡兒積昨凡;
--這種連接方式潛在的會產(chǎn)生數(shù)量龐大的行,因為可能得到的行是每個表行數(shù)之積蚁署;
--這種情況我們通常會使用where子句設(shè)定條件將結(jié)果集減少為易于管理的大小便脊,這樣的連接即為等值連接。
舉例:查找學生選修了哪些課程 這里通過成績表和課程表連接實現(xiàn)
select distinct course.Cno,course.Cname from score,course where score.Cno = course.Cno;
mysql> select distinct course.Cno,course.Cname from score,course where score.Cno = course.Cno;
+-----+-----------------+
| Cno | Cname |
+-----+-----------------+
| 001 | 數(shù)學分析 |
| 003 | 微機原理 |
| 004 | 數(shù)據(jù)結(jié)構(gòu) |
| 005 | 操作系統(tǒng) |
| 006 | 數(shù)據(jù)庫原理 |
| 008 | 程序設(shè)計 |
+-----+-----------------+
6 rows in set (0.00 sec)
mysql> select Cno,Cname from course;
+-----+-----------------+
| Cno | Cname |
+-----+-----------------+
| 001 | 數(shù)學分析 |
| 002 | 普通物理 |
| 003 | 微機原理 |
| 004 | 數(shù)據(jù)結(jié)構(gòu) |
| 005 | 操作系統(tǒng) |
| 006 | 數(shù)據(jù)庫原理 |
| 007 | 數(shù)據(jù)庫設(shè)計 |
| 008 | 程序設(shè)計 |
+-----+-----------------+
8 rows in set (0.00 sec)
(2) join連接
使用join關(guān)鍵字進行連接光戈,主要分為三種哪痰。
- 內(nèi)連接 inner
-- 指定了INNER關(guān)鍵字的連接是內(nèi)連接
-- 在上面的全連接中,F(xiàn)ROM子句中產(chǎn)生的中間結(jié)果是兩個表的笛卡兒積久妆,然后再通過where子句進行限制晌杰。內(nèi)連接中FROM子句產(chǎn)生的中間結(jié)果,是應(yīng)用了ON條件后的笛卡兒積筷弦。
-- 內(nèi)連接是系統(tǒng)默認的 可以省略inner關(guān)鍵字肋演,on條件主要用來連接表,其它不屬于連接表的條件都可使用where子句來指定
select distinct course.Cno,course.Cname from score,course where score.Cno = course.Cno;
等同于
select distinct course.Cno,course.Cname from score inner join course on score.Cno = course.Cno;
舉例:
例子一 (on連接表,where指定其它)用FROM子句的JOIN關(guān)鍵字表達下列查詢:查找選修了206課程且成績在80分以上的學生姓名及成績
select 姓名,成績
from xs join xs_kc on xs.學號 = xs_kc.學號
where 課程號 = '206' and 成績>=80;
例子二 (內(nèi)連接用于多個表的連接) 查找選修了“計算機基礎(chǔ)”課程且成績在80分以上的學生學號烂琴、姓名惋啃、課程名及成績
select xs.學號, 姓名, 課程名, 成績
from xs join xs_kc on xs.學號 = xs_kc.學號
join kc on xs_kc.課程號 = kc.課程號
where 課程名 = '計算機基礎(chǔ)' and 成績>=80;
例子三 (自連接) 查找xscj數(shù)據(jù)庫中課程不同、成績相同的學生的學號监右、課程號和成績
# 使用自連接的時候需要為表指定兩個別名边灭,且對所有列的引用均要用別名進行限定
select a.學號,a.課程號,b.課程號,a.成績
from xs_kc as a join xs_kc as b
on a.成績=b.成績 and a.學號=b.學號 and a.課程號!=b.課程號;
例子四 (using子句) using(column_list) column_list為兩表中相同的列名
select distinct course.Cno,course.Cname from score inner join course on score.Cno = course.Cno;
等同于
select distinct course.Cno,course.Cname from score join course using (CNO);
- 外連接 outer
指定了OUTER關(guān)鍵字的連接為外連接,OUTER關(guān)鍵字可以省略健盒。
注意:外連接只能對兩個表進行H奘荨!?垩ⅰ惰帽!
外連接包括:
① 左外連接(LEFT OUTER JOIN):結(jié)果表中除了匹配行外,還包括左表有的但右表中不匹配的行父虑,對于這樣的行该酗,從右表被選擇的列設(shè)置為NULL。
② 右外連接(RIGHT OUTER JOIN):結(jié)果表中除了匹配行外士嚎,還包括右表有的但左表中不匹配的行呜魄,對于這樣的行,從左表被選擇的列設(shè)置為NULL莱衩。
③ 自然連接(NATURAL JOIN):自然連接還有自然左外連接(NATURAL LEFT OUTER JOIN)和自然右外連接(NATURAL RIGHT OUTER JOIN)
舉例:
select score.*,course.Cname from score left join course on score.Cno = course.Cno;
說明:select語句中只選取一個用來連接表的列時爵嗅,可以使用自然連接代替內(nèi)連接。用這種方法笨蚁,可以用自然左外連接來替換左外連接睹晒,自然右外連接替換右連接趟庄。
# 內(nèi)連接
root@localhost >select * from student inner join score on student.sno = score.sno;
+-------+-----------+-------+--------+------+------+-------+------+-------+-------+
| Sno | Sname | Sdept | Sclass | Ssex | Sage | Sno | Cno | Score | Tdept |
+-------+-----------+-------+--------+------+------+-------+------+-------+-------+
| 96001 | 馬小燕 | CS | 01 | 女 | 21 | 96001 | 001 | 77.50 | NULL |
| 96001 | 馬小燕 | CS | 01 | 女 | 21 | 96001 | 003 | 89.00 | NULL |
| 96001 | 馬小燕 | CS | 01 | 女 | 21 | 96001 | 004 | 86.00 | NULL |
| 96001 | 馬小燕 | CS | 01 | 女 | 21 | 96001 | 005 | 82.00 | NULL |
| 96002 | 黎明 | CS | 01 | 男 | 18 | 96002 | 001 | 88.00 | NULL |
| 96002 | 黎明 | CS | 01 | 男 | 18 | 96002 | 003 | 92.50 | NULL |
| 96002 | 黎明 | CS | 01 | 男 | 18 | 96002 | 006 | 90.00 | NULL |
| 96003 | 劉東明 | MA | 01 | 男 | 18 | 96003 | 001 | 69.00 | NULL |
| 96003 | 劉東明 | MA | 01 | 男 | 18 | 96003 | 003 | 91.00 | NULL |
| 96004 | 趙志勇 | IS | 02 | 男 | 20 | 96004 | 001 | 87.00 | NULL |
| 97001 | 馬蓉 | MA | 02 | 女 | 19 | 97001 | 001 | 96.00 | NULL |
| 97001 | 馬蓉 | MA | 02 | 女 | 19 | 97001 | 008 | 95.00 | NULL |
| 97002 | 李成功 | CS | 01 | 男 | 20 | 97002 | 003 | 91.00 | NULL |
| 97002 | 李成功 | CS | 01 | 男 | 20 | 97002 | 004 | NULL | NULL |
| 97002 | 李成功 | CS | 01 | 男 | 20 | 97002 | 006 | 92.00 | NULL |
| 97003 | 黎明 | IS | 03 | 女 | 19 | 97003 | 001 | 59.00 | NULL |
| 97003 | 黎明 | IS | 03 | 女 | 19 | 97003 | 003 | 58.00 | NULL |
| 97004 | 李麗 | CS | 02 | 女 | 19 | 97004 | 005 | 90.00 | NULL |
| 97004 | 李麗 | CS | 02 | 女 | 19 | 97004 | 006 | 85.00 | NULL |
| 97004 | 李麗 | CS | 02 | 女 | 19 | 97004 | 008 | 70.00 | NULL |
+-------+-----------+-------+--------+------+------+-------+------+-------+-------+
20 rows in set (0.00 sec)
# 在這里 自然連接 等同于 內(nèi)連接
root@localhost >select * from student natural join score;
+-------+-----------+-------+--------+------+------+------+-------+-------+
| Sno | Sname | Sdept | Sclass | Ssex | Sage | Cno | Score | Tdept |
+-------+-----------+-------+--------+------+------+------+-------+-------+
| 96001 | 馬小燕 | CS | 01 | 女 | 21 | 001 | 77.50 | NULL |
| 96001 | 馬小燕 | CS | 01 | 女 | 21 | 003 | 89.00 | NULL |
| 96001 | 馬小燕 | CS | 01 | 女 | 21 | 004 | 86.00 | NULL |
| 96001 | 馬小燕 | CS | 01 | 女 | 21 | 005 | 82.00 | NULL |
| 96002 | 黎明 | CS | 01 | 男 | 18 | 001 | 88.00 | NULL |
| 96002 | 黎明 | CS | 01 | 男 | 18 | 003 | 92.50 | NULL |
| 96002 | 黎明 | CS | 01 | 男 | 18 | 006 | 90.00 | NULL |
| 96003 | 劉東明 | MA | 01 | 男 | 18 | 001 | 69.00 | NULL |
| 96003 | 劉東明 | MA | 01 | 男 | 18 | 003 | 91.00 | NULL |
| 96004 | 趙志勇 | IS | 02 | 男 | 20 | 001 | 87.00 | NULL |
| 97001 | 馬蓉 | MA | 02 | 女 | 19 | 001 | 96.00 | NULL |
| 97001 | 馬蓉 | MA | 02 | 女 | 19 | 008 | 95.00 | NULL |
| 97002 | 李成功 | CS | 01 | 男 | 20 | 003 | 91.00 | NULL |
| 97002 | 李成功 | CS | 01 | 男 | 20 | 004 | NULL | NULL |
| 97002 | 李成功 | CS | 01 | 男 | 20 | 006 | 92.00 | NULL |
| 97003 | 黎明 | IS | 03 | 女 | 19 | 001 | 59.00 | NULL |
| 97003 | 黎明 | IS | 03 | 女 | 19 | 003 | 58.00 | NULL |
| 97004 | 李麗 | CS | 02 | 女 | 19 | 005 | 90.00 | NULL |
| 97004 | 李麗 | CS | 02 | 女 | 19 | 006 | 85.00 | NULL |
| 97004 | 李麗 | CS | 02 | 女 | 19 | 008 | 70.00 | NULL |
+-------+-----------+-------+--------+------+------+------+-------+-------+
20 rows in set (0.00 sec)
# 在這里 自然左外連接 等同于 左外連接
root@localhost >select * from student natural left outer join score;
+-------+--------------+-------+--------+------+------+------+-------+-------+
| Sno | Sname | Sdept | Sclass | Ssex | Sage | Cno | Score | Tdept |
+-------+--------------+-------+--------+------+------+------+-------+-------+
| 20001 | 趙薇 | IS | 02 | 女 | 19 | NULL | NULL | NULL |
| 96001 | 馬小燕 | CS | 01 | 女 | 21 | 001 | 77.50 | NULL |
| 96001 | 馬小燕 | CS | 01 | 女 | 21 | 003 | 89.00 | NULL |
| 96001 | 馬小燕 | CS | 01 | 女 | 21 | 004 | 86.00 | NULL |
| 96001 | 馬小燕 | CS | 01 | 女 | 21 | 005 | 82.00 | NULL |
| 96002 | 黎明 | CS | 01 | 男 | 18 | 001 | 88.00 | NULL |
| 96002 | 黎明 | CS | 01 | 男 | 18 | 003 | 92.50 | NULL |
| 96002 | 黎明 | CS | 01 | 男 | 18 | 006 | 90.00 | NULL |
| 96003 | 劉東明 | MA | 01 | 男 | 18 | 001 | 69.00 | NULL |
| 96003 | 劉東明 | MA | 01 | 男 | 18 | 003 | 91.00 | NULL |
| 96004 | 趙志勇 | IS | 02 | 男 | 20 | 001 | 87.00 | NULL |
| 97001 | 馬蓉 | MA | 02 | 女 | 19 | 001 | 96.00 | NULL |
| 97001 | 馬蓉 | MA | 02 | 女 | 19 | 008 | 95.00 | NULL |
| 97002 | 李成功 | CS | 01 | 男 | 20 | 003 | 91.00 | NULL |
| 97002 | 李成功 | CS | 01 | 男 | 20 | 004 | NULL | NULL |
| 97002 | 李成功 | CS | 01 | 男 | 20 | 006 | 92.00 | NULL |
| 97003 | 黎明 | IS | 03 | 女 | 19 | 001 | 59.00 | NULL |
| 97003 | 黎明 | IS | 03 | 女 | 19 | 003 | 58.00 | NULL |
| 97004 | 李麗 | CS | 02 | 女 | 19 | 005 | 90.00 | NULL |
| 97004 | 李麗 | CS | 02 | 女 | 19 | 006 | 85.00 | NULL |
| 97004 | 李麗 | CS | 02 | 女 | 19 | 008 | 70.00 | NULL |
| 97005 | 司馬志明 | CS | 02 | 男 | 18 | NULL | NULL | NULL |
+-------+--------------+-------+--------+------+------+------+-------+-------+
22 rows in set (0.01 sec)
# 左外連接
root@localhost >select * from student left outer join score on student.sno = score.sno;
+-------+--------------+-------+--------+------+------+-------+------+-------+-------+
| Sno | Sname | Sdept | Sclass | Ssex | Sage | Sno | Cno | Score | Tdept |
+-------+--------------+-------+--------+------+------+-------+------+-------+-------+
| 20001 | 趙薇 | IS | 02 | 女 | 19 | NULL | NULL | NULL | NULL |
| 96001 | 馬小燕 | CS | 01 | 女 | 21 | 96001 | 001 | 77.50 | NULL |
| 96001 | 馬小燕 | CS | 01 | 女 | 21 | 96001 | 003 | 89.00 | NULL |
| 96001 | 馬小燕 | CS | 01 | 女 | 21 | 96001 | 004 | 86.00 | NULL |
| 96001 | 馬小燕 | CS | 01 | 女 | 21 | 96001 | 005 | 82.00 | NULL |
| 96002 | 黎明 | CS | 01 | 男 | 18 | 96002 | 001 | 88.00 | NULL |
| 96002 | 黎明 | CS | 01 | 男 | 18 | 96002 | 003 | 92.50 | NULL |
| 96002 | 黎明 | CS | 01 | 男 | 18 | 96002 | 006 | 90.00 | NULL |
| 96003 | 劉東明 | MA | 01 | 男 | 18 | 96003 | 001 | 69.00 | NULL |
| 96003 | 劉東明 | MA | 01 | 男 | 18 | 96003 | 003 | 91.00 | NULL |
| 96004 | 趙志勇 | IS | 02 | 男 | 20 | 96004 | 001 | 87.00 | NULL |
| 97001 | 馬蓉 | MA | 02 | 女 | 19 | 97001 | 001 | 96.00 | NULL |
| 97001 | 馬蓉 | MA | 02 | 女 | 19 | 97001 | 008 | 95.00 | NULL |
| 97002 | 李成功 | CS | 01 | 男 | 20 | 97002 | 003 | 91.00 | NULL |
| 97002 | 李成功 | CS | 01 | 男 | 20 | 97002 | 004 | NULL | NULL |
| 97002 | 李成功 | CS | 01 | 男 | 20 | 97002 | 006 | 92.00 | NULL |
| 97003 | 黎明 | IS | 03 | 女 | 19 | 97003 | 001 | 59.00 | NULL |
| 97003 | 黎明 | IS | 03 | 女 | 19 | 97003 | 003 | 58.00 | NULL |
| 97004 | 李麗 | CS | 02 | 女 | 19 | 97004 | 005 | 90.00 | NULL |
| 97004 | 李麗 | CS | 02 | 女 | 19 | 97004 | 006 | 85.00 | NULL |
| 97004 | 李麗 | CS | 02 | 女 | 19 | 97004 | 008 | 70.00 | NULL |
| 97005 | 司馬志明 | CS | 02 | 男 | 18 | NULL | NULL | NULL | NULL |
+-------+--------------+-------+--------+------+------+-------+------+-------+-------+
22 rows in set (0.00 sec)
- 交叉連接 cross join
指定了CROSS JOIN關(guān)鍵字的連接是交叉連接
在mysql中,cross join從語法上與inner join相同
另外 straight_join連接用法和inner join連接相同伪很,不同的是straight_join后不可以使用using子句代替on條件戚啥。