0008《SQL必知必会》笔记04-子查询、联接与组合查询

1、子查询:就是嵌套的查询,用一个查询的结果作为另一个查询的条件。

  比如要列出订购了物品“RGAN01”的所有顾客的ID、姓名和联系人,需要经历以下几步

    (1)从orderitems中找出订购了“RGAN01”的所有订单编号

    (2)用(1)的订单编号在orders中找出顾客的ID

    (3)用(2)的顾客ID在customers中找出顾客的姓名和联系人

  书写SQL语句的时候,从第3步开始写起,SQL代码如下:

SELECT cust_id,cust_name,cust_contact
FROM customers
WHERE cust_id IN(SELECT cust_id
                          FROM orders
                          WHERE order_num IN(SELECT order_num
                                                          FROM orderitems
                                                           WHERE prod_id=‘RGAN01‘));

  运行结果如下:

  使用说明:1.作为子查询的SELECT只能查询单列;2.子查询嵌套的数目没有限制;3.子查询的效率比较低

2、联接:在一条SELECT语句中关联表。用法:指定要联接的表以及联接他们的方式。上面的列子用联接法如下:

SELECT customers.cust_id,cust_name,cust_contact
 FROM customers,orders,orderitems
 WHERE customers.cust_id=orders.cust_id
  AND orders.order_num=orderitems.order_num
  AND prod_id=‘RGAN01‘;

注意:1.在多个表中有相同的列名(比如customers和orders中都有“cust_id”),必须清楚指明是哪个表的列名;2.WHERE字句不可少,否则就会形成笛卡尔积,左右表的每行都将进行联接,总行数=表行数的连乘;3.联接一定要正确

3、作为计算字段使用子查询:对该部分理解不能

4、内联接:(2)中使用的就是内联接(又称为等值联接,联接的两个表列是相等的),下面换个例子内联接2个表:列出每个供应商的名字、供应的产品、价格。

SELECT vend_name,prod_name,prod_price
FROM vendors INNER JOIN products
ON vendors.vend_id=products.vend_id
ORDER BY vendors.vend_id;

5、自联接:可以联接2个不同的表,也可以联接2个相同的表。比如列出与“Jim Jones”同一客户下的其他人的email地址:

SELECT c1.cust_name,c1.cust_contact,c1.cust_email
FROM customers c1,customers c2
WHERE c1.cust_name=c2.cust_name
 AND c2.cust_contact=‘Jim Jones‘;

        其中的C1,C2,是表的别名,在表名后面用空格隔开。

6、外联接:左、右、全。内联接能列出有关联行的那些行,而有些时候我们需要把没有关联行的那些行也列出来,这就需要外联接。比如列出每个顾客的订单号,包括没有订单的顾客:

SELECT customers.cust_id,orders.cust_id,orders.order_num
FROM customers  LEFT OUTER JOIN orders
  ON customers.cust_id=orders.cust_id;

    说明:LEFT OUTER JOIN把左侧表(customers)在右侧表(orders)中没有关联行(cust_id=1000000002)的行给列出来。

       左联接:LEFT OUTER JOIN;右联接:RIGHT OUTER JOIN;全联接:FULL OUTER JOIN。左右是相对而言的,联接词前后的两个表换个顺序,就把LEFT和RIGHT换一下。

7、将聚集函数与联接结合

SELECT customers.cust_id,COUNT(orders.order_num) AS num_ord
FROM customers LEFT OUTER JOIN orders
  ON customers.cust_id=orders.cust_id
GROUP BY customers.cust_id;

8、联接的使用注意:不要联接不必要的表,联接的表越多,性能下降越厉害

9、组合查询:将多条SELECT语句组合到一起

SELECT cust_name,cust_contact,cust_email
FROM customers
WHERE cust_state IN(‘IL‘,‘IN‘,‘MI‘)
  OR cust_name=‘Fun4All‘;

改为组合查询:

SELECT cust_name,cust_contact,cust_email
FROM customers
WHERE cust_state IN(‘IL‘,‘IN‘,‘MI‘)
UNION
SELECT cust_name,cust_contact,cust_email
FROM customers
WHERE cust_name=‘Fun4All‘;

    其他:UNION默认排除重复的行,若不排除则用UNION ALL;

       对UNION结果排序的ORDER BY语句要放到最后

UNION规则:1.可以将多条SELECT语句组合到一起,是否限制数目,取决于DBMS;

       2.每个SELECT必须包含相同的列、表达式、聚集函数;

       3.同一列的数据类型必须兼容

时间: 2024-10-25 21:28:25

0008《SQL必知必会》笔记04-子查询、联接与组合查询的相关文章

SQLServer:《SQL必知必会》一书的读书笔记(五)

第5课 高级数据过滤 5.1 组合 WHERE 子句 第4课介绍的 WHERE 子句在过滤数据时都是用单一的条件. 5.1.1 AND 操作符 检索由供应商 DLL01 制造且价格小于等于 4 美元的所有产品的名称和价格: SELECT prod_id, prod_price, prod_name FROM Products WHERE vend_id = 'DLL01' AND prod_price <= 4; 5.1.2 OR 操作符 检索任一个指定供应商制造的所有产品的名称和价格: SEL

SQLServer:《SQL必知必会》一书的读书笔记(八)

第8课 使用函数处理数据 8.1 函数 [名词]可移植:所编写的代码可以在多个系统上运行 8.2 使用函数 8.2.1 文本处理函数 例1:使用 UPPER() 函数--将文本转换为大写 SELECT vend_name, UPPER(vend_name) AS vend_name_upcase FROM Vendors ORDER BY vend_name; 常用的文本处理函数: LEFT():返回字符串左边的字符 DATALENGTH():返回字符串的长度 LOWER():将字符串转换为小写

《SQL必知必会》学习笔记(一)

<SQL必知必会>学习笔记(一) 下面变列出我新学到的知识. 这个是数据库的全部记录 1.order by   语句: select * from Scores order by name , Score desc 执行结果: ①order by在执行排序功能时,会先对排序字段按abcd这样的顺序进行,汉字的话是按拼音的首字母,默认是正序. ②例子中先按name字段进行正序排序,当name相同时,又按score倒叙排,例如拜仁两条数据,胜的开头字母是s,负的是f,因为是倒叙,所以胜的那条数据排

《SQL必知必会》学习笔记二)

<SQL必知必会>学习笔记(二) 咱们接着上一篇的内容继续.这一篇主要回顾子查询,联合查询,复制表这三类内容. 上一部分基本上都是简单的Select查询,即从单个数据库表中检索数据的单条语句,但是实际应用中的业务逻辑往往会非常复杂,所以会用到一些比较复杂的查询,如子查询,联合查询. 1.子查询 当一个查询是另一个查询的条件时,称为子查询.但是说到子查询又不的不说它与嵌套查询两者的区别,下面一张图来说明 下面再用一条sql语句来说明他们的关系. 其中在查询中又分为嵌套子查询和相关子查询,他们之间

SQLServer:《SQL必知必会》一书的读书笔记(四)

第4课 过滤数据 4.1 使用 WHERE 子句:过滤 只检索所需数据需要指定搜索条件(即过滤条件). WHERE 子句在表名(FROM 子句)后给出,根据 WHERE 子句中指定的条件过滤. SELECT prod_name, prod_price FROM Products WHERE prod_price = 3.49; -- 分析:从 Products 表中检索两个列,只返回 prod_price 值为 3.49 的行 [提示]SQL 过滤与应用过滤: 数据也可以在应用层过滤.但是在优化

MySQL必知必会 学习笔记(一)

第一章  了解SQL 模式:   关于数据库和表的布局以及特性的信息.[描述表可以存储什么样的数据,数据如何分解,各部分信息如何命名等等,可以用来描述数据库中特定的表以及整个数据库(和其中表的关系)]. 第二章 MySQL简介 MySQL是一种DBMS,即它是一种数据库软件.基于客户机----服务器的数据库. MySQL工具: 1.mysql 命令行实用程序 2.MySQL Administrator 3.MySQL query Browser 第四章 检索数据 LIMIT 5 表示MySQL返

《MySQL必知必会》读书笔记_4

PS:一个实际的存储过程案例 CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_delete_article_by_id`(IN `id` int) BEGIN #Routine body goes here... DECLARE temp INT; SET @aid = id; SELECT COUNT(*) FROM gk_reply_article WHERE a_id = @aid INTO temp; IF(temp <> 0) THEN

《MySQL必知必会》读书笔记_3

PS:这次的信息量有点大. 聚集不同值 SELECT AVG(DISTINCT prod_price) AS avg_price FROM products WHERE vend_id = 1003 #相同的值不会被计算 组合聚集函数 SELECT COUNT(*) AS num_items, MIN(prod_price) AS price_min, MAX(prod_price) AS price_max, AVG(prod_price) AS price_avg FROM products

《MySQL必知必会》学习笔记_1

#选择数据库 USE mysql #返回可用数据库列表 SHOW DATABASES #返回当前数据库中可用表 SHOW TABLES #返回表列 SHOW COLUMNS FROM db #显示特定数据库的创建语句 SHOW CREATE DATABASE mysql #显示广泛的服务器状态信息 SHOW STATUS #显示授权用户的安全权限 SHOW GRANTS 多条SQL语句必须以分号分隔. SQL语句不区分大小写,习惯性大写. 检索不同的行用DISTINCT,只返回不同的值. 限制结

《mysql必知必会》读书笔记--存储过程的使用

以前对mysql的认识与应用只是停留在增删改查的阶段,最近正好在学习mysql相关内容,看了一本书叫做<MySQL必知必会>,看了之后对MySQL的高级用法有了一定的了解.以下内容只当读书笔记. 如有转载请注明出处~ 存储过程的使用 执行存储过程 CALL productpricing() 执行名为productpricing的存储过程 创建存储过程 CREATE PROCEDURE productpricing() BEGIN SELECT avg(prod_price) AS pricea