【SQL】多个表的查询
1.元组变量
SELECT * FROM a AS x, a AS y;
结果是显示自己和自己的笛卡尔乘积。
如果查询中对于某一个关系使用了多次,为了区别他们的属性,需要对关系定义别名,然后用 别名.属性 来区分。
SELECT Star1.name, Star2.name
FROM MovieStar Star1, MovieStar Star2
WHERE Star1.address = Star2.address
AND Star1.name < Star2.name;
注意,最后名称要用<, 如果只用 <> 会导致同样的两个名字输出两遍(仅顺序不同)
2.消除属性歧义
如果几个关系都有相同的属性名,通过 关系名.属性名 解决。
SELECT MovieStar.name, MovieExec.name
FROM MovieStar, MovieExec
WHERE MovieStar.address = MovieExec.address;
3.
Mysql 中不支持 SQL 的 INTERSECT(交集), EXCEPT(差),UNION(并集)关键字
4.子查询
某个查询是另一个查询的一部分时,称为子查询。
4.1 产生标量值的子查询(子查询的结果仅有一个唯一值)
SELECT name
FROM MovieExec
WHERE cert# =
(SELECT producerC#
FROM Movies
WHERE title = 'Star Wars');
上面语句成功的必要条件:子查询中返回的producerC#只能有一个成员!多了会报错!!

如图,是一个返回了多个值的例子。报错Subquery returns more than 1 row.
4.2关系的条件表达式
下面的表达式,必须在关系是子查询的时候使用,返回布尔值结果。
EXISTS R: R非空为真
s IN R: s等于R中的某个值
s NOT IN R: s不等于R中任何一个值
s > ALL R: s比一元R中的任意值都大(R未必一元,只要s与R的分量相同即可)
s > ANY R: s至少大于一元R中的某一个值
NOT 可以加在前面表示取反: NOT EXISTS R; NOT s > ANY R;
上述例子中的 > 可以换成 =, <>, <, >=, <= 中的任何一个。
SELECT name
FROM MovieExec
WHERE cert# IN
(SELECT producerC#
FROM Movies
WHERE (title, year) IN
(SELECT movieTitle, movieYear
FROM StarsIn
WHERE starName = 'Harrison Ford'
)
);
4.3 关联子查询
SELECT title
FROM Movies Old
WHERE year < ANY
(SELECT year
FROM Movies
WHERE title = Old.title
);
找到被多部电影同时使用的电影名,一个电影名出现n次则输出n-1次。
与上面的不同在于:Old.title的值不是固定的
4.4 FROM子句中的子查询
SELECT name
FROM MovieExec, (SELECT producerC#
FROM Movies, StarsIn
WHERE title = movieTitle AND
year = movieYear AND
starName = 'Harrison Ford'
)Prod
WHERE cert# = Prod.producerC#;
4.5连接表达式-交叉连接
SELECT * FROM Movies CROSS JOIN StarsIn;
CROSS JOIN: 表示交叉连接,即积或笛卡尔积。
4.6连接表达式-θ连接
θ连接: 在笛卡尔积的基础上做条件选择。
JOIN ... ON: ON后面跟条件
Movies JOIN StarsIn ON
title = movieTitle AND year = movieYear;
SELECT title, year, length, genre
FROM Movies JOIN StarsIn ON
title = movieTitle AND year = movieYear;
4.7连接表达式-自然连接
自然连接:把两个关系中相同属性的值相同的取出。如
![]() |
![]() |
![]() |
相同的属性不会多次出现,这是自然连接和笛卡尔积的关键区别
NATURAL JOIN:
SELECT *
FROM Nums1 NATURAL JOIN Nums2;
4.8连接表达式-外连接
外连接:把自然连接中的的悬浮元祖考虑进来,把没有值的地方用空显示。
![]() |
![]() |
![]() |
![]() |
![]() |
| 关系U | 关系V | 左外连接结果 | 右外连接结果 | 全外连接结果 |
左外连接:MovieStar NATURAL LEFT OUTER JOIN MovieExec;
右外连接:MovieStar NATURAL RIGHT OUTER JOIN MovieExec;
全外连接:MovieStar NATURAL FULL OUTER JOIN MovieExec; (mysql不支持全外连接,但是左右外连接支持)
书上说,外连接也可以加条件,方法是把NATURAL去掉后在JOIN后面通过ON关键字加条件。但是我在mysql上实验了下,发现不行。去掉NATURAL后得到的结果就不是自然连接了,相同的属性名会出现多次,跟笛卡尔积比较像。
【SQL】多个表的查询的更多相关文章
- SQL的多表连接查询
SQL的多表连接查询 多表连接查询具有两种规范,SQL92和SQL99规范. SQL92规范支持下列多表连接查询: (1)等值连接: (2)非等值连接: (3)外连接: (4)广义笛卡尔积: SQL9 ...
- SQL Server 锁表、查询被锁表、解锁相关语句
SQL Server 锁表.查询被锁表.解锁相关语句,供参考. --锁表(其它事务不能读.更新.删除) BEGIN TRAN SELECT * FROM <表名> WITH(TABLOCK ...
- SQL Server多表同时查询
今天在练sql server发现多条语句同时使用可以多表同时查询,具体操作如下: 代码示例: USE teachingGOSELECT *FROM dbo.teach_classORDER BY cl ...
- MySQL常用sql语句-----数据表的查询操作
常用的sql语句如下,应对工作足以 1.查询指定字段 select c_id,c_age,c_name from t_student; select c_id as 编号,c_name as 姓名,c ...
- sql server锁表、查询被锁表、解锁被锁表的相关语句
MSSQL(SQL Server)在我的印象中很容易锁表,大致原因就是你在一个窗口中执行的DML语句没有提交,然后又打开了一个窗口对相同的表进行CRUD操作,这样就会导致锁表.锁表是一种保持数据一致性 ...
- SQL语句多表连接查询语法
一.外连接 1.左连接 left join 或 left outer join SQL语句:select * from student left join score on student.Num= ...
- SQL server多表联合查询
参考网址: https://blog.csdn.net/zou15093087438/article/details/79226394 1. 外连接可分为:左连接.右连接.完全外连接. a. 左连接 ...
- 【SQL】单个表的查询
看到一本好书:名字叫做<数据库系统基础教程> 第三版 岳丽华等译 讲得很清楚,也不啰嗦. 这里是书中第六章的部分笔记: 一.常见用法: 1. AS 定义别名 可省略 2. 可以用加减乘除 ...
- sql语句 两表关联查询计算数量
select sum(a1.`num`) from `order_orderlistrow` as a1 INNER JOIN `order_orderlist` as a2 on a1.`ord ...
- SQL多表连接查询(详细实例)
转载博客:joeleo博客(http://www.xker.com/page/e2012/0708/117368.html) 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:stud ...
随机推荐
- 语法测试cnblogs使用Markdown
参考自作业部落Cmd Markdown 编辑器 https://www.zybuluo.com 欢迎使用 Cmd Markdown 编辑阅读器 什么是 Markdown Markdown 是一种方便记 ...
- Java——异常博客作业
本次任务地址 6. 为如下代码加上异常处理 6.1 改正代码,并增加如下功能.当找不到文件时,需提示用户找不到文件xxx,请重新输入文件名,然后尝试重新打开. 如果是其他异常则提示打开或读取文件失败! ...
- viterbi维特比算法和隐马尔可夫模型(HMM)
隐马尔可夫模型(HMM) 原文地址:http://www.cnblogs.com/jacklu/p/7753471.html 本文结合了王晓刚老师的ENGG 5202 Pattern Recognit ...
- 二分查找 Binaryserach
二分查找: 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中元素是按升 ...
- Linux相关——关于文件调用
本文主要记录几个常见文件调用(表示为了造数据试了n种方法,,,发现了一些神奇的东西,会在下面一一说明. 首先在程序中我们可以打开和关闭程序. 常见的freopen用法简单,但是只能使用一次,如果在程序 ...
- AOJ.800 热身之开关灯
热身之开关灯 Time Limit: 1000 ms Case Time Limit: 1000 ms Memory Limit: 64 MB Total Submission: 276 Submis ...
- P2765 魔术球问题(网络流24题)
题目描述 «问题描述: 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为1,2,3,...的球. (1)每次只能在某根柱子的最上面放球. (2)在同一根柱子中,任何2个相邻球的编号之和为完全 ...
- springboot中 后端跨域的实现配置
在springboot的启动文件中,添加此内容,可以允许跨域
- 笔记本电脑上面安装linux网络配置以及ping通问题
ping不同,XShell连接不上linux: 360全部关闭,即可. 具体参考: http://blog.csdn.net/xiezhaoxuan/article/details/52673236 ...
- 【转载】How long is “too long” for MySQL Connections to sleep?
From:http://dba.stackexchange.com/questions/1558/how-long-is-too-long-for-mysql-connections-to-sleep ...







