6_mysql查询之from子句

专门的关系运算符
  1. 选择 σ
    选择(对进行操作) 它是将数据表符合条件的一行或多行记录提取出来
    例如:查询学生表'IS'系的全体学生
  2. 投影 Π
    投影(对进行操作) 它从数据表中选出若干列组成新的关系
    例如:查询学生表中都有哪些系,即查询关系student上所在系属性上的投影
    补充:投影过后,会自动避免重复行
  3. 连接 ▷◁
    连接join 它是从两个关系的笛卡尔积中选取属性间满足一定条件的元组
    "这里元组通俗讲就是 一条记录、一行数据"
关系R和关系S
  • 等值连接


    等值连接
  • 自然连接
    一般的连接操作是从行的角度进行运算,但自然连接还需要取消重复列,因而自然连接是从行和列的角度进行运算。
    自然连接
  • 外连接|左外连接|右外连接
    在自然连接中被舍弃的元组称作"悬浮元组",如果把悬浮元组保存在结果关系中,而在其它属性上填空值(Null),此连接称作外连接;如果只保留左边关系R中的悬浮元组叫做左外连接;如果只保留右边关系S中的悬浮元组叫做右外连接


    外连接|左外连接|右外连接
  1. 除 ÷
    一般使用象集来定义除法。
    例如:查询至少选修1号课程和3号课程的学生学号。

FROM子句
  1. 引用一个表
    方式一:
    使用USE语句让一个数据库成为当前数据库,在这种情况下,如果在FROM子句中指定表名,则该表应该属于当前数据库
    方式二:
    指定的时候在表名前带上表所属数据库的名字
    例如 假设当前数据库是db1,现在要显示数据库db2里的表tb的内容
    SELECT * FROM db2.tb;
  2. 多表连接
    如果要在不同的表中查询数据,则必须在from子句中指定多个表,这时就要使用到连接。将不同列的数据组合到一个表中叫做表的连接。

(1) 全连接
-- 将各个表用逗号分隔,就指定了一个全连接;
-- FROM子句产生的中间结果是一个新表,新表是每个表的每行都与其他表中的每行交叉以产生所有可能的组合,列包含了所有表中出现的列,也就是笛卡儿积
--这种连接方式潜在的会产生数量庞大的行,因为可能得到的行是每个表行数之积;
--这种情况我们通常会使用where子句设定条件将结果集减少为易于管理的大小,这样的连接即为等值连接
举例:查找学生选修了哪些课程 这里通过成绩表和课程表连接实现
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 | 数学分析        |
| 003 | 微机原理        |
| 004 | 数据结构        |
| 005 | 操作系统        |
| 006 | 数据库原理      |
| 008 | 程序设计        |
+-----+-----------------+
6 rows in set (0.00 sec)

mysql> select Cno,Cname from course;
+-----+-----------------+
| Cno | Cname           |
+-----+-----------------+
| 001 | 数学分析        |
| 002 | 普通物理        |
| 003 | 微机原理        |
| 004 | 数据结构        |
| 005 | 操作系统        |
| 006 | 数据库原理      |
| 007 | 数据库设计      |
| 008 | 程序设计        |
+-----+-----------------+
8 rows in set (0.00 sec)

(2) join连接
使用join关键字进行连接,主要分为三种。

  • 内连接 inner
    -- 指定了INNER关键字的连接是内连接
    -- 在上面的全连接中,FROM子句中产生的中间结果是两个表的笛卡儿积,然后再通过where子句进行限制。内连接中FROM子句产生的中间结果,是应用了ON条件后的笛卡儿积。
    -- 内连接是系统默认的 可以省略inner关键字,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关键字表达下列查询:查找选修了206课程且成绩在80分以上的学生姓名及成绩

select 姓名,成绩
from xs join xs_kc on xs.学号 = xs_kc.学号 
where 课程号 = '206' and 成绩>=80;

例子二 (内连接用于多个表的连接) 查找选修了“计算机基础”课程且成绩在80分以上的学生学号、姓名、课程名及成绩

select xs.学号, 姓名, 课程名, 成绩
from xs join xs_kc on xs.学号 = xs_kc.学号 
join kc on xs_kc.课程号 = kc.课程号
where 课程名 = '计算机基础' and 成绩>=80;

例子三 (自连接) 查找xscj数据库中课程不同、成绩相同的学生的学号、课程号和成绩

# 使用自连接的时候需要为表指定两个别名,且对所有列的引用均要用别名进行限定
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关键字的连接为外连接,OUTER关键字可以省略。
    注意:外连接只能对两个表进行!!!!
    外连接包括:
    ① 左外连接(LEFT OUTER JOIN):结果表中除了匹配行外,还包括左表有的但右表中不匹配的行,对于这样的行,从右表被选择的列设置为NULL。
    ② 右外连接(RIGHT OUTER JOIN):结果表中除了匹配行外,还包括右表有的但左表中不匹配的行,对于这样的行,从左表被选择的列设置为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语句中只选取一个用来连接表的列时,可以使用自然连接代替内连接。用这种方法,可以用自然左外连接来替换左外连接,自然右外连接替换右连接。
# 内连接
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)

# 在这里 自然连接 等同于 内连接
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关键字的连接是交叉连接
    在mysql中,cross join从语法上与inner join相同
    另外 straight_join连接用法和inner join连接相同,不同的是straight_join后不可以使用using子句代替on条件。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341