MySql 中的union,join 解析

UNION(并)

关键字UNION会把查询结果集直接合并到一起,同时将会去掉重复记录.
注意 连接的属性的个数一定要相等

建立两张表,音乐戏学生和计算机系的学生

计算机学生表

CREATE TABLE `cstudent` (
    `name` VARCHAR(20) NOT NULL,
    `sex` VARCHAR (6) NOT NULL
) CHARSET = utf8;

音乐系学生表
CREATE TABLE `mstudent` (
    `name` VARCHAR(20) NOT NULL,
    `sex` VARCHAR (6) NOT NULL
)CHARSET = utf8;

插入数据

INSERT INTO `cstudent` VALUES ('小李','男');
INSERT INTO `cstudent` VALUES ('小王','男');
INSERT INTO `cstudent` VALUES ('小高','女');

INSERT INTO `mstudent` VALUES ('小高','女');
INSERT INTO `mstudent` VALUES ('小张','女');
INSERT INTO `mstudent` VALUES ('小赵','男');

使用UNION

SELECT * FROM cstudent
UNION
SELECT * FROM mstudent;
name    sex     
------  --------
小李           
小王           
小高           
小张           
小赵           

可以看到 小高  这条记录只有一条

使用 UNION ALL 不会去掉重复的内容

SELECT * FROM cstudent
UNION ALL
SELECT * FROM mstudent;
name    sex     
------  --------
小李           
小王           
小高           
小高           
小张           
小赵           

可以看到 小高  出现了两次

JOIN(连接)

join有内连接,外连接和交叉连接三种方式

首先建立一个部门department表和员工employee表

department表:

CREATE TABLE `department`(
    `dno` INT UNSIGNED comment '部门编号' ,
    `dname` VARCHAR(30) comment '部门名称',
    `dlocation` VARCHAR(30) comment '部门位置',
    PRIMARY KEY (`dno`)
) CHARSET = utf8;

插入数据:

INSERT INTO `department` VALUES (10,'技术部','北京');
INSERT INTO `department` VALUES (20,"运营部","上海");
INSERT INTO `department` VALUES (30,"市场部","深圳");
INSERT INTO `department` VALUES (40,"人事部","广州");
INSERT INTO `department` VALUES (50,"后勤部","上海");

建立emloyee表:

CREATE TABLE `employee`(
    `eno` INT UNSIGNED comment '员工编号' ,
    `ename` VARCHAR(30) NOT NULL comment '员工姓名',
    `eleader` INT UNSIGNED comment '员工领导编号',
    `esalary` INT UNSIGNED comment '员工薪水',
    `dno` INT UNSIGNED comment '员工的部门编号',
    PRIMARY KEY (`eno`)
)CHARSET = utf8;

插入员工信息:

INSERT INTO `employee` VALUES (1000,'小明',1001,999,10);
INSERT INTO `employee` VALUES (1001,'小红',1002,1999,20);
INSERT INTO `employee` VALUES (1002,'小张',1003,2999,30);
INSERT INTO `employee` VALUES (1003,'小李',1004,3499,40);
INSERT INTO `employee` VALUES (1004,'小高',1005,5999,10);
INSERT INTO `employee` VALUES (1005,'Boss',NULL,999999,60);
两个表里的所有数据如下:

department表里的数据为:
    dno  dname      dlocation  
------  ---------  -----------
    10  技术部        北京     
    20  运营部        上海     
    30  市场部        深圳     
    40  人事部        广州     
    50  后勤部        上海     

employee表里的数据为:
   eno  ename   eleader  esalary     dno  
------  ------  -------  -------  --------
  1000  小明         1001      999        10
  1001  小红         1002     1999        20
  1002  小张         1003     2999        30
  1003  小李         1004     3499        40
  1004  小高         1005     5999        10
  1005  Boss       (NULL)   999999        60

内连接

在表关系的笛卡尔积数据记录中,保留表关系中所有匹配的数据记录,舍弃不匹配的数据记录.
内连接一般有自连接,等值连接,不等连接

  • 自连接,顾明思议,自己和自己连接
    查询每个员工的姓名,薪水,以及领导姓名
SELECT emp.`ename` , emp.`esalary` ,lea.`ename` leader
FROM employee  emp
INNER JOIN employee lea
ON emp.`eleader` =  lea.`eno`;

查询结果

ename   esalary  leader  
------  -------  --------
小明          999  小红  
小红         1999  小张  
小张         2999  小李  
小李         3499  小高  
小高         5999  Boss  
  • 等值连接
    查询每个员工的姓名,部门名称,以及位置
SELECT employee.`ename`, department.`dname`,department.`dlocation`
FROM employee 
INNER JOIN department
ON employee.`dno` = department.`dno`;

查询结果

ename   dname      dlocation  
------  ---------  -----------
小明      技术部        北京     
小高      技术部        北京     
小红      运营部        上海     
小张      市场部        深圳     
小李      人事部        广州     
  • 不等连接
    查询员工的编号小于其领导编号的每个员工的编号,员工姓名,领导名字,领导编号
SELECT emp.`ename` ,emp.`eno` ,lea.`ename` leader_name ,lea.`eno` leader_no
FROM employee  emp
INNER JOIN employee lea
ON emp.`eleader` = lea.`eno` AND emp.`eno`<lea.`eno`;

结果

ename      eno  leader_name  leader_no  
------  ------  -----------  -----------
小明        1000  小红                1001
小红        1001  小张                1002
小张        1002  小李                1003
小李        1003  小高                1004
小高        1004  Boss               1005

外连接

在表关系的笛卡尔积数据记录中,不仅保留表关系中所有匹配的数据记录,而且还会保留部分不匹配的数据记录.
外连接分为左外连接,右外连接,和全外连接

  • 左外连接也叫左连接 left [outer] join
    查询每个部门的名称,以及每个部门的员工
SELECT department.`dname`,employee.`ename`
FROM  department 
LEFT JOIN employee
ON department.`dno` = employee.`dno` ;

结果

dname      ename   
---------  --------
技术部        小明  
运营部        小红  
市场部        小张  
人事部        小李  
技术部        小高  
后勤部        (NULL)  
  • 右外连接也叫右连接 right [outer] join
    查询每个员工名称已经每个员工的部门的名称
SELECT employee.`ename`,department.`dname`
FROM  department 
RIGHT JOIN employee
ON department.`dno` = employee.`dno` ;

结果

ename   dname      
------  -----------
小明      技术部  
小红      运营部  
小张      市场部  
小李      人事部  
小高      技术部  
Boss    (NULL)     
  • 全外连接 full [outer] join
    和左外连接,右外连接的用法差不多,就不举例子了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值