SQL连接、合并、子查询

连接:连接分为内连接、外连接、交叉连接

内连接和外连接都是在笛卡尔积的基础做一些修改。

合并查询:把两个相似的结果可以用union联合起来。

mysql> select id,time from exam
    -> union
    -> select id,time from recuit;
+-----+------------+
| id  | time       |
+-----+------------+
|   1 | 2016-08-30 |
|   2 | 2016-09-10 |
|   8 | NULL       |
|   9 | 2016-08-31 |
| 100 | 2014-08-06 |
|   1 | 2016-08-31 |
|   2 | 2016-08-25 |
|   3 | 2016-08-31 |
+-----+------------+
8 rows in set (0.14 sec)

子查询:

当子查询为单行单列时:可以用子查询的某条记录作为where condition的元素之一。

mysql> select id from recuit
    -> where id>
    -> (select id from exam where name="tengxun");
+----+
| id |
+----+
|  2 |
|  3 |
|  9 |
+----+
3 rows in set (0.12 sec)

mysql> (select id from exam where name="tengxun");
+----+
| id |
+----+
|  1 |
+----+
1 row in set (0.00 sec)

子查询的返回值为多行多列时:

mysql> select * from recuit
    -> where (id,time)
    -> >
    -> (select id,time from exam where id=1);
+----+------------+-----------------+---------+--------+
| id | time       | process         | name    | result |
+----+------------+-----------------+---------+--------+
|  1 | 2016-08-31 | wait for result | baidu   |      1 |
|  2 | 2016-08-25 | haha            | tengxun |      1 |
|  3 | 2016-08-31 | jiayou          | wangyi  |      1 |
|  9 | 2016-08-31 | happy           | wangyi  |      1 |
+----+------------+-----------------+---------+--------+
4 rows in set (0.02 sec)

带有关键字In的查询,当主查询的条件是子查询的查询结果中时,就可以通过关键字in来判断。相反如果不是可以用not in。

select * from table_name
where field_name in
(select field_name from table_name);

带有关键字ANY的查询:

=ANY:功能与in一样。

>ANY: 返回比子查询中最小的还要大的记录。只要大于子查询中其中一个就行了。

<ANY:返回比子查询中最大的还要小的记录。只要小于一个就行了。

带有关键字ALL的查询:

>ALL:比最大的还要大。

<ALL:比最小的还要小。

带有关键字exists

exist的子查询实际上不返回任何记录,而是返回true和false,如果子查询存在至少一条记录,就会返回true。否则就是false.

问题1:

--users表有1000条记录,id自增,id都大于0

select * from users where exists (select * from users limit 0); --输出多少条记录?

select * from users where exists (select * from users where id < 0); --输出多少条记录?

答案(请选中查看):

10000条

0条

 原因:

exists查询的本质,只要碰到有记录,则返回true;所以limit根本就不会去管,或者说执行不到。

问题2:

exists可以完全代替in吗?

不能。

例如:

--没有关联字段的情况:枚举常量

select * from areas where id in (4, 5, 6);

--没有关联字段的情况:这样exists对子查询,要么全true,要么全false

select * from areas where id in (select city_id from deals where deals.name = ‘xxx‘); 
时间: 2024-11-06 19:00:50

SQL连接、合并、子查询的相关文章

java:Oracle(级联删除,左右内外交叉自然连接,子查询,all,any,in)

1.级联删除: -- 级联删除:裁员,公司倒闭 -- 级联删除(cascade),设置为null(setnull),放任不管(No action) -- cascade:(以一对多为例)如果删除多的一方,一的一方不受任何影响,但是如果删除一的一方,多的一方所有对应数据全部被删除 select * from staff s inner join department d on d.id = s.department_id; delete from staff s where s.id = 1; d

MySQL多表查询之外键、表连接、子查询、索引

一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, 外键可以有重复的, 可以是空值,用来和其他表建立联系用的.所以说,如果谈到了外键,一定是至少涉及到两张表.例如下面这两张表: 上面有两张表:部门表(dept).员工表(emp).Id=Dept_id,而Dept_id就是员工表中的外键:因为员工表中的员工需要知道自己属于哪个部门,就可以通过外键Dep

mysql表连接,子查询以及if判断

创建表: CREATE TABLE emp ( ename varchar(10) DEFAULT NULL, hiredate date DEFAULT NULL, sal decimal(10,2) DEFAULT NULL, deptno int(2) DEFAULT NULL, age int(3) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 CREATE TABLE dept ( deptno int(2) DEFAULT NUL

ORACLE 多表连接与子查询

Oracle表连接 SQL/Oracle使用表连接从多个表中查询数据 语法格式: select 字段列表from table1,table2where table1.column1=table2.column2; 说明: 在where子句中指定连接条件 当被连接的多个表中存在同名字段时,必须在该字段前加上"表名"作为前缀. 连接的类型 Oracle8i之前的表连接: 等值连接(Equijoin) 非等值连接(Non-Equijoin) 外连接(Outer join):-->左外连

sql example 9 -- 子查询

sql example 9 – 子查询 sql example 9 – 子查询 数据库准备 create table student ( id int auto_increment primary key, name varchar(10) ); create table scores ( id int auto_increment PRIMARY key, score int default 0, foreign key (id) references student(id) on delet

MySQL数据库学习笔记(六)----MySQL多表查询之外键、表连接、子查询、索引

注:本文转自:http://www.cnblogs.com/smyhvae/p/4042303.html 本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, 外键可以有重复的, 可以是空值,用来和其他表建立联系用的.所以说,如果谈到了外键,一定是至少涉及到两张表.例如下面这两张表: 上面有两

HIVE:用外连接替代子查询

由于hive也支持sql,很多人会把hql跟标准sql进行比较,甚至有的时候会直接套用.hive不支持事务也不支持索引,更不支持追加写,但是对于一般的sql都是能够支持的.但是对于一些子查询确实无法支持的,例如 ? 1 select * from t_ext_1_bkdoubledelete where f1=(select max(f1) from t_ext_1_bkdoubledelete) 这个sql在mysql中是能够支持的,意思是找到val最大的那一行记录,然后在hive中运行确实报

Oracle_SQL(5) 连接和子查询

一.连接join一般分类: inner join: 内连接,又叫等值连接,只返回两个表中连接字段相等的行. left join :左连接,返回左表中所有的记录以及右表中连接字段相等的记录. right join :右连接,返回右表中所有的记录以及左表中连接字段相等的记录. full join:外连接,返回两个表中的行:left join + right join. cross join:笛卡尔积,就是第一个表的行数乘以第二个表的行数.oracle分类:等值连接 = 外连接(左外连接.右外连接.全

mysql经常使用查询:group by,左连接,子查询,having where

前几天去了两个比較牛的互联网公司面试.在sql这块都遇到问题了,哎.可惜呀,先把简单的梳理一下 成绩表 score 1.group by 使用 按某一个维度进行分组 比如: 求每一个同学的总分 SELECT student,SUM(score) FROM score GROUP BY student 求每一个同学的平均分 SELECT student,AVG(score) FROM score GROUP BY student 也能够依照 班级,课程 来求 2.having 与 where的差别

SQL 基础之子查询、多表插入、merge 语句、跟踪一段时间数据变化(二十)

使用子查询处理数据 可以使用子查询中的数据操纵语言(DML)语句: 使用内嵌视图检索数据 从一张表向另一张表复制数据 基于另一张表的值更新表中数据 基于另一张表的值删除表中的行 使用子查询作为数据源检索数据 select department_name, city from departments natural join (select l.location_id, l.city, l.country_id from loc l join countries c on(l.country_id