来自 新葡亰数据库 2019-11-21 18:24 的文章
当前位置: 澳门新葡亰app > 新葡亰数据库 > 正文

【澳门新葡亰app】Vendors表数据如下,等值和不等

SELECT操作多表数据

至于连接的主题材料,在《SQL必知必会》学习笔记中已经讲到过,不过还没调控完全,所以再学一下。

SQL多表查询

JOIN连接

首先我们先来看一下最简便的连年。Products表和Vendors表的总是
示例1
Products表数据如下
澳门新葡亰官网APP 1
Vendors表数据如下
澳门新葡亰官网APP 2
将这两张表经过以下语句连接

USE test
SELECT prod_name,Products.vend_id,vend_name
FROM Products,Vendors
WHERE Products.vend_id=Vendors.vend_id;
--连接条件为两张表的vend_id相同

总是结果如下
澳门新葡亰官网APP 3
当顾客所需数据不在四个表中,而在四个表中,就需求选择多表连接,将八个表中的数量整合到一块儿,使数码越来越直观地体现出来。在上述语句中,通过JOIN大家可以从结果中很鲜明地领略产物及其承包商。

等值和不等值连接查询

  • 从五个表中获取数据:若是在询问的时候,直接从五个表中获取数据。未有增加条件判定,会不能自已“笛Carl积”错误
  • 笛卡尔积错误
  • 笛Carl集会在上边条件下发生
    • 总结连接条件
    • 连年条件不算
    • 不无表中的装有行相互连接
  • 为了制止笛Carl集, 能够在 WHERE 参与使得的连接条件。
  • Oracle 连接多表查询
  • 在 WHERE 子句中写入连接条件。
  • 在表中有相近列时,在列名以前增加表名前缀

    SELECT table1.column, table2.column FROM table1, table2 WHERE table1.column1 = table2.column2;

内连接

内一连是风姿罗曼蒂克种相比常用的数据连接查询办法,上述语句正是内连接。上边将送交另风度翩翩种内一连的语法。两者的询问结果是同等的。

--内连接INNER JOIN
USE test
SELECT prod_name,Products.vend_id,vend_name
FROM Products INNER JOIN Vendors--和上面语句差异之处
ON Products.vend_id=Vendors.vend_id;

注:使用INNE奥迪Q5JOIN时,关键字INNE传祺可省略,不过接连条件必得用ON连接,不可能用FROM了。

内三番两次分为等值连接,非等值连接和自然连接三种。

等值连接
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;
  • 有别于重复的列名(应用表名可能表的小名)
  • 选拔表名前缀在多个表中区分相符的列。
  • 在分歧表中具备相通列名的列能够用表的外号加以区分。
  • 接二连三 n个表,最少须要 n-1个一连条件。 比如:连接多个表,最少需求四个一而再延续条件。

    -- 演练:查询出公司职工的 last_name, department_name, city SELECT last_name, department_name, city FROM employees e ,departments d ,locations l WHERE e.department_id = d.department_id AND d.location_id = l.location_id

等值连接

连天条件用等号相连,查询结果中列出被三回九转表中的全部列,包括重复列。为了进一步形象地反映“列出重复列”这些特点,接下去也许用Products和Vendors表来比喻。逻辑是:生机勃勃种成品能够对应多个中间商,一个代理商能够分娩多样成品。
示例2
Products表数据如下
澳门新葡亰官网APP 4
Vendors表数据如下
澳门新葡亰官网APP 5
然后实行等值连接的代码

SELECT * FROM Vendors,Products
WHERE Vendors.vend_id=Products.vend_id;

结果如图所示
澳门新葡亰官网APP 6
能够看出,在结果中vend_id列重复。

注:等值连接要满意2个规格,连接条件用=号,查询结果中富含被接连表中保有列,包括重复列。

非等值连接
-- EMPLOYEES表中的列工资应在JOB_GRADES表中的最高工资与最低工资之间
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;
非等值连接

连年条件中采纳除等号以外的可比运算符来比较连接列的列值。举个例子使用>,<,>=,<=,<>等,也能够利用约束运算符BETWEEN。上面用stu表和class表来示范非等值连接
示例3
新建stu表并插入数据,stu表用来代表学子和该学员的年级总成绩

    CREATE TABLE stu(
    sto VARCHAR(8) NOT NULL,
    stname VARCHAR(20) NOT NULL,
    stsex CHAR(2),
    stgrade FLOAT,
    CONSTRAINT pk_sto PRIMARY KEY(sto),
    CONSTRAINT ck_stsex CHECK(stsex in('男','女'))
    );
    INSERT INTO stu(sto,stname,stsex,stgrade)
    VALUES('20180101','李华','男','568'),
    ('20180102','张三','男','627'),
    ('20180103','孙丽','女','339'),
    ('20180104','袁康','男','482'),
    ('20180105','王婷','女','761'),
    ('20180106','赵四','男','568'),
    ('20180107','周其','女','348.5'),
    ('20180108','吴伟','男','528.5'),
    ('20180109','甄诚','女','702');
    SELECT * FROM stu;

stu表数据如下
澳门新葡亰官网APP 7
新建class表并插入数据,class表用来代表分班情状和年级总分之间的关系

    CREATE TABLE class(
    cla_no CHAR(2),
    cl CHAR(1),
    flag CHAR(6),
    gradelevel_h INT,
    gradelevel_l INT,
    CONSTRAINT pk_cla_no PRIMARY KEY(cla_no),
    CONSTRAINT ck_cl CHECK(cl in('A','B','C','D'))
    );
    INSERT INTO class(cla_no,cl,flag,gradelevel_l,gradelevel_h)
    VALUES('01','A','创新班','700','750'),
    ('02','B','重点','650','700'),
    ('03','B','重点','600','650'),
    ('04','C','提高','500','600'),
    ('05','C','提高','400','500'),
    ('06','D','补习','300','400'),
    ('07','D','补习','0','300');
    SELECT * FROM class;

Cla表数据如下
澳门新葡亰官网APP 8
前段时间要透过询问直观反映出学生疏班境况

    SELECT sto,stname,cla_no,flag,stgrade
    FROM stu INNER JOIN class
    ON stu.stgrade<=class.gradelevel_h AND stu.stgrade>class.gradelevel_l
    ORDER BY sto;

结果如图所示
澳门新葡亰官网APP 9

内接连、外接连(左(或右卡塔 尔(英语:State of Qatar) 外连接、满外连接)

  • 内三番五次: 归拢装有同等列的三个以上的表的行, 结果聚集不含有叁个表与另叁个表不合营的行
  • 外接连: 五个表在三番两次进度中除去回到满意接二连三条件的行以外还回去左(或右卡塔 尔(阿拉伯语:قطر‎表中不满意条件的行 ,这种连接称为左(或右卡塔尔 外连接。未有相称的行时, 结果表中相应的列为空(NULL). 外接连的 WHERE 子句条件相似于此中连接, 但连接条件中尚无相配行的表的列前边要加外连接运算符, 即用圆括号括起来的加号(+).
当然连接

渴求连接条件是千篇一律的属性组,且用等号连接,并在结果中把重复的习性列去掉。自然连接是去掉重复属性列的等值连接。
在SQL Server 二零零六中,不支持NATURAL JOIN关键字,在其余数据库中得以选用首要字NATURAL JOIN举行连接。

SELECT * FROM Vendors NATURAL JOIN Products;

地点的四个接二连三示例中,示例1是自然连接,示例2因为有双重列vend_id由此不满意自然连接的概念。示例3因为老是条件不是用等号连接,且三番一回条件属性列差异,因而不满意自然连接的定义。

注:对等值连接和自然连接的定义不是很清楚,后续弄明白了会有补充。

根本难题
1.多少个连连知足等值连接全数条件,唯独查询结果中不含有被连接表的具备列,而只含有部分列,是还是不是是等值连接。
2.等值连接是不是必得包罗重复列,不带有重复列但满意等值连接别的标准化,是不是就不是等值连接?互连网说本来连接是非常的等值连接,依照自然连接不满含重复列的概念,那么等值连接也能够不分包重复列。
3.本来连接是还是不是供给连接条件的属性列列名和数据类型都一致?假使仅列名分歧,其余规范都满意自然连接,是不是足以判别为本来连接。百度当然连接的定义说列名不必然相通,但英特网也会有些人会讲列名必需黄金年代致。(答案是列名必需意气风发律。自然连接会自动匹配列名相符列,假设列名类似,数据类型不一致,能张开隐式转变就能够合营成功,不能够拓宽隐式转变就能够报错卡塔 尔(阿拉伯语:قطر‎
Natural Join: Guidelines

  • The associated tables have one or more pairs of identically named columns.
  • The columns must be the same data type.
  • Don’t use ON clause in a natural join.

    注:关于两表中带有多少个相似列,怎么样筛选部分列作为连接字段实行自然连接,在此外小说中再详述。

    ##### 外连接

    与内接连的区分在于,借使表中有多少在另一张表中找不到一而再对象,内再三再四的做法是在结果中忽略这一个数量不打字与印刷,而外连接的做法是打印那个数据,而那些数据在另一张表中的连续几日对象则打字与印刷成NULL。
    参预外接连的表有主从之分,根据表的职分和言语中钦定的要害字,外接连可分为左外连接,右外连接,完全连接。

    ###### 左外连接(LEFT OUTE奥迪Q3 JOIN卡塔尔

    重回JOIN侧边表全体行,且重回JOIN左侧表中能相配上的行并对五个表的行开展相称。

    ###### 右外接连(奥迪Q5IGHT OUTRE JOIN卡塔尔

    回去JOIN侧面表全部行,且重回JOIN左侧表中能般配上的行并对五个表的行开展相配。

    ###### 完全连接(FULL OUTEKoleos JOIN卡塔 尔(英语:State of Qatar)

    再次回到JOIN左右两边表全部能协作的行和不能协作的行。
    上边依次比如
    示例4:Student表和Stu_澳门新葡亰官网APP,Grade表
    Student表数据如下
    澳门新葡亰官网APP 10
    Stu_Grade表数据如下
    澳门新葡亰官网APP 11

    ###### 对Student表和Stu_Grade表的左外连接

SELECT* FROM Student--左外连接,Student表为主,Stu_Grade表为从
LEFT OUTER JOIN Stu_Grade
ON Student.stu_id=Stu_Grade.stu_id;

询问结果如图所示
澳门新葡亰官网APP 12
图中显示了主表(Student卡塔尔国的全体行和从表(Stu_Grade卡塔尔的有的行。

内连接
SELECT e.last_name, d.department_name 
FROM employees e, departments d
WHERE e.department_id = d.department_id

-- SQL1999语法的方式
SELECT e.last_name, d.department_name 
FROM employees e 
INNER JOIN departments d ON e.department_id = d.department_id
对Student表和Stu_Grade表的右外接连
SELECT* FROM Student--右外连接,Student表为从,Stu_Grade表为主
RIGHT OUTER JOIN Stu_Grade
ON Student.stu_id=Stu_Grade.stu_id;

查询结果如图所示
澳门新葡亰官网APP 13
图中呈现了主表(Stu_Grade卡塔 尔(阿拉伯语:قطر‎的全数行和从表(Student卡塔尔国的局地行。

外连语法
  • 选择外接连能够查询不满意接二连三条件的数量。
  • 外接连的标志是 (+)。

  • 右外连接

    SELECT table1.column, table2.column FROM table1, table2 WHERE table1.column(+) = table2.column;

    -- 示例 SELECT e.last_name, d.department_name FROM employees e, departments d WHERE e.department_id(+) = d.department_id

    -- SQL1999方式 SELECT e.last澳门新葡亰app,_name, d.department_name FROM employees e RIGHT OUTER JOIN departments d ON (e.department_id = d.department_id)

  • 左外连接

    SELECT table1.column, table2.column FROM table1, table2 WHERE table1.column = table2.column(+);

    -- 示例 SELECT e.last_name, d.department_name FROM employees e, departments d WHERE e.department_id = d.department_id(+)

    -- SQL1999方式 SELECT e.last_name, d.department_name FROM employees e LEFT OUTER JOIN departments d ON (e.department_id = d.department_id)

对Student表和Stu_Grade表的完全连接
SELECT* FROM Student--完全连接
FULL OUTER JOIN Stu_Grade
ON Student.stu_id=Stu_Grade.stu_id;

查询结果如图所示
澳门新葡亰官网APP 14
图中显得了Student表和Stu_Grade表的持有行。

满外连接
  • 在SQL: 199第88中学,内一连只回去满意三回九转条件的多寡
  • 七个表在连年进度中除了回到满意一连条件的行以外还回来左(或右卡塔尔表中不满意条件的行,这种连接称为左(或右卡塔尔国外连接。
  • 七个表在接连进度中除了回到满足一而再一连条件的行以外还回来四个表中不知足条件的行 ,这种连接称为满 外连接。

    -- 满外连接 SELECT e.last_name, e.department_id, d.department_name FROM employees e FULL OUTER JOIN departments d ON (e.department_id = d.department_id)

接力连接

穿插连接将扭转来自几个基表全数不小可能率的构成。不接纳WHERE子句,交叉连接的结果是四个基表全数行的笛Carl积,使用WHERE子句,交叉连接的结果满意WHERE子句条件的数额行数的笛卡尔积
示例5:Student表和Course表演示交叉连接
Student表如图所示,为了越来越直观地察看数据,作者压缩了一些Student表的多少
澳门新葡亰官网APP 15
Course表如图所示
澳门新葡亰官网APP 16

自连接
  • 自连接能够把表自个儿作为三番五次的表

    -- 练习:查询出 last_name 为 ‘Chen’ 的职工的 manager 的新闻SELECT worker.last_name || ' works for ' || manager.last_name FROM employees worker , employees manager WHERE worker.manager_id = manager.employee_id AND INITCAP(worker.last_name) = 'Chen'

对Student和Course表进行无WHERE子句的穿插连接
SELECT * FROM Student
CROSS JOIN Course;

询问结果如图所示
澳门新葡亰官网APP 17
共24条数据,正是Student表和Course表的笛Carl积。

叉集(了解)
  • 使用CROSS JOIN 子句使连接的表发生叉集。
  • 叉集和笛Carl集是平等的。

    SELECT last_name, department_name FROM employees CROSS JOIN departments

对Student表和Course表进行有WHERE子句的穿插连接
SELECT * FROM Student
CROSS JOIN Course
WHERE Student.stu_id='20180101';

询问结果如图所示
澳门新葡亰官网APP 18
Student表中级知识分子足WHERE子句的独有1条数据,查询结果就是那条数据和Course表的笛Carl积。

本来连接

  • NATURAL JOIN 子句,会以四个表中颇负相像名字的列为条件创立等值连接。
  • 在表中询问知足等值条件的数目。
  • 假若只是列名相符而数据类型区别,则会发出错误

    再次回到的是,多个表中有所相近名字的列的“且、交集”,而非“或,并集”。即:譬喻employee类和department类都有
    department_id和manager_id,重回二者都大器晚成致的结果。

    SELECT department_id, department_name,

       location_id, city
    

    FROM departments NATURAL JOIN locations

自连接

贰个表与作者相连接的查询。首若是用于管理列与列之间的涉嫌。以PCourse表为例,CNumber代表该课程的学科号,PCNumber代表该课程的先修课课程号。
示例6:PCourse表的自连接查询
PCourse表的多少如图所示
澳门新葡亰官网APP 19
对PCourse表实行自连接查询

SELECT A.PCNumber,A.PCName,B.CNumber,B.CName
FROM PCourse A,PCourse B
WHERE A.CNumber=B.PCNumber;

询问结果如图所示
澳门新葡亰官网APP 20

接受USING成立连接

  • 在NATURAL JOIN 子句创立等值连接时,能够使用 USING 子句钦点等值连接中要求利用的列。
  • 运用 USING 能够在有多少个列满足条件时展开选择。
  • 毫无给选中的列中加上表名前缀或别称。
  • JOIN 和 USING 子句平常还要采纳。
  • 有局限性:但若多表的接连列列名差别,此法不确切

    select  last_name,department_name 
    from employees 
    join departments using (department_id);
    

使用ON 子句制造连接 (常用)

  • 无可否认连接中是以全数同等名字的列为连接条件的。
  • 能够选用 ON 子句内定额外的连天条件。
  • 以此接二连三条件是与任何条件分开的。
  • ON 子句使语句具备越来越高的易读性。

    SELECT e.employee_id, e.last_name, e.department_id,

       d.department_id, d.location_id
    

    FROM employees e JOIN departments d ON (e.department_id = d.department_id)

    -- 使用ON 创立多表连接 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

本文由澳门新葡亰app发布于新葡亰数据库,转载请注明出处:【澳门新葡亰app】Vendors表数据如下,等值和不等

关键词: