SQL2-子查询、join查询

SQL常用高级查询包括:Join查询、子查询。

子查询:

USE flowershopdb

--子查询:在一个select语句使用另一个select 语句作为条件或数据来源.
--查询块:一个select子句.
--嵌套查询:在一个查询块中嵌套另一个查询块.内层查询叫子查询,外层查询叫主查询.

--1 不相关子查询:子查询不依赖于主查询,子查询可以独立执行.

--作为条件
SELECT * FROM tb_detailed
WHERE c_id = (SELECT c_id FROM tb_category WHERE c_name=‘生日花‘)
--作为列
SELECT (SELECT c_name FROM tb_category WHERE c_id=1000),(SElECT d_remark FROM tb_detailed WHERE d_id=2000)

--2 相关子查询:子查询依赖于主查询,子查询不可以独立执行.
SELECT de.* FROM tb_detailed de
WHERE de.c_id = (SElECT ca.c_id FROM tb_category ca WHERE ca.c_id=1001 AND ca.c_id=de.d_id )

--关键字:IN ALL ANY
--注:子查询必需有括起来().
--IN    表示查询结果是否在子查询结果集中
--All    表示查询结果要满足子查询的所有条件
--Any    表示查询结果要满足子查询的的任一个条件

-- IN 用于多个结果集
SELECT * FROM tb_detailed
WHERE d_id IN (SElECT d_id FROM tb_detailed WHERE d_remark=‘生日用花‘)

-- ALL
-- >all、<all、>=all、<all
SELECT de.* FROM tb_detailed de
WHERE de.d_id > ALL(SElECT pr.d_id FROM tb_product pr WHERE pr.p_price>3)
--相当于
SELECT de.* FROM tb_detailed de
WHERE de.d_id > (SElECT MAX(pr.d_id) FROM tb_product pr WHERE pr.p_price>3)

-- ANY
-- >any、<any、<=any、>=any
SELECT de.* FROM tb_detailed de
WHERE de.d_id > ANY(SElECT pr.d_id FROM tb_product pr WHERE pr.p_price>3)
--相当于
SELECT de.* FROM tb_detailed de
WHERE de.d_id > ANY(SElECT MIN(pr.d_id) FROM tb_product pr WHERE pr.p_price>3)

--关键字:
--EXISTS 用于检查子查询是否至少会返回一行数据,该子查询实际上不返回任何数据,而是返回true或false【指定子查询,检测行的存在】

SELECT * FROM tb_user  WHERE EXISTS (SELECT NULL)
--等同于
SELECT * FROM tb_user

SELECT de.* FROM tb_detailed de
WHERE EXISTS(SElECT ca.c_id FROM tb_category ca WHERE ca.c_id=1001 AND ca.c_id=de.d_id )
--等同于
SELECT de.* FROM tb_detailed de
WHERE de.c_id IN(SElECT ca.c_id FROM tb_category ca WHERE ca.c_id=1001 AND ca.c_id=de.d_id )

--NOT EXISTS 如果子查询没有返回行,则满足Not Exists中的Where子句
SELECT de.* FROM tb_detailed de
WHERE NOT EXISTS(SElECT ca.c_id FROM tb_category ca WHERE ca.c_id=1001 AND ca.c_id=de.d_id )

Join查询:

CREATE DATABASE selectdb
USE selectdb

SELECT * FROM A
SELECT * FROM B

--多表条件查询
SELECT * FROM A,B WHERE A.A=B.A

--Jion表连接
--[join是和哪个表连接,on后是连接的关系是什么]

--内连接 INNER JOIN
-- 只连接匹配的行
SELECT A.A,A.B,A.C,B.D,B.E FROM A INNER JOIN B
ON A.A=B.A

--左外连接 LEFT [OUTER] JOIN
--包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行
SELECT A.A,A.B,A.C,B.D,B.E FROM A LEFT JOIN B
ON A.A=B.A

--右外连接 RIGHT [OUTER] JOIN
--包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行
SELECT A.A,A.B,A.C,B.D,B.E FROM A RIGHT JOIN B
ON A.A=B.A

--全连接 FULL [OUTER] JOIN
-- 包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行。
SELECT A.A,A.B,A.C,B.D,B.E FROM A FULL JOIN B
ON A.A=B.A

--交叉连接 CROSS JOIN
-- 生成笛卡尔积-它不使用任何匹配或者选取条件,而是直接将一个数据源中的每个行与另一个数据源的每个行都一一匹配
--A中的每一条数据与B中的每一条数据交叉 3*3
SELECT * FROM A CROSS JOIN B 

--自连接
--自身连接是指同一个表自己与自己进行连接。这种一元连接通常用于从自反关系(也称作递归关系)中抽取数据。
SELECT *
FROM B b1
JOIN B b2
ON b1.A=b2.D

SELECT * FROM B

更多查询链接:http://www.cnblogs.com/hoojo/archive/2011/07/16/2108129.html

时间: 2024-12-22 05:35:45

SQL2-子查询、join查询的相关文章

tp5 thinkphp5 多表关联查询 join查询

model下: $res = \think\Db::name('article') ->alias("a") //取一个别名 ->join('admin ad','a.aid = ad.admin_id') ->field('a.aid,ad.admin_id ') ->select(); 原文地址:https://www.cnblogs.com/qcjdp/p/10837635.html

MySql学习 - 查询/子查询/连接查询/联合查询

数据库查询 设定两张数据库表 第一个表格user包含: user_id username age sex 1 Alps1992 22 man 第二个表格toy包含 user_id toyname 1 OnePiece 普通查询: 查询关键字: AS, SUM, DESC, GROUP BY, ORDER BY, AVG, MIN, MAX, COUNT, LIMIT; 关键字查询例子 select * from user as u order by age limit 5; // as 用来做别

Oracle基本语法&amp;&amp;函数&amp;&amp;子查询&amp;&amp;分页查询&amp;&amp;排序&amp;&amp;集合操作&amp;&amp;高级分组函数

一.  数据库 手工---文件管理---数据库 DB:Database 数据库. DBMS:管理数据库的软件.(oracle) 主流关系数据库: 1.      Oracle 2.      DB2 3.      SQL Server 基本没人使 4.      MySQL  基本没人用,免费 Linux 开源,可以发现漏洞补上 Windows服务器会有补丁,数据易泄漏 eclipse 日食 数据表(Table): 表的行(Row):记录 表的列(Column):字段 二.  关系型数据库 一

18 12 06 sql 的 基本语句 查询 条件查询 逻辑运算符 模糊查询 范围查询 排序 聚合函数 分组 分页 连接查询 自关联 子查询

-- 数据的准备 -- 创建一个数据库 create database python_test charset=utf8; -- 使用一个数据库 use python_test; -- 显示使用的当前数据是哪个? select database(); -- 创建一个数据表 -- students表 create table students( id int unsigned primary key auto_increment not null, name varchar(20) default

Hibernate 笔记 HQL查询 条件查询,聚集函数,子查询,导航查询

本笔记继续使用dept部门表,emp员工表,一对多多对一双向映射. 1 条件查询 1.1    查询 员工表emp中 年龄eage小于30,月薪esal大于20000的员工姓名ename sql:select ename from emp where eage<? and esal >?; hql: select ename from Emp where eage<? and esal >? 1.2 问号的设置与别名 问号(?)的设置使用.setParameter(位置, 属性值)

hsql数据量大的时候 left join 查询非常慢

最近遇到使用hsql查询两张表的时候,发现一旦left join就差些很慢,单独查很快,不知道为什么. 然后听说hsql只要数据量稍微大点,再 join一下就很慢,绞尽脑汁想到了一天终于想到办法了. 于是拆分sql把依然使用left join,但是事先把两个表的结果集变小就可以left join了.例子如下 select p.parent_id, p.id, p.pid, p.c_name, p.path, p.params, p.p_type, p.area_code, p.appid, SU

SQL中order by;group up;like;关联查询join on的用法

排序order by的用法: 1.order by 字段名1 asc/desc, 字段名2 asc/desc,... 先按照字段名1的升序/降续给表进行排列 然后 按照字段名2的升序/降续给表进行排列. 其中排在前面的字段名优先进行排列,排在后面的在前面的基础上在进行排列. 2. order by 字段序号 asc/desc, 字段序号 asc/desc,... 按照字段的序号进行排列,字段的序号就是表中每个字段从左到右依次排列的顺序,从1开始.字段序号对应相应的字段名. 3. asc(升序)/

mysql join 查询图

mysql join 查询,特别是对查两个表之间的差集,可以用table字段=null来做. 注意千万不是join on XX!=XX  ,这样出来的结果是错误的.

Oracle多表连接查询Join

Left join 和right join 为外部连接,inner join 为内部连接 Left join 左侧为主表,右侧为从表,主表会显示出所有数据,从表则只显示关联到的数据,不满足连接条件 的行数据用NULL补全 right join 右侧为主表,左侧为从表,主表会显示出所有数据,从表则只显示关联到的数据,不满足连接条件 的行数据用NULL补全 inner join 则只显示2张表关联条件相匹配的数据 (1)dept(部门表) (2)emp(雇员表) 1.inner join 语法:se