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】多个表的查询的更多相关文章

  1. SQL的多表连接查询

    SQL的多表连接查询 多表连接查询具有两种规范,SQL92和SQL99规范. SQL92规范支持下列多表连接查询: (1)等值连接: (2)非等值连接: (3)外连接: (4)广义笛卡尔积: SQL9 ...

  2. SQL Server 锁表、查询被锁表、解锁相关语句

    SQL Server 锁表.查询被锁表.解锁相关语句,供参考. --锁表(其它事务不能读.更新.删除) BEGIN TRAN SELECT * FROM <表名> WITH(TABLOCK ...

  3. SQL Server多表同时查询

    今天在练sql server发现多条语句同时使用可以多表同时查询,具体操作如下: 代码示例: USE teachingGOSELECT *FROM dbo.teach_classORDER BY cl ...

  4. MySQL常用sql语句-----数据表的查询操作

    常用的sql语句如下,应对工作足以 1.查询指定字段 select c_id,c_age,c_name from t_student; select c_id as 编号,c_name as 姓名,c ...

  5. sql server锁表、查询被锁表、解锁被锁表的相关语句

    MSSQL(SQL Server)在我的印象中很容易锁表,大致原因就是你在一个窗口中执行的DML语句没有提交,然后又打开了一个窗口对相同的表进行CRUD操作,这样就会导致锁表.锁表是一种保持数据一致性 ...

  6. SQL语句多表连接查询语法

    一.外连接 1.左连接  left join 或 left outer join SQL语句:select * from student left join score on student.Num= ...

  7. SQL server多表联合查询

    参考网址: https://blog.csdn.net/zou15093087438/article/details/79226394 1. 外连接可分为:左连接.右连接.完全外连接. a.  左连接 ...

  8. 【SQL】单个表的查询

    看到一本好书:名字叫做<数据库系统基础教程> 第三版 岳丽华等译 讲得很清楚,也不啰嗦. 这里是书中第六章的部分笔记: 一.常见用法:  1. AS 定义别名 可省略 2. 可以用加减乘除 ...

  9. sql语句 两表关联查询计算数量

    select sum(a1.`num`)   from `order_orderlistrow` as a1 INNER JOIN `order_orderlist` as a2 on a1.`ord ...

  10. SQL多表连接查询(详细实例)

    转载博客:joeleo博客(http://www.xker.com/page/e2012/0708/117368.html) 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:stud ...

随机推荐

  1. [热键冲突]MacOS下 Pycharm的全局搜索Ctrl+Shift+F失灵

    刚换了MacOS 发现Pycharm下的全局搜索Ctrl+Shift+F失灵了, 经过帖子 https://blog.csdn.net/pxinm/article/details/64444560 知 ...

  2. winform 端口serialport简用

    最近的一个小项目中需要从串口读取摄像机的应答指令,因此在程序中用到了SerialPort控件(使用SerialPort类也可以). 在SerialPort控件的属性列表中主要注意3个地方: (1)Po ...

  3. codeforce580c (dfs)

    题目意思:给你一棵树,然后每个叶子节点会有一家餐馆,你讨厌猫,就不会走有连续超过m个节点有猫的路,然后问你最多去几家饭店 思路:直接DFS Example Input 4 11 1 0 01 21 3 ...

  4. [剑指Offer] 14.链表中倒数第k个结点

    [思路]利用两个相隔为k-1个结点的指针进行遍历,当后一个指针移到末尾时,前一个指针就是要求的结点. /* struct ListNode { int val; struct ListNode *ne ...

  5. Sigar应用

    sigar是一个用于获取底层硬件信息比如:CPU,内存,硬盘,网络等等信息的库.其官网如下: https://support.hyperic.com/display/SIGAR/Home   出于项目 ...

  6. OSCache页面缓存的使用

    完成项目时,为了减少对数据库的频繁操作,引出了缓存,缓存分为以下几种: 1.一级缓存 一级缓存的存储域是session,作用于单个的dao 2.二级缓存 二级缓存的存储域是sessionFactory ...

  7. Intellij IDEA 系统路径配置

    在使用IDEA启动Tomcat的时候,会读取系统路径,默认路径可能不是我们想要的,可以修改 C:\MyPrograms\IntelliJ IDEA 14.0.1\bin\idea.properties ...

  8. ES 1.7安装ik分词elasticsearch-analysis-ik-1.2.5中文同义词实现

    ElasticSearch 中文同义词实现 https://blog.csdn.net/xsdxs/article/details/52806499 参考以下两个网址,但运行报错,以下是我自己改进方式 ...

  9. 【bzoj2705】[SDOI2012]Longge的问题 欧拉函数

    题目描述 Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题.现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N). 输入 一个整数,为N. 输出 ...

  10. BZOJ4373 算术天才⑨与等差数列(线段树)

    看上去很难维护,考虑找一些必要条件.首先显然最大值-最小值=k*(r-l).然后区间内的数需要模k同余.最后区间内的数两两不同(k=0除外).冷静一下可以发现这些条件组合起来就是充分的了. 考虑怎么维 ...