精华内容
下载资源
问答
  • 【MySQL】多表联合查询、连接查询、子查询

    万次阅读 多人点赞 2019-06-03 17:08:20
    联合查询的意义: 查询同一张表,但是需求不同 如查询学生信息, 男生身高升序, 女生身高降序 多表查询: 多张表的结构是完全一样的,保存的数据(结构)也是一样的. 联合查询order by的使用 在联合查询中: order by不能...

    【1】连接查询

    连接查询的意义: 在用户查看数据的时候,需要显示的数据来自多张表.

    内连接查询

    内连接查询是最常见的连接查询,内连接查询可以查询两张或两张以上的表

    内连接:[inner] join:从左表中取出每一条记录,去右表中与所有的记录进行匹配: 匹配必须是某个条件在左表中与右表中相同最终才会保留结果,否则不保留.

    基本语法:左表 [inner] join 右表 on 左表.字段 = 右表.字段;
    on表示连接条件: 条件字段就是代表相同的业务含义(如my_student.c_id和my_class.id)

    当两个表中存在相同意义的字段的时候,就可以通过该字段来连接查询这两个表,当该字段的值相同时就可以查出该记录。

    内连接可以没有连接条件: 没有on之后的内容,这个时候系统会保留所有结果。

    例:

    select a.id,a.name,a.sex,b.country,b.city,b.street 
    from student a 
    join addr b 
    on a.addrid=b.addrid;
    

    在这里插入图片描述

    外连接查询

    以某张表为主,取出里面的所有记录, 然后每条与另外一张表进行连接: 不管能不能匹配上条件,最终都会保留: 能匹配,正确保留; 不能匹配,其他表的字段都置空NULL。

    左连接

    left join: 左外连接(左连接), 以左表为主表
    基本语法: from 左表 left join 右表 on 左表.字段 = 右表.字段;

    左表不管能不能匹配上条件,最终都会保留:能匹配,正确的保留; 若不能匹配,右表的字段都置NULL。

    例:

    select a.id,a.name,a.addrid,b.country,b.city
    from student a left join addr b
    on a.addrid=b.addrid;
    

    在这里插入图片描述

    右连接

    right join: 右外连接(右连接), 以右表为主表
    基本语法: from 左表 right join 右表 on 左表.字段 = 右表.字段;
    右表不管能不能匹配上条件,最终都会保留:能匹配,正确的保留; 若不能匹配,左表的字段都置NULL。

    例:

    select a.id,a.name,a.addrid,b.country,b.city
    from student a right join addr b
    on a.addrid=b.addrid;
    

    在这里插入图片描述

    【2】联合查询

    联合查询
    联合查询结果是将多个select语句的查询结果合并到一块因为在某种情况下需要将几个select语句查询的结果合并起来显示。比如现在需要查询两个公司的所有员工的信息,这就需要从甲公司查询所有员工信息,再从乙公司查询所有的员工信息,然后将两次的查询结果进行合并。
    可以使用unionunion all关键字进行操作

    语法格式如下:

    select 语句1
    union[union 选项]
    select 语句2
    union|[union 选项]
    select 语句n
    

    其中union选项有两个选项可选
    all:表示无论重复都输出
    distinct: 去重(整个重复)(默认的)

    select *from addr
    union all
    select *from addr;
    

    在这里插入图片描述

    select id,addrid 
    from addr 
    union all 
    select id,addrid 
    from student;
    

    在这里插入图片描述联合查询只要求字段一样, 跟数据类型和顺序无关

    select id,addrid,sex,score 
    from student 
    union all 
    select sex,addrid,id,score 
    from student;
    

    在这里插入图片描述
    联合查询的意义:

    1. 查询同一张表,但是需求不同 如查询学生信息, 男生身高升序, 女生身高降序
    2. 多表查询: 多张表的结构是完全一样的,保存的数据(结构)也是一样的.

    联合查询order by的使用
    在联合查询中: order by不能直接使用(不能出现两次),需要对查询语句使用括号才行;

    select *from student 
    where sex="woman" 
    order by score
    union
    select *from 
    student where sex="man" 
    order by score;
    

    这种情况是会报错的。因为语句中不允许出现两个order by。

    select *from student where sex="woman" 
    union
    select *from student where sex="man" order by score;
    

    如果是上边这样只出现一次他的意义就是等合并完成之后再进行排序就没有任何意义了,因为又把前边sex分好的类打乱了

    (select *from student 
    where sex="woman" 
    order by score )
    union
    (select *from 
    student where sex="man" 
    order by score;)
    

    这种方式的目的是为了让两个结果集先分别order by,然后再对两个结果集进行union。但是你会发现这种方式虽然不报错了,但是两个order by并没有产生最后的效果,所以应该改成如下:

    select *from
    (select *from student 
    where sex="woman" 
    order by score)student
    union
    select *from
    (select *from student 
    where sex="man" 
    order by score)student ;
    

    也就是说,order by不能直接出现在union的子句中,但是可以出现在子句的子句中。
    在这里插入图片描述

    【3】子查询

    通常我们在查询的SQL中嵌套查询,称为子查询。子查询通常会使复杂的查询变得简单,但是相关的子查询要对基础表的每一条数据都进行子查询的动作,所以当表单中数据过大时,一定要慎重选择

    带in关键字的子查询

    使用in关键字可以将原表中特定列的值与子查询返回的结果集中的值进行比较
    如果某行的特定列的值存在,则在select语句的查询结果中就包含这一行。

    例:查询成绩大于80的学生的所有信息,
    先在子查询中查出成绩大于80的结果集,然后将原成绩表中的成绩与结果集进行比较,如果存在,就输出这条学生的记录。

    select *
    from student 
    where score in
    (select score from student where score>80);
    

    在这里插入图片描述

    带比较运算符的子查询

    如果可以确认子查询返回的结果只包含一个单值,那么可以直接使用比较运算符连接子查询。
    经常使用的比较运算符包括等于(=)、不等于(<>或!=)、小于(<)、大于(>)、小于等于(<=)和大于等于(>=)。

    select *
    from student 
    where score> 
    (select score 
    from scholarship
    where dengji=1);
    

    查询奖学金等级为1的学生信息

    带exists的子查询

    exists: 是否存在的意思, exists子查询就是用来判断某些条件是否满足(跨表),
    exists是接在where之后
    exists返回的结果只有0和1.

    例:如果存在成绩大于90的人则列出整个表的记录

    select *
    from student 
    where exists
    (select *from student where score>90);
    

    在这里插入图片描述

    带any关键字的子查询

    any关键字表示满足其中的任意一个条件使用any关键字时,只要满足内层查询语句结果的的任意一个,就可以通过该条件来执行外层查询语句。

    select *
    from student 
    where addrid<any
    (select addrid 
    from addr);
    

    在这里插入图片描述

    带all关键字的子查询

    all和any刚好是相反的,all关键字表示满足所有结果使用all关键字,要满足内层查询语句的所有结果,才可以通过该条件来执行外层查询语句。

    select *
    from student 
    where addrid>all
    (select addrid 
    from addr);
    

    在这里插入图片描述

    展开全文
  • 多表查询和子查询

    万次阅读 2016-11-13 17:59:11
    主要介绍了多表查询,以及在多表/单表查询时常用的函数和关键字,介绍了如何使用子查询多表查询  employee表,departments表,localtions表结构 引例: select  last_name, department_...
    主要介绍了多表查询,以及在多表/单表查询时常用的函数和关键字,介绍了如何使用子查询。

    多表查询

         employee表,departments表,localtions表结构


    引例:

    select
         last_name, department_name
    from employees, departments

    分析:
     

    经过联接可以根据employee_id查到department_id,然后根据deparment_id查到department_name



    from employees, departments
    使用逗号进行表之间的连接。产生的结果就是一个笛卡尔集。左表的每一条记录要和右表的每一条记录进行连接。

    若左表8条记录,右表20条记录,使用笛卡尔联接就会产生160条记录。
    通常这种连接方式我们是不提倡的,影响效率。

     笛卡尔集产生条件:
        ①所有表中的所有行互相连接
        ②在标间连接的时候没有设置连接条件,或者连接条件无效


    笛卡尔乘积,逗号连接


    SELECT
       *
     FROM 表名1,表名2;

    将country2表和city2表联接
    SELECT
      *
    FROM
      city2, country2
    WHERE
      countrycode = code;

    使用ON 子句创建连接

         自然连接中是以具有相同名字的列为连接条件的。
         可以使用 ON 子句指定额外的连接条件。 这个连接条件是与其它条件分开的。
          ON 子句使语句具有更高的易读性。

    等值连接

     
    SELECT    
       列名1, 列名2, ...
    FROM     
        表1
    [INNER] JOIN     
        表2
    ON     
        联接条件(等值条件)
    JOIN    
        表3
    ON    
       联接条件
    WHERE    
       普通过滤条件

    查询城市人口数大于100万的城市名称和所属国家

    SELECT
          ci.name city,
          co.name country ,
          ci.population cityPop
    FROM
          city2 ci
    [INNER] JOIN
         country2 co
    ON
         ci.countrycode = co.code
    WHERE
         ci.population > 1000000;

     注意事项:
         内联虽然和逗号一样, 优先使用内联
         INNER关键字可以省略
         ON和WHERE虽然可以混用, 但是不建议
         ON 后面最好是联接条件
         WHERE 后面是普通过滤条件
         查询结果就是满足联接条件的行

    区分重复的列名
    使用表名前缀在多个表中区分相同的列。
    在不同表中具有相同列名的列可以用表的别名加以区分。

    好处:
    使用别名可以简化查询。 使用表名前缀可以提高执行效率。

    多个连接条件与 AND 操作符

    表的联接可以不止一个
    查询一下国家和首都,只显示首都人口大于500万的国家

    SELECT
        co.name country,
        ci.name capital,
        ci.populatiON,
        cl.language
    FROM
        country co
    JOIN
        city ci
    ON
        co.capital = ci.id
    JOIN
        countrylanguage cl
    ON
        co.code = cl.countrycode
    WHERE
        ci.populatiON > 5000000
    AND
        cl.isofficial = 'T';

    连接 n个表,至少需要 n-1个连接条件

    外联接

         保证某个表的数据的完整性
    LEFT    JOIN    左外连接,保证左表的完整性
    RIGHT JOIN    右外连接,保证右表的完整性

    SELECT
        列名1,列名2,...
    FROM
        表1
    LEFT [OUTER] JOIN
        表2
    ON
        联接条件
    WHERE
        普通过滤条件

    查询所有国家和首都
    SELECT
        co.name country,
        ci.name capital
    FROM
        country co
    LEFT JOIN
        city ci
    ON
        co.capital = ci.id;

    查询所有国家及官方语言
    SELECT
        country.name,
        cl.language,
        cl.isofficial
    FROM
        country
    LEFT JOIN
        countrylanguage cl
    ON
        country.code = cl.countrycode
    WHERE
        cl.isofficial = 'T'
    or
        cl.isofficial is null
    哪些国家没有首都
    SELECT
        co.name country,
        ci.name capital,
        co.capital,
        ci.id
    FROM
        country co
    LEFT JOIN
        city ci
    ON
        co.capital = ci.id
    WHERE
        ci.name is null;

    单行函数

         
    LOWER('SQL COURSE') ----> sql course 将目标字符串转为小写
    UPPER('SQL Course')----> SQL COURSE 将目标字符串转为大写
    CONCAT('Hello', 'World')---->HelloWorld 联接两个字符串
    SUBSTR('HelloWorld',1,5)---->Hello  获取子串
    LENGTH('HelloWorld')---->10   获取字符串的长度
    INSTR('HelloWorld', 'W')---->6  在目标位置插入字符
    LPAD(salary,10,'*')---->*****24000  右对齐填充
    RPAD(salary, 10, '*')---->24000*****  左对齐填充
    TRIM(‘H’ FROM 'HelloWorld')----->elloWorld 截取字符串
    REPLACE('abcd','b','m')---->amcd  替换目标字符
    ROUND(45.926, 2)---->45.93 四舍五入
    TRUNC(45.926, 2)---->45.92  截断
    MOD(1600, 300)---->100  求余

    常用的单行函数使用方式及效果
    将所有员工的名字连接起来,并对工资进行右对齐填充
    SELECT
        CONCAT(first_name, last_name) name, lpad(salary, 10, '0')
    FROM
         company.employees;
     
    把所有国家和首都名使用:连接起来,并全部转为大写显示
    SELECT
        UPPER(CONCAT(co.name, ' : ', ci.name))
    FROM
        country co
    LEFT JOIN
        city ci
    ON
        co.capital = ci.id


    组函数

    分组函数作用于一组数据,并对一组数据返回一个值

    AVG(列名) 求平均数
    MAX(列名) 求最大值
    SUM(列名) 求和
    MIN(列名)  求最小值

    查询所有员工的平均工资和最大最小值,求和.
    SELECT
        AVG(salary) 平均工资,
        MAX(salary) 最高工资,
        MIN(salary) minSalary,
        SUM(salary) sumSalary
    FROM company.employees;

    查看表中的记录数,不要使用具体列名,除非是主键

    SELECT
        count(*)
    FROM
        country;


    SELECT
        --last_name,
        MIN(salary) 最低平资
    FROM
        company.employees;

    SELECT
        --name,
        max(population)
    FROM
        country
    WHERE
        continent = 'europe';

    在统计计算中拒绝出现代表个体的信息,上边的name,last_name都属于个体信息,不能在统计计算中出现


    GROUP BY

         分组函数和组函数配合使用进行查询
    SELECT
         分组条件,
          组函数(这里的组函数是作用于某一组成员)
    FROM
         表名
    GROUP BY
         分组条件

    查询每个部门的平均工资
    SELECT
        department_id, AVG(salary)
    FROM
        company.employees
    GROUP BY
        department_id;

    查询各大洲的平均寿命和最少人口数
    SELECT
        continent,
        avg(lifeexpectancy) avgLife,
        min(population) minPop
    FROM
        country
    GROUP BY
        continent

    HAVING

    对分组结果进行过滤. 不能使用WHERE 
    HAVING只能对分组结果进行过滤

    查询部门平均工资大于9000的部门id

    SELECT
        department_id, AVG(salary)
    FROM
        company.employees
    GROUP BY
        department_id
    HAVING
        avg(salary) > 9000;

    查询哪些国家的语言超过10种要求显示国家名称
    SELECT
        co.name,
        count(cl.language) langs
    FROM
        countrylanguage cl
    right JOIN
        country co
    ON
        cl.countrycode = co.code
    GROUP BY
        co.name
    HAVING
        langs > 10
    ORDER BY
        langs;
    查询中国的城市个数
    SELECT
        countrycode,
        count(*)
    FROM
        city
    GROUP BY
        countrycode
    HAVING
        countrycode = 'chn';


    DISTINCT

         对获取到的某些记录进行去重
    在City表中有多少不同的地区。
    SELECT
        DISTINCT District
    FROM
        city;

    小结:

    当上述关键字参与查询是,提供一种思考思路。
     1) 判断需要从哪个表中取数据 确定FROM
     2) 一张表够吗? 如果不够 JOIN 
     3) 需要保证某表数据完整吗? 如果需要 考虑外联, 继续考虑左右的问题
     4) 联接条件的确定 ON 
     5) 判断是否需要虚表的中的所有数据, 如果不需要 WHERE 
     6) 是否需要分组, 如果需要 GROUP BY, 进一步判断分组依据的列名.
     7) 把分组依据的列名放在SELECT后面
     8) 继续考虑SELECT究竟要选择哪些列(组函数)
     9) 分组的结果是都需要吗? 如果不需要 HAVING过滤
     10)是否需要对最终的显示排序 ORDER BY

    一个完整的SQL语句:
    select
        分组依据的列名,
        其他的列, 组函数
    from
        表名1(子查询)
    join
        表名2
    on
        表的联接条件
    left join
        表名3
    on
        (外联接时on条件必须有) 表的联接条件
    where
        过滤条件
    group by
        分组依据的列名
    having
        组函数 比较表达式(分组结果的过滤)
    order by
        排序依据的列 desc
    limit
        略过的记录数,最终显示限制的记录数(每页显示的记录数)

    哪些国家没有列出任何使用语言?
    SELECT
        a.name
    FROM
        country a
    LEFT JOIN
        countrylanguage b
    ON
        a.code = b.countrycode
    WHERE
        b.language is null;
    -----------------------------
    SELECT
        a.name, count(language)
    FROM
        country a
    LEFT JOIN
        countrylanguage b
    ON
        a.code = b.countrycode
    GROUP BY
        a.name
    HAVING
        count(language) = 0;

    列出在城市表中80%人口居住在城市的国家
    SELECT
        a.name,
        (sum(b.populatiON) / a.populatiON) AS rate
    FROM
        country a
    JOIN
        city b
    ON
        a.code = b.countrycode
    GROUP BY
        a.name
    HAVING
        rate >= 0.8;

    Sweden国家说的是什么语言?
    SELECT
        a.name,
        b.language
    FROM
        country  a
    JOIN
        countrylanguage b
    ON
        a.code = b.countrycode
    WHERE
        a.name = 'Sweden';

    查询中国的每个省的总城市数量和总人口数
    SELECT
        district,
        count(*),
        sum(population)
    FROM
        city
    WHERE
        countrycode = 'chn'
    GROUP BY
        district
    ORDER BY
        sum(population) desc;
    -------------------------------------
    SELECT
        countrycode,
        district,
        count(*),
        sum(population)
    FROM
        city
    GROUP BY
        district
    HAVING
        countrycode = 'chn'
    ORDER BY
        sum(population) desc;

    子查询

    子查询 (内查询) 在主查询之前一次执行完成。
    子查询的结果被主查询(外查询)使用 。
    可以用一个子查询替代上边的的表名。
    子查询,将查询操作嵌套在另一个查询操作中。先执行子查询,再执行外查询

    单行子查询

         
    只返回一行。 使用单行比较操作符。


    SELECT
        列名1,列名2...
    FROM
        表名(子查询)
    WHERE
        过滤条件(同样也可以使用子查询)

    查询谁的工资比'Abel'的工资高
    SELECT
        last_name
    FROM
        employees
    WHERE
        salary >(SELECT
                    salary
                 FROM
                    employees
                 WHERE
                    last_name = 'Abel');

    在子查询中使用组函数


    查询城市人口最多的城市名称
    SELECT
        name
    FROM
        city
    WHERE
        population = (SELECT
                        max(population)
                      FROM
                        city);

    查询最发达的国家
    SELECT
        name
    FROM
        country
    WHERE
        gnp = (SELECT
                    max(gnp)
                FROM
                    country);

    子查询中的 HAVING 子句


    首先执行子查询。 向主查询中的HAVING 子句返回结果。

    查询最低工资大于50号部门最低工资的部门id和其最低工资
    SELECT
        department_id, MIN(salary)
    FROM
        employees
    GROUP BY
        department_id
    HAVING   MIN(salary) >(SELECT
                                MIN(salary)
                           FROM
                                employees
                           WHERE
                                department_id = 50);


    非法使用子查询

         

    子查询中的空值问题

         
    注意:子查询要包含在括号内。 单行操作符对应单行子查询,多行操作符对应多行子查询。

    多行子查询

      
    返回多行。 使用多行比较操作符。


    在多行子查询中使用 ANY 操作符


    返回其它部门中比job_id为‘IT_PROG’部门 任一工资低的员工的员工号、姓名、job_id 以及salary
    SELECT
        employee_id, last_name, job_id, salary
    FROM
        employees
    WHERE  salary < ANY (SELECT
                            salary
                         FROM
                            employees
                         WHERE
                            job_id = 'IT_PROG')
    AND    job_id <> 'IT_PROG';

    在多行子查询中使用 ALL 操作符


    返回其它部门中比job_id为‘IT_PROG’部门 所有工资都低的员工 的员工号、姓名、job_id 以及salary

    SELECT
        employee_id, last_name, job_id, salary
    FROM
        employees
    WHERE  salary < ALL (SELECT
                            salary
                         FROM
                            employees
                         WHERE
                            job_id = 'IT_PROG')
    AND    job_id <> 'IT_PROG';


    子查询中的空值问题


    小结:在查询时基于未知的值时,应使用子查询
              子查询可以返回多个结果/单个结果,结果个数不同应该使用不同的操作符



    展开全文
  • MySQL多表查询where子查询

    千次阅读 2019-05-31 21:49:32
    SQL不仅支持单条的检索数据查询还允许创建子查询,即嵌套在其他查询中的查询。 结构:https://blog.csdn.net/wsdfym/article/details/90722724 当前有用户,以及订单,订单详细时,需要查询购买了某商品Id为...

    SQL不仅支持单条的检索数据查询还允许创建子查询,即嵌套在其他查询中的查询。
    表结构:https://blog.csdn.net/wsdfym/article/details/90722724
    当前有用户表,以及订单表,订单详细表时,需要查询购买了某商品Id为“1001”的商品的客户信息

    如果用单条语句查询需要

    • 先从订单详细表查询商品ID为“1001”的购物订单ID
    • 再从订单表查询该购物订单id的用户id
    • 再根据用户id从用户表查询到用户信息
    select order_num
    from orderitems
    where prod_id = 1001
    

    在这里插入图片描述
    2.

    select cust_id
    from orders
    where order_num in (30007,30008)
    

    在这里插入图片描述
    3.

    select cust_name
    from customers
    where cust_id in (1,2)
    

    在这里插入图片描述
    现在结合这三个查询,从外到内 查询用户信息,查询该购物订单的顾客id,查询购买了该物品的订单id,
    从内到外查询购买了该物品的订单id,查询该购物订单的顾客id,查询用户信息

    select cust_name
    from customers
    where cust_id in ( select  cust_id
    									from orders
    									where order_num  in( select order_num
    																		from orderitems
    																		where prod_id = 1001
    																		)
    								)
    

    在这里插入图片描述
    该语句先执行最内层查询 “select order_num from orderitems where prod_id = 1001” 返回两个订单号 30007 ,30008,
    依据内层查询返回的两个订单号 再执行中层查询 返回两个顾客id 1,2,最后依据返回的顾客id查询顾客信息

    需要注意的是作为子查询只能返回单列,并且使用子查询并不总是检索数据最有效的方法

    展开全文
  • SQL的多表查询和子查询

    千次阅读 2017-08-17 20:21:10
    --92 连表查询 --等值查询 --查询员工信息和部门信息 select * from emp e, dept d where e.deptno = d.deptno; --查询员工名称和部门名称 select e.ename,d.dname from emp e,dept d where e.deptno=d.deptno; --...
    --92 连表查询
    --等值查询
    --查询员工信息和部门信息
    select * from emp e, dept d where e.deptno = d.deptno;
    --查询员工名称和部门名称
    select e.ename,d.dname from emp e,dept d where e.deptno=d.deptno;
    --查询员工所有信息和部门名称
    select e.*,d.dname from emp e,dept d where e.deptno=d.deptno;
    --查询工资大于3000的员工的姓名,工资和部门名称
    select e.ename, e.sal, d.dname
      from emp e, dept d
     where e.deptno = d.deptno
       and e.sal > 3000;
    --非等值查询
    --查询员工的工资等级
    select *
      from emp e, salgrade s
     where e.sal <= s.hisal
       and e.sal >= s.losal;
    --查询SCOTT的工资等级
    select e.ename, s.grade
      from emp e, salgrade s
     where e.sal <= s.hisal
       and e.sal >= s.losal
       and e.ename = 'SCOTT';
    --外连接
    --左外连接
    select * from emp e,dept d where e.deptno=d.deptno(+);
    --右外连接
    select * from emp e,dept d where e.deptno(+)=d.deptno;
    --自连接,自己连接自己
    --查询员工姓名和员工的经理的姓名
    select e1.ename,e2.ename from emp e1,emp e2 where e1.mgr=e2.empno;
    --查询员工姓名和员工经理姓名和其经理姓名
    select e1.ename, e2.ename, e3.ename
      from emp e1, emp e2, emp e3
     where e1.mgr = e2.empno
       and e2.mgr = e3.empno;
    --99 连表查询
    --cross join 交叉连接(笛卡尔积)
    --查询员工表和部门表信息
    select * from emp e cross join dept d;
    --natural join 自然连接
    --查询员工表和部门表信息
    select * from emp natural join dept;
    --using
    --查询员工姓名和部门编号
    select e.ename,deptno from emp e join dept d using(deptno);
    --on 自定义连接条件
    --查询员工表和部门表的信息
    select * from emp e join dept d on e.deptno = d.deptno;
    --查询员工姓名和经理姓名
    select e1.ename, e2.ename from emp e1 join emp e2 on e1.mgr = e2.empno;
    --查询员工姓名和经理姓名和其经理姓名
    select e1.ename, e2.ename, e3.ename
      from emp e1
      join emp e2
        on e1.mgr = e2.empno
      join emp e3
        on e2.mgr = e3.empno;
    --inner join 内连接
    select * from emp e inner join dept d on e.deptno=d.deptno;
    --left join 左外连接,以左表为主
    select * from emp e left join dept d on e.deptno=d.deptno;
    --right join 右外连接,以右表为主
    select * from emp e right join dept d on e.deptno=d.deptno;
    --full join 全连接,取两个表的所有数据
    select *from emp e full join dept d on e.deptno=d.deptno;
    --查询员工姓名和部门姓名和其经理姓名和经理的部门名称
    select e1.ename, d1.dname, e2.ename, d2.dname
      from emp e1
      left join dept d1
        on e1.deptno = d1.deptno
      left join emp e2
        on e1.mgr = e2.empno
      left join dept d2
        on e2.deptno = d2.deptno;
    --单行子查询
    --查询工资高于CLARK的员工的信息
    select * from emp where sal>(select sal from emp where ename='CLARK');
    --查询工资高于平均工资的员工的名字和工资
    select ename,sal from emp where sal >(select avg(sal) from emp );
    --查询和SCOTT同一部门且比他工资低的员工名字和工资
    select ename, sal
      from emp
     where sal < (select sal from emp where ename = 'SCOTT')
       and deptno = (select deptno from emp where ename = 'SCOTT');
    --查询工资最高的员工名字和工资。
    select ename,sal from emp where sal =(select max(sal) from emp );
    --查询职务和SCOTT相同,比SCOTT雇佣时间早的员工信息
    select *
      from emp
     where job = (select job from emp where ename = 'SCOTT')
       and hiredate < (select hiredate from emp where ename = 'SCOTT');
    --查询工资比SCOTT高或者雇佣时间比SCOTT早的员工的编号和名字
    select empno, ename
      from emp
     where sal > (select sal from emp where ename = 'SCOTT')
        or hiredate < (select hiredate from emp where ename = 'SCOTT');
    -- 多行子查询 
    --查询和SCOTT,SWITH,CLARK在同一个部门的员工信息并不包含SCOTT,SWITH,CLARK;
    select *
      from emp
     where deptno in
           (select distinct deptno from emp where ename in ('SCOTT', 'SWITH', 'CLARK'))
       and ename not in ('SCOTT', 'SWITH', 'CLARK');
    --查询工资低于任何一个“CLERK”的工资的员工信息。
    select * from emp where sal <any(select sal from emp where job='CLERK');
    --查询工资比所有的“SALESMAN”都高的员工的编号、名字和工资。
    select empno, ename, sal
      from emp
     where sal < all (select sal from emp where job = 'SALESMAN');
    --查询部门20中职务同部门10的雇员一样的员工信息。
    select * from emp where job in(select job from emp where deptno=10) and deptno=20;
    --查询在员工中有哪些人是经理人
    select *
      from emp
     where empno in (select distinct mgr
                       from emp
                      where mgr is not null
                         or mgr != '');
    --找出部门编号为20的所有员工中收入最高的职员
    select * from emp where sal =(select max(sal) from emp where deptno=20) and deptno =20;
    --查询每个部门平均薪水的等级
    select b.deptno, grade
      from salgrade s, (select deptno, avg(sal) a from emp group by deptno) b
     where s.losal <= b.a
       and s.hisal >= b.a
    
    
    
    
    

    展开全文
  • select单表查询,多表查询,子查询

    千次阅读 2018-03-03 16:17:50
    DML:语句,常用的select ,insert into ,delete,updata select 语句: select 语句一般用法为: select ...单表查询,多表查询,子查询 最简单的单表查询 : select * from tb_name; *表示,所有字段 查询特...
  • 子查询-表子查询

    千次阅读 2017-11-14 22:55:10
    1:表子查询:子查询返回的结果是多行列的二维(子查询的返回的结果当做一个二维来使用) 2:案例演示 需要:找出每个班最高的一个学生 1:确定数据源: 先将学生按照身高进行降序排序 select * from t_...
  • 一对一关系一对一的关系: 例如:qq和qq的详尽信息建立外键的时候 如果明确主从关系? 被引用的是主,外键在从中建立 关联主实现代码如下: CREATE TABLE qq( qqid int PRIMARY KEY, password varchar(100)...
  • Oracle(二)--多表查询&子查询

    千次阅读 2019-05-18 00:02:41
    一、多表查询 1.1 笛卡尔集 select deptno,avg(sal) from emp group by deptno; 1.2 内连接 隐式内连接 隐式内连接如下: --查询员工编号、员工姓名、部门编号、经理编号、经理的姓名 select e1.empno, e1.ename...
  • 本节学习多表连接查询、子查询等高级SELECT语句的应用。 1.简单连接查询 多表查询是指SELECT命令中显示的列来源于多个数据表; 连接查询将多个表以某个或某些列为条件进行连接操作而检索出关联数据的过程。多个...
  • 什么是多表查询?同时查询多张表获取到需要的数据 什么是子查询?一条SELECT语句结果作为另一条SELECT语法一部分(比如是查询条件,查询结果,表) 子查询总结: 子查询需要放在()中 子查询结果的三种情况...
  • 子查询 什么是子查询 子查询概念 子查询:sub query   子查询是一种常用计算机语言SELECT-SQL语言中嵌套查询下层的程序模块。当一个查询是另一个查询的条件时,称之为子查询子查询:指在一条select语句中...
  • mysql查询语句 和 多表关联查询 以及 子查询

    万次阅读 多人点赞 2017-03-28 14:12:15
    mysql(三):mysql查询语句 和 多表关联查询 以及 子查询 1.查询一张表:  select * from 表名; 2.查询指定字段:select 字段1,字段2,字段3….from 表名; 3.where条件查询:select 字段1,字段2,字段3 ...
  • php mysql 多表查询之子查询语句

    千次阅读 2018-11-10 23:37:29
    所谓子查询语句,就是先通过一个语句来查询出一个结果,然后再通过一个查询语句从这个结果中再次查询。子查询语句一般有以下3种。下面以一个案例来做讲解。 案例:查询【例1】中每个分类下的最新的那一条商品信息。...
  • SQL子查询多表查询、联合查询

    千次阅读 2018-07-29 14:50:25
    1、select * from ta1 where id in ...属于“子查询”。 2、select ta1.*, ta2.* from tab1, tab2 where ta1.[字段]=ta2.[字段] 属于“多表查询”。 3、如:(select * from ta1 where ...) union (select * from ...
  • 本文含:多表查询/子查询/集合运算 1.多表查询 主要就是连接条件: nge表至少有n-1个连接条件 1.1连接类型: 1. 等值连接 2. 不等值连接 3. 外连接 4. 自连接 举例: 等值连接 :查询员工信息:员工号 姓名 月薪 ...
  • 多表连接查询与子查询

    万次阅读 2013-10-02 14:32:41
    多表连接查询和子查询 一、连接查询 1.1使用无连接规则连接两表 所谓无连接规则连接,就是指两个表的SELECT语句中不设置任何连接条件,这样的到的链接结果是第一个表的每一行都会和第二个表的所有行进行连接,即...
  • mysql多表连接和子查询

    千次阅读 2014-09-20 14:31:32
    # 多表连接建立在有相互关系的父子表上 #交叉连接/笛卡尔交集 SELECT COUNT(*) FROM emp; # 返回14行 SELECT COUNT(*) FROM dept; #返回4行 SELECT COUNT(*) FROM emp,dept; #返回14*4=56行数据 SELECT ...
  • jpql多表级联子查询

    千次阅读 2017-02-09 15:19:44
    JPQL 多表查询 String jpqlString = "from Customer c join c.orders l where l.id = 1)"; Query qu = (Query) entityManager.createQuery(jpqlString); List list = qu.getResultList(); System.out....
  • 查询数据指从数据库中获取所需要的数据。查询数据是数据库操作中...1、查询语句的基本语法2、在单表上查询数据3、使用聚合函数查询数据4、多表上联合查询5、子查询6、合并查询结果7、为表和字段取别名8、使用正则表达式

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 852,095
精华内容 340,838
关键字:

多表查询子查询