精华内容
下载资源
问答
  • 时光在不经意间,总是过得出奇的快。小暑已过,进入中暑,太阳更加热烈的绽放着ta的光芒,......回顾练习资料girls库以及两张的脚本: https://pan.baidu.com/s/1NAvIOIrIPB8ZVfRblU2ppg 提取码: ...

    时光在不经意间,总是过得出奇的快。小暑已过,进入中暑,太阳更加热烈的绽放着ta的光芒,...在外面被太阳照顾的人们啊,你们都是勤劳与可爱的人啊。在房子里已各种姿势看我这篇这章的你,既然点了进来,那就由我继续带你回顾MySql的知识吧!

    回顾练习资料girls库以及两张表的脚本: https://pan.baidu.com/s/1NAvIOIrIPB8ZVfRblU2ppg 提取码:                                                                               rrwa

    引题:笛卡尔现象,先来观看一下两张表。SELECT * FROM boys;

    320ad343623a840adf176f90956d93d5.png

    SELECT * FROM beauty;

    badb5e39ac39ae2d1346ebb6d83a2069.png

    SELECT NAME,boyname FROM boys,beauty;最终结果:12*4=48行

    1de020021a365a60164fa5d9f13bc78f.png

    #进阶6:连接查询含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询笛卡儿积现象: 表1 有m行,表2有n行,结果=m*n行产生原因:没有有效的连接条件解决方法:添加有效的连接条件 连接分类: 按年代分类: SQL1992标准(192标准):仅支持内连接 SQL1999标准(199标准) [推荐]:支持内连接+外联结(左外与右外)+交叉连接

    按功能分类: 内连接: 等值连接 非等值连接 自联结 外连接: 左外连接 右外连接 全外连接 交叉连接:

    左外连接 右外连接 全外连接 交叉连接:

    SELECT NAME,boyname FROM boys,beautyWHERE beauty.boyfriend_id = boys.id;

    a89b203ee27f0cd16814a83658858b3f.png

    #一.SQL192标准#1.等值连接 ①多表等值连接的结果为多表的交集部分 ②n表连接,至少需要n-1个连接条件 ③多表的顺序没有要求 ④一般需要为表起别名 ⑤可以搭配前面介绍的所有子句使用,比如,排序,分组,筛选。#多表查询,先匹配在筛选#案例1.查询员工名和对应的部门名。SELECT first_name AS 名,department_name AS 部门名FROM employees,departmentsWHERE employees.department_id = departments.department_id;

    d275c567b49c89cf2d4f2d04ea56d145.png

    #案例2.查询员工名,工种号,工种名。对于两张表共有的字段需要加表名作限定不然会报错。

    错误示例:SELECT first_name AS 名,employees.job_id AS 工种号,job_title AS 工种名FROM employees,jobsWHERE employees.job_id = jobs.job_id;

    #2.为表起别名 ①提高语句的简洁度 ②区分多个重命名的字段注意:如果为表起了别名,则查询的字段就不能使用原来的表名去限定SELECT first_name AS 名,e.job_id AS 工种号,job_title AS 工种名FROM employees AS e,jobs AS jWHERE e.job_id = j.job_id;

    c559f1f24db13361c6fff4b11206569e.png

    给表起了别名,再用表完整名子做限定会报错,不允许。根据执行顺序走先走FROM,

    走完FROM后就用别名的,相当于生成了一个虚拟的视图,不再认原来的表名。

    1dedbe4ee7e44b2a2303abd0e085068e.png

    #3.两个表名的顺序是否可以调换,是可以调换的。SELECT first_name AS 名,e.job_id AS 工种号,job_title AS 工种名FROM jobs AS j,employees AS eWHERE e.job_id = j.job_id;#4.可以加筛选#案例3.查询有奖金的员工名,部门名。SELECT first_name AS 名,department_name AS 部门名,commission_pct AS 奖金FROM employees AS e,departments AS dWHERE e.department_id=d.department_idAND commission_pct IS NOT NULL;

    #AND e.commission_pct IS NOT NULL;

    457982c9b96231373a7a9dd93023f584.png

    #案例4.查询城市名中第二个字符为o对应的城市名与部门名。SELECT city AS 城市,department_name AS 部门名FROM locations AS l,departments AS dWHERE l.location_id = d.location_idAND city LIKE '_o%';

    8066252d603f589b0dcc24d5303711a2.png

    #5.可以加分组#案例1.查询每个城市的部门个数。SELECT city AS 城市,COUNT(department_id) AS 个数FROM locations AS l,departments AS dWHERE l.location_id = d.location_idG.........

    展开全文
  • 时光在不经意间,总是过得出奇的快。小暑已过,进入中暑,太阳更加热烈的绽放着ta的光芒,......回顾练习资料girls库以及两张的脚本: https://pan.baidu.com/s/1NAvIOIrIPB8ZVfRblU2ppg 提取码: ...

    时光在不经意间,总是过得出奇的快。小暑已过,进入中暑,太阳更加热烈的绽放着ta的光芒,...在外面被太阳照顾的人们啊,你们都是勤劳与可爱的人啊。在房子里已各种姿势看我这篇这章的你,既然点了进来,那就由我继续带你回顾MySql的知识吧!

    回顾练习资料girls库以及两张表的脚本: https://pan.baidu.com/s/1NAvIOIrIPB8ZVfRblU2ppg 提取码:                                                                               rrwa

    引题:笛卡尔现象,先来观看一下两张表。

    SELECT* FROM boys;

    0b3b31db67641cfda373d3e46bcf0cbd.png

    SELECT * FROM beauty;

    0db413427e82381b28b822077b121a04.png

    SELECT NAME,boyname FROM boys,beauty;

    最终结果:12*4=48行

    529c5a3f15f7cfa66e9c659fd1dab890.png

    #进阶6:连接查询

    含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询

    笛卡儿积现象: 表1 有m行,表2有n行,结果=m*n行

    产生原因:没有有效的连接条件

    解决方法:添加有效的连接条件

    连接分类:

    按年代分类:

    SQL1992标准(192标准):仅支持内连接

    SQL1999标准(199标准) [推荐]:支持内连接+外联结(左外与右外)+交叉连接

    按功能分类:

    内连接:

    等值连接

    非等值连接

    自联结

    外连接:

    左外连接

    右外连接

    全外连接

    交叉连接:

    左外连接

    右外连接

    全外连接

    交叉连接:

    SELECT NAME,boyname FROM boys,beauty

    WHERE beauty.boyfriend_id = boys.id;

    9d0e77a69705f5e9e03d2437b89eb27c.png

    #一.SQL192标准

    #1.等值连接

    ①多表等值连接的结果为多表的交集部分

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

    ③多表的顺序没有要求

    ④一般需要为表起别名

    ⑤可以搭配前面介绍的所有子句使用,比如,排序,分组,筛选。

    #多表查询,先匹配在筛选

    #案例1.查询员工名和对应的部门名。

    SELECT first_name AS 名,department_name AS 部门名

    FROM employees,departments

    WHERE employees.department_id= departments.department_id;

    e239628e0f9af49e3bf7b1367067eadd.png

    #案例2.查询员工名,工种号,工种名。对于两张表共有的字段需要加表名作限定不然会报错。

    错误示例:

    SELECT first_name AS 名,employees.job_id AS 工种号,job_title AS 工种名

    FROM employees,jobs

    WHERE employees.job_id= jobs.job_id;

    #2.为表起别名

    ①提高语句的简洁度

    ②区分多个重命名的字段

    注意:如果为表起了别名,则查询的字段就不能使用原来的表名去限定

    SELECT first_name AS 名,e.job_id AS 工种号,job_title AS 工种名

    FROM employees AS e,jobs AS j

    WHERE e.job_id= j.job_id;

    07d8bb307e4fc63bb84cadabb1ecfae6.png

    给表起了别名,再用表完整名子做限定会报错,不允许。根据执行顺序走先走FROM,

    走完FROM后就用别名的,相当于生成了一个虚拟的视图,不再认原来的表名。

    faca096210261bbec5305ed73001b955.png

    #3.两个表名的顺序是否可以调换,是可以调换的。

    SELECT first_name AS 名,e.job_id AS 工种号,job_title AS 工种名

    FROM jobs AS j,employees AS e

    WHERE e.job_id=j.job_id;

    #4.可以加筛选

    #案例3.查询有奖金的员工名,部门名。

    SELECT first_name AS 名,department_name AS 部门名,commission_pct AS 奖金

    FROM employees AS e,departments AS d

    WHERE e.department_id=d.department_id

    AND commission_pct IS NOT NULL;

    #AND e.commission_pct IS NOT NULL;

    65587229f20bae0ae05722ed5f46a85f.png

    #案例4.查询城市名中第二个字符为o对应的城市名与部门名。

    SELECT city AS 城市,department_name AS 部门名

    FROM locations AS l,departments AS d

    WHERE l.location_id= d.location_id

    AND city LIKE "_o%";

    0a106fc81523d69d0c23988440a3702e.png

    #5.可以加分组

    #案例1.查询每个城市的部门个数。

    SELECT city AS 城市,COUNT(department_id) AS 个数

    FROM locations AS l,departments AS d

    WHERE l.location_id= d.location_id

    GROUP BY l.city;

    d3e8a09a7a782ee5206b8c60f12c206d.png

    #案例2.查询有奖金的每个部门的部门名和部门的领导编号和该部门的最低工资。

    #查询的时候不确定把两个列都加上。

    SELECT commission_pct AS 奖金,department_name AS 部门名,

    d.manager_id AS 领导编号,MIN(salary) AS 最低工资

    FROM employees AS e,departments AS d

    WHERE e.department_id= d.department_id

    AND commission_pct IS NOT NULL

    GROUP BY department_name,d.manager_id;

    99d002ba510f57a1dde196c81f36f0ec.png

    #6.可以加排序

    #案例1:查询每个工种的工种名和员工的个数,并且按员工个数降序。

    SELECT j.job_title AS 工种名,COUNT(employee_id) AS 个数

    FROM employees AS e,jobs AS j

    WHERE e.job_id= j.job_id

    GROUP BY job_title

    ORDER BY 个数 DESC;

    d1ca13f4af5be5cb67bb1823212fa36d.png

    #7.三表连接

    #案例1.查询员工名,部门名与所在的城市

    SELECT first_name AS 名,d.manager_id AS 部门名,city AS 城市

    FROM employees AS e,departments AS d,locations AS l

    WHERE e.department_id= d.department_id

    AND d.location_id = l.location_id;

    4ce7daadc56a766f750da3740ccd73e3.png

    #案例2.查询员工名,部门名与所在的城市,城市以s开头。

    SELECT first_name AS 名,d.manager_id AS 部门名,city AS 城市

    FROM employees AS e,departments AS d,locations AS l

    WHERE e.department_id= d.department_id

    AND d.location_id = l.location_id

    AND city LIKE "s%";

    4b01287662a4fe82228946a27ba967ce.png

    #案例3.查询员工名,部门名与所在的城市,城市以s开头,按姓名降序排列。

    SELECT first_name AS 名,d.manager_id AS 部门名,city AS 城市

    FROM employees AS e,departments AS d,locations AS l

    WHERE e.department_id= d.department_id

    AND d.location_id = l.location_id

    AND city LIKE "s%"

    ORDER BY department_name DESC;

    2d7d2f96e790dc775ff3abfae801f6e1.png

    新增一张工资等级表。

    CREATE TABLE job_grades

    (grade_level VARCHAR(3),

    lowest_salint,

    highest_salint);

    INSERT INTO job_grades

    VALUES ("A", 1000, 2999);

    INSERT INTO job_grades

    VALUES ("B", 3000, 5999);

    INSERT INTO job_grades

    VALUES("C", 6000, 9999);

    INSERT INTO job_grades

    VALUES("D", 10000, 14999);

    INSERT INTO job_grades

    VALUES("E", 15000, 24999);

    INSERT INTO job_grades

    VALUES("F", 25000, 40000);

    82e3c5adf3c04f9f1684d440058be13f.png

    #2.非等值连接,(范围判断)

    #案例1.查询员工的工资和工资级别。

    SELECT salary AS 工资,grade_level AS 等级

    FROM employees AS e,job_grades AS g

    WHERE salary BETWEEN g.lowest_sal AND g.highest_sal;

    fa2a83e066fa10753f8d31f31d8737a1.png

    #案例2.查询员工的工资和工资级别,展示出A级别的员工。

    SELECT salary AS 工资,grade_level AS 等级

    FROM employees AS e,job_grades AS g

    WHERE salary BETWEEN g.lowest_sal AND g.highest_sal

    AND g.grade_level= "A";

    e16e806738a92110742a91733165bc0c.png

    #3.自联接[自己连接自己]

    f4ac405a067af0574e109e3d9e1e82cc.png

    #案例1.查询员工名和上级的名称.

    SELECT e.employee_id,e.last_name AS 员工,

    m.employee_id,m.last_name AS 领导

    FROM employees e,employees m

    WHERE e.manager_id= m.employee_id;

    fca5b6ed4d045724da89f48703dd25f5.png

    经过了以上的示例,相信你对多表查询已经有了一个了解,赶快动动你的小手手来练习一下吧!o(^▽^)o

    展开全文
  • #进阶6: 连接查询 (多表连接) : 等值连接/非等值连接 /左右全连接/内连接/*含义: 当查询的字段来自于多个表时, 就会用到连接查询一: sql 92标准 :等值连接 ,(#内连接)1.可以为表区别名,区分多个重名的字段2.为表使用...

    #进阶6: 连接查询 (多表连接) : 等值连接/非等值连接 /左右全连接/内连接/*含义: 当查询的字段来自于多个表时, 就会用到连接查询

    一: sql 92标准 :等值连接 ,(#内连接)

    1.可以为表区别名,区分多个重名的字段

    2.为表使用别名后,只能使用别名去"select"!

    二:非等值连接

    1.where 列名 BETWEEN ... AND ...

    三:自连接 :自己连接自己

    四:左 / 右 外连接

    1.应用场景: 用于查询一个表有内容,另一个表没有内容

    如果从表中有和它匹配的,则显示匹配的值

    如果从表中没有和它匹配的,则显示null

    2.左外连接, left OUTER join (左边的是主表)

    on 连接关系

    where 筛选条件

    3.右外连接,right OUTER join (右边的是主表)

    on 连接关系

    where 筛选条件

    五:#全外连接 = 内连接的结果 + 表1中有但表2中没有的 + 表2中有的但表1中没有的

    #MYSQL不支持!! Oracle数据库

    六:#交叉连接

    实现笛卡尔成绩,实现两个表的任意两项进行连接!

    七:sql 92 和 sql 99*/#查询对偶姓名匹配SELECTbeauty.`name`,boys.`boyName`FROMbeauty,boysWHERE beauty.`boyfriend_id`=boys.`id`;

    #案例2: 查询员工名和对应的部门名SELECTlast_name,department_nameFROMemployees,departmentsWHERE employees.`department_id`=departments.department_id;

    #3.查询员工名/工种号/工种名 #使用别名SELECTe.`last_name` ,e.`job_id`,j.`job_title`FROMemployees e,jobs jWHERE e.`job_id`=j.`job_id`;

    #4.查询有奖金的员工名和部门名SELECTe.`last_name`,e.`department_id`FROMemployees e,departments dWHERE e.`department_id`=d.`department_id`;

    #5.查询每个工种的工种名和员工的个数, 并且按员工个数排序SELECT j.`job_title`,COUNT(*)FROMjobs j,employees eWHERE j.`job_id`=e.`job_id`GROUP BYj.`job_title`ORDER BY COUNT(*) DESC;

    #2 /非等值连接

    #案例1:查询员工的工资和工资级别SELECTsalary,grade_levelFROMemployees e,job_grades gWHERE e.salary BETWEEN g.`lowest_sal` ANDg.`highest_sal`;

    #3 /左 . 右 外连接

    #案例1:查询女生的男朋友不在boys 表中的 女生--[左外连接]

    SELECT b.name,bo.*

    FROMbeauty bLEFT OUTER JOINboys boON b.`boyfriend_id`=bo.`id`WHERE bo.`id` IS NULL;

    #案例2: 查询哪个部门没有员工SELECT d.*,e.employee_idFROMdepartments dLEFT OUTER JOINemployees eON d.`department_id`=e.`department_id`WHERE e.employee_id IS NULL;

    #全外连接= 内连接的结果 + 表1中有但表2中没有的 +表2中有的但表1中没有的

    #MYSQL不支持!!

    #交叉连接SELECT b.*,bo.*

    FROMbeauty bCROSS JOINboys bo;

    #内连接SELECT *

    FROMbeauty bINNER JOINboysON b.`boyfriend_id`=boys.`id`;

    展开全文
  • 文章目录1、笛卡尔积(交叉连接)2、等值连接 vs 非等值连接3、自连接 vs 非自连接4、内连接 vs 外连接5、SQL99语法新特性 多表查询,也称为关联查询,指两个或更多个表一起完成查询操作。 前提条件:这些一起查询...


    多表查询,也称为关联查询,指两个或更多个表一起完成查询操作。

    前提条件:这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段,这个关联字段可能建立了外键,也可能没有建立外键。比如:员工表和部门表,这两个表依靠“部门编号”进行关联。


    1、笛卡尔积(交叉连接)

    笛卡尔乘积是一个数学运算。假设我有两个集合 X 和 Y,那么 X 和 Y 的笛卡尔积就是 X 和 Y 的所有可能组合,也就是第一个对象来自于 X,第二个对象来自于 Y 的所有可能。组合的个数即为两个集合中元素个数的乘积数。
    在这里插入图片描述
    SQL92中,笛卡尔积也称为 交叉连接 ,英文是 CROSS JOIN 。在 SQL99 中也是使用 CROSS JOIN表示交叉连接。它的作用就是可以把任意表进行连接,即使这两张表不相关。

    笛卡尔积的错误会在下面条件下产生:
    ①省略多个表的连接条件(或关联条件)。
    ②连接条件(或关联条件)无效。
    ③所有表中的所有行互相连接

    为了避免笛卡尔积, 可以在 WHERE 加入有效的连接条件。

    加入连接条件后,查询语法:

    SELECT table1.column, table2.column
    FROM table1, table2
    WHERE table1.column1 = table2.column2; #连接条件
    

    2、等值连接 vs 非等值连接

    等值连接即连接条件为具体的某个或某些确定的值,而非等值连接即是连接条件为某个或某些范围。

    2.1 等值连接

    SELECT employees.employee_id, employees.last_name, employees.department_id, departments.department_id, departments.location_id
    FROM employees, departments
    WHERE employees.department_id = departments.department_id;
    

    拓展1:多个连接条件与 AND 操作符

    拓展2:区分重复的列名
    多个表中有相同列时,必须在列名之前加上表名前缀。
    在不同表中具有相同列名的列可以用 表名 加以区分。

    SELECT employees.last_name, departments.department_name,employees.department_id
    FROM employees, departments
    WHERE employees.department_id = departments.department_id;
    

    拓展3:表的别名
    使用别名可以简化查询。
    列名前使用表名前缀可以提高查询效率。

    SELECT e.employee_id, e.last_name, e.department_id,
    d.department_id, d.location_id
    FROM employees e , departments d
    WHERE e.department_id = d.department_id;
    

    需要注意的是,如果我们使用了表的别名,在查询字段中、过滤条件中就只能使用别名进行代替,不能使用原有的表名,否则就会报错。

    拓展4:连接多个表
    连接 n个表,至少需要n-1个连接条件。比如,连接三个表,至少需要两个连接条件。

    2.2 非等值连接

    SELECT e.last_name, e.salary, j.grade_level
    FROM employees e, job_grades j
    WHERE e.salary BETWEEN j.lowest_sal AND j.highest_sal;
    

    3、自连接 vs 非自连接

    自连接就是操作的两张或多张表本质上同属于一张表,只是通过起别名的方式使得它们逻辑上不是同一张表。非自连接则操作的两张或多张表本质上就是不同的表。

    #这是一个自连接,查询员工表中的员工及其领导(每个领导也是作为员工出现,因此也有领导)
    SELECT worker.last_name ,manager.last_name
    FROM employees worker, employees manager
    WHERE worker.manager_id = manager.employee_id ;
    

    4、内连接 vs 外连接

    内连接:合并具有同一列的两个以上的表的行,结果集中不包含一个表与另一个表不匹配的行。

    外连接:两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行,这种连接称为左(或右) 外连接。没有匹配的行时, 结果表中相应的列为空(NULL)。如果是左外连接,则连接条件中左边的表也称为主表 ,右边的表称为从表。如果是右外连接,则连接条件中右边的表也称为主表 ,左边的表称为从表 。

    4.1 SQL92 使用(+)创建连接
    在 SQL92 中采用(+)代表从表所在的位置。即左或右外连接中,(+) 表示哪个是从表。Oracle 对 SQL92 支持较好,而 MySQL 则不支持 SQL92 的外连接。

    #左外连接
    SELECT last_name,department_name
    FROM employees ,departments
    WHERE employees.department_id = departments.department_id(+);
    #右外连接
    SELECT last_name,department_name
    FROM employees ,departments
    WHERE employees.department_id(+) = departments.department_id;
    

    而且在 SQL92 中,只有左外连接和右外连接,没有满(或全)外连接。

    4.2 SQL99 内连接(INNER JOIN)的实现

    SELECT 字段列表
    FROM A表 INNER JOIN B表 #INNER可以省略
    ON 关联条件
    WHERE 等其他子句;
    
    SELECT employee_id, city, department_name
    FROM employees e
    JOIN departments d
    ON d.department_id = e.department_id
    JOIN locations l
    ON d.location_id = l.location_id;
    

    4.3 SQL99 左外连接(LEFT OUTER JOIN)

    #实现查询结果是A
    SELECT 字段列表
    FROM A表 LEFT JOIN B表
    ON 关联条件
    WHERE 等其他子句;
    
    SELECT e.last_name, e.department_id, d.department_name
    FROM employees e
    LEFT OUTER JOIN departments d
    ON (e.department_id = d.department_id) ;
    

    4.4 SQL99 右外连接(RIGHT OUTER JOIN)

    #实现查询结果是B
    SELECT 字段列表
    FROM A表 RIGHT JOIN B表
    ON 关联条件
    WHERE 等其他子句;
    
    SELECT e.last_name, e.department_id, d.department_name
    FROM employees e
    RIGHT OUTER JOIN departments d
    ON e.department_id = d.department_id;
    

    4.5 SQL99 满外连接(FULL OUTER JOIN)
    满外连接的结果 = 左右表匹配的数据 + 左表没有匹配到的数据 + 右表没有匹配到的数据。
    SQL99是支持满外连接的,使用FULL JOIN 或 FULL OUTER JOIN来实现。
    需要注意的是,MySQL不支持FULL JOIN,但是可以用 LEFT JOIN UNION RIGHT JOIN代替。

    4.6 UNION的使用
    合并查询结果 利用UNION关键字,可以给出多条SELECT语句,并将它们的结果组合成单个结果集。合并时,两个表对应的列数和数据类型必须相同,并且相互对应。各个SELECT语句之间使用UNION或UNION ALL关键字分隔。

    SELECT column,... FROM table1
    UNION [ALL]
    SELECT column,... FROM table2
    
    #查询部门编号>90或邮箱包含a的员工信息
    SELECT * FROM employees WHERE email LIKE '%a%'
    UNION
    SELECT * FROM employees WHERE department_id>90;
    

    UNION 操作符返回两个查询的结果集的并集,去除重复记录。
    在这里插入图片描述

    UNION ALL操作符返回两个查询的结果集的并集。对于两个结果集的重复部分,不去重。
    在这里插入图片描述
    注意:执行UNION ALL语句时所需要的资源比UNION语句少。如果明确知道合并数据后的结果数据不存在重复数据,或者不需要去除重复的数据,则尽量使用UNION ALL语句,以提高数据查询的效率。

    4.7 7种SQL JOINS的实现
    在这里插入图片描述

    #中图:内连接 A∩B
    SELECT employee_id,last_name,department_name
    FROM employees e JOIN departments d
    ON e.`department_id` = d.`department_id`;
    
    #左上图:左外连接
    SELECT employee_id,last_name,department_name
    FROM employees e LEFT JOIN departments d
    ON e.`department_id` = d.`department_id`;
    
    #右上图:右外连接
    SELECT employee_id,last_name,department_name
    FROM employees e RIGHT JOIN departments d
    ON e.`department_id` = d.`department_id`;
    
    #左中图:A - A∩B
    SELECT employee_id,last_name,department_name
    FROM employees e LEFT JOIN departments d
    ON e.`department_id` = d.`department_id`
    WHERE d.`department_id` IS NULL
    
    #右中图:B-A∩B
    SELECT employee_id,last_name,department_name
    FROM employees e RIGHT JOIN departments d
    ON e.`department_id` = d.`department_id`
    WHERE e.`department_id` IS NULL
    
    #左下图:满外连接
    # 左中图 + 右上图 A∪B
    SELECT employee_id,last_name,department_name
    FROM employees e LEFT JOIN departments d
    ON e.`department_id` = d.`department_id`
    WHERE d.`department_id` IS NULL
    UNION ALL #没有去重操作,效率高
    SELECT employee_id,last_name,department_name
    FROM employees e RIGHT JOIN departments d
    ON e.`department_id` = d.`department_id`;
    
    #右下图
    #左中图 + 右中图 A ∪B- A∩B 或者 (A - A∩B) ∪ (B - A∩B)
    SELECT employee_id,last_name,department_name
    FROM employees e LEFT JOIN departments d
    ON e.`department_id` = d.`department_id`
    WHERE d.`department_id` IS NULL
    UNION ALL
    SELECT employee_id,last_name,department_name
    FROM employees e RIGHT JOIN departments d
    ON e.`department_id` = d.`department_id`
    WHERE e.`department_id` IS NULL
    

    5、SQL99语法新特性

    5.1 自然连接
    SQL99 在 SQL92 的基础上提供了一些特殊语法,比如 NATURAL JOIN 用来表示自然连接。我们可以把自然连接理解为 SQL92 中的等值连接。它会自动查询两张连接表中所有相同的字段,然后进行等值连接 。
    在SQL92标准中:

    SELECT employee_id,last_name,department_name
    FROM employees e JOIN departments d
    ON e.`department_id` = d.`department_id`
    AND e.`manager_id` = d.`manager_id`;
    

    在 SQL99 中可以写成:

    SELECT employee_id,last_name,department_name
    FROM employees e NATURAL JOIN departments d;
    

    5.2 USING连接
    当我们进行连接的时候,SQL99还支持使用 USING 指定数据表里的同名字段进行等值连接。但是只能配合JOIN一起使用。比如:

    SELECT employee_id,last_name,department_name
    FROM employees e JOIN departments d
    USING (department_id);
    

    与自然连接 NATURAL JOIN 不同的是,USING 指定了具体的相同的字段名称,你需要在 USING的括号 () 中填入要指定的同名字段。同时使用 JOIN…USING 可以简化 JOIN ON 的等值连接。它与下面的 SQL 查询结果是相同的:

    SELECT employee_id,last_name,department_name
    FROM employees e ,departments d
    WHERE e.department_id = d.department_id;
    
    展开全文
  • mysql-数据查询语句-多表连接查询连接查询,是关系数据库中最主要的查询,包括等值查询、自然连接查询、非等值查询、自身连接查询、外连接查询和复合条件连接查询等。1、等值与非等值连接查询连接查询的where子句中...
  • ORACLE 8i,9i 表连接方法。一般的相等连接:select * from a, b where a.id = b.id;这个就属于内连接。对于外连接:Oracle中可以使用“(+) ”来表示,9i可以使用LEFT/RIGHT/FULL OUTER JOINLEFT OUTER JOIN:左外...
  • 关于MySQL92和99 等值连接、非等值连接、自连接、外连接及多表查询的代码示例总结! 一. MySQL92语法 *1. 内连接 没有关联关系的数据是不在查询范围之内的 * 1)等值连接 – 查询出101的班级信息(并带上该班级的...
  • 内链接:等值连接, 非等值连接,自连接 外连接 :左外,右外,全外 交叉连接 一般语法 SELECT 查询的列表 FROM 1 别名1,2 别名2 WHERE 1.关键词= 2.关键词; 【and 筛选条件】 【gr...
  • Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0Connected as scott@orclSQL> create table t_user_info(u_mobile varchar2(12));Table createdSQL> create table t_mobile_segment...
  • 存入到excel中,更直观,方便查询 image.png 等值连接(取交集) 语法 select * from 1,2 where 1.列=2.列 -- 查询学生信息及学生成绩 select * from students as stu,scores as sc where stu.studentNo...
  • 多表连接查询数据出现重复数据 首先我们分析一下为什么会出现重复的数据 通过上面的图与分析,我们知道了问题的所在,接下来就是如何去解决问题 这里有好几种方法,我就简单的为大家说一下吧: ①、首先在...
  • 但内连接并非等同于等值连接,因为还有非等值连接的情况 ^_^那么正确的结论应该是:内连接 =(等值连接+非等值连接):CREATE TABLE PERSONS(ID NUMBER(10) PRIMARY KEY ,LASTNAME VARCHAR2(20),FIRSTNAME VARCHAR2(20)...
  • 三个做左外连接 SELECT * FROM TESTA LEFT OUTER JOIN TESTB ON TESTA.A=TESTB.A LEFT OUTER JOIN TESTC ON TESTA.A=TESTC.A 左连接,以左边数据为准用left join on或者left outer join on 右连接,以右边数据为准...
  • 三种连接的语法为便于更的技友快速读懂、理解,只讨论2张表对象进行连接操作的情况,大于2张表对象进行的连接操作原理也是一样的。左连接 (LETFJOIN)SELECT M.columnname……,N.* columnname…..F...
  • 文章目录sql92标准的多表连接1、等值连接1.1 案例:1.2 等值连接加分组函数加排序1.3 三表连接2、非等值连接2.1 含义:2.2 案例:3、自连接3.1 含义:3.2 案例: 环境信息: 员工表:EMP 部门表: 工资等级表 ...
  • 等值连接:inner join自然连接: out join, left join,right join 等值连接连接join 是从两个关系的笛卡儿积中选取属性间满足一定条件的元组。连接运算中有两种最为重要也最为常用的连接,一种是等值连接,一种是外...
  • 笛卡尔积:是多表查询的数据基础(最全面的拼装)A表 m行 x列B表 n行 y列结果:A×B m*n行 x+y列按照需求自己处理 emp表和dept表数据之间没有进行匹配第一个表中的所有行和第二个表中的所有行都发生连接连接条件被省略...
  • 1.区分笛卡儿积,自然连接,等值连接,内连接,外连接(左连接,右连接和全连接)假设存在两张R和S,这里使用的是MySQL数据库。下面这张表是R下面这张是S为了测试左连接和右连接,现在增加一张T,字段和S的字段...
  • 含义:又称多表查询,当查询的字段来自于多个表时,就要用到连接查询 笛卡尔积现象:表1 有m行,表2有n行,结果有m*n行 发生原因:没有有效的连接条件 如何避免:添加有效的连接条件 分类: 按年代分类: sql92标准...
  • Mysql查询时的多表连接查询举个栗子等值连接自然连接:NATUEAL JOIN内连接:INNER JOIN或JOIN左外连接:LEFT OUTER JOIN或者LEFT JOIN右外连接:RIGHT OUTER JOIN或者RIGHT JOIN交叉连接(笛卡尔连接) 举个栗子 ...
  • 内连接:等值连接、非等值连接、自连接 外连接:左外连接、右外连接、全外连接 交叉连接 3. 等值连接 (1)查询女生名及其对应的男朋友名 SELECT girlname, boyname FROM boys, girls WH
  • mysql中的各种jion的记录,以备用时查1、等值连接和内连接,a.内连接与等值连接效果是相同的,执行效率也相同,只是书写方式不一样,内连接是由SQL 1999规则定的书写方式比如:select * from tableA a,tableB b ...
  • #查询:员工名、部门名、工种名,并按部门名排序(三表连接) SELECT last_name,department_name,job_title FROM employees e INNER JOIN departments d #内连接得和from的连接条件 ON e.`department_id`=d....
  • inner join(等值连接) 语法:SELECT * FROM 1 INNER JOIN 2 ON 1.字段号=2.字段号 作用:返回两个中字段相等的行,A与B交集 三连接语法:SELECT * FROM (1 INNER JOIN 2 ON 1.字段号=2.字段号...
  • 内连接之等值连接:最大特点是:条件是等量关系。 案例:查询每个员工的部门名称,要求显示员工名和部门名。 下面是SQL92的(太老,不用了) mysql> select e.ename ,d.dname from emp e,dept d where e...
  • 等值连接会出现笛卡尔积(出现一张虚拟的临时,不存在),此时需要过滤掉错误的数据,以两都出现的对应字段对接两,最后结果是显示出来的就是证确的数据,这叫等值连接,格式:select * from 1,2 where 1....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 46,529
精华内容 18,611
关键字:

多表等值连接

友情链接: selinux_netlink.rar