MySQL数据库(五)—— 多表查询

一、准备sql

# 创建部门表

create table dept (

  id int primary key auto_increment,

  name varchar(20)

);

insert into dept (name) values (‘开发部‘), (‘市场部’), (‘财务部‘);

# 创建员工表

create table emp (

  id int primary key auto_increment,

  name varchar(10),

  gender char(1), -- 性别

  salary double, -- 工资

  join_date date, -- 入职日期

  dept_id int,

  foreign key (dept_id) references dept(id) -- 外键,关联部门表(部门表外键)

);

insert into emp(name, gender, salary, join_date, dept_id) values(‘孙悟空‘,‘男‘,7200,‘2013-02-24‘,1);

insert into emp(name, gender, salary, join_date, dept_id) values(‘猪八戒‘,‘男‘,3600,‘2010-12-02‘,2);

insert into emp(name, gender, salary, join_date, dept_id) values(‘唐僧‘,‘男‘,9000,‘2008-08-08‘,2);

insert into emp(name, gender, salary, join_date, dept_id) values(‘白骨精‘,‘女‘,5000,)

二、笛卡尔积

笛卡尔积:有两个集合A和B,取这两个集合所有组合的情况。

select * from dept, emp;

查询的数据有很大一部分是无用的数据,因此多表查询要消除无用的数据,也称消除无用的产生的笛卡尔积。

三、多表查询的分类

1.内连接查询

2.外连接查询

3.子查询

四、内连接查询

内连接查询分为两类,隐式内连接和显式内连接,这两种查询方式只是写法不同,但是查询出来的结果是相同的。

1.隐式内连接:使用where条件消除无用的数据

语法:select 字段列表 from 表名列表 where 条件

例如:查询所有的员工表信息及对应的部门信息。

select * from emp,dept where emp.dept_id = dept.id;

例如:查询员工表的姓名,性别及对应的部门表名称。

select a.name, a.gender, b.name from emp a, dept b where a.dept_id = b.id;

2.显式内连接

语法:select 字段列表 from 表名1 inner join 表名2 on 条件

例如:查询所有的员工表信息及对应的部门信息。

select * from emp [inner] join dept on emp.dept_id = dept.id;

例如:查询员工表的姓名,性别及对应的部门表名称。

select a.name, a.gender,b.name from emp a inner join dept b on a.dept_id = b.id;

elect a.name, a.gender,b.name from emp a join dept b on a.dept_id = b.id; -- inner 可以省略

3.内连接查询需要确定如下三个要素:

a. 从哪些表中查询

b. 条件是什么

c. 查询哪些字段

五、外连接查询

1.左外连接查询

语法:select 字段列表 from 表1 left [outer] join 表2 on 条件;

例如:查询所有员工信息,如果员工有部门,则显示部门名称,如果员工没有部门,则不显示部门名称。

a. 内连接

SQL语句:select t1.*, t2.name from emp t1, dept t2 where t1.dept_id = t2.id;

查询结果如下:

查询到的结果只有5条数据,没有新增的员工信息。因为新增的员工信息没有部门id,因此这条数据在此次查询中被排除掉了。

内连接查询到的结果是交集部分。

b. 左外连接

SQL语句:select t1.*, t2.name from emp t1 left join dept t2 on t1.dept_id = t2.id;

此SQL语句,emp为左表,dept为右表。

查询结果如下:

左外连接查询的结果是左表所有数据以及其交集部分。

c.右外连接

SQL语句:select t1.*, t2.name from emp t1 right join dept t2 on t1.dept_id = t2.id;

此SQL语句,emp为左表,dept为右表。

查询到的结果如下:

右外连接查询的结果是右表所有数据,以及左表中与右表有交集的数据。

2.右外连接查询

语法:select 字段列表 from 表1 right  [outer] join 表2 on 条件;

例如:查询所有员工信息,如果员工有部门,则显示部门名称,如果员工没有部门,则不显示部门名称。

SQL语句:select * from dept t2 right join emp t1 on t1.dept_id = t2.id;

此SQL中,emp为右表,dept为左表,右外连接查询到的结果为emp的所有数据,以及dept表中与emp有交集的数据。

查询到的结果如下:

六、子查询

概念:查询中嵌套查询,称嵌套查询为子查询。

例如:查询工资最高的员工信息:

第一步:查询最高的工资是多少 9000

select max(salary) from emp;

第二部:查询员工信息,并且工资等于9000

select * from emp where salary = 9000;

得到如下结果:

根据以上分析的步骤,一条SQL就完成这个操作:

select * from emp where salary = (select max(salary) from emp);

得到如下结果:

七、子查询的结果是单行单列的情况

子查询结果可以作为条件,使用运算符去判断。

例如:查询员工工资小于平均工资的人

select * from emp where salary < (select avg(salary) from emp);

八、子查询的结果是多行单列的情况

子查询结果可以作为条件,使用运算符in去判断。

例如:查询‘财务部’和‘市场部’所有员工信息

select id from dept where name = ‘财务部‘ or name = ‘市场部‘;

select * from emp where dept_id = 3 or dept_id = 2;

select * from emp where dept_id in (3,2);

子查询语句

select * from emp where dept_id in (select id from dept where name = ‘财务部‘ or name = ‘市场部‘);

九、子查询的结果是多行多列的情况

子查询可以作为一张虚拟表,参与查询。

例如:查询员工入职日期是2011-11-11之后的员工信息和部门信息

子查询:

select * from dept t1, (select * from emp where join_date > ‘2011-11-11‘) t2 where t1.id = t2.dept_id;

内连接查询:

select * from emp t1, dept t2 where t1.dept_id = t2.id and t1.join_date > ‘2011-11-11‘;

原文地址:https://www.cnblogs.com/upyang/p/12154802.html

时间: 2024-11-09 17:41:12

MySQL数据库(五)—— 多表查询的相关文章

mysql数据库的多表查询,子查询,联合查询

/*多表查询*//*交叉连接*(表1条数*表2条数)*/SELECT * FROM emp JOIN dept;/*内连接(在交叉连接基础上加条件)*/SELECT * FROM emp JOIN dept ON deptid=id;SELECT * FROM emp JOIN dept ON emp.deptid=dept.id;/*左外连接*(以左表为主表)*/:SELECT * FROM product_type LEFT JOIN product ON product.`protype_

MySQL 数据库之单表查询

一.查询语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条数 二.关键字执行优先级 from where group by having select distinct order by limit 1.找到表:from 2.拿着where指定的约束条件,去文件/表中取出一条条记录 3.将取出的一条条记录进行分组group by,如果没有group by,则整体作为一组 4

MySQL数据库之多表查询

一.多表连接查询 #重点:外链接语法 SELECT 字段列表 FROM 表1 INNER|LEFT|RIGHT JOIN 表2 ON 表1.字段 = 表2.字段; 1.交叉连接交叉连接:不适用任何匹配条件.生成笛卡尔积 语法:mysql>select * from table1,table2; 2.内连接:找两张表共有的部分,相当于利用条件从笛卡尔积结果中筛选出了正确的结果 3 .外链接之左连接:优先显示左表全部记录 本质就是:在内连接的基础上增加左边有右边没有的结果 4 .外链接之右连接:优先

4.mysql数据库创建,表创建模等模板脚本,mysql_SQL99标准的连接查询(内连接,外连接,满外连接,交叉连接)

 mysql数据库创建,表创建模等模板脚本 -- 用root用户登录系统,执行脚本 -- 创建数据库 create database mydb61 character set utf8 ; -- 选择数据库 use mydb61; -- 增加 dbuser1 用户 --     创建用户'dbuser61'密码为 'dbuser61'拥有操作数据库mydb61的所有权限 GRANT ALL ON mydb61.* TO dbuser61 IDENTIFIED BY "dbuser61&quo

点评阿里JAVA手册之MySQL数据库 (建表规约、索引规约、SQL语句、ORM映射)

下载原版阿里JAVA开发手册  [阿里巴巴Java开发手册v1.2.0] 本文主要是对照阿里开发手册,注释自己在工作中运用情况. 本文内容:MySQL数据库 (建表规约.索引规约.SQL语句.ORM映射) 本文难度系数为三星(★★★) 本文为第四篇 第一篇 点评阿里JAVA手册之编程规约(命名风格.常量定义.代码风格.控制语句.注释规约) 第二篇 点评阿里JAVA手册之编程规约(OOP 规约 .集合处理 .并发处理 .其他) 第三篇 点评阿里JAVA手册之异常日志(异常处理 日志规约 ) 第四篇

Java对MySQL数据库进行连接、查询和修改(转)

Java对MySQL数据库进行连接.查询和修改 0. 一般过程: (1) 调用Class.forName()方法加载驱动程序. (2) 调用DriverManager对象的getConnection()方法,获得一个Connection对象. (3) 创建一个Statement对象,准备一个SQL语句,这个SQL语句可以是Statement对象(立即执行的的语句).PreparedStatement语句(预编译的语句)或CallableStatement对象(存储过程调用的语句). (4) 调用

MySQL数据库存储过程动态表建立(PREPARE)

PREPARE statement_name FROM sql_text /*定义*/ EXECUTE statement_name [USING variable [,variable...]] /*执行预处理语句*/ DEALLOCATE PREPARE statement_name /*删除定义*/ 这是我项目当中用到的,用作参考使用: DELIMITER $$ DROP PROCEDURE IF EXISTS `gpsdata`.`sp_test`$$ CREATE DEFINER=`r

16、MySQL数据库分库分表备份脚本

MySQL数据库分库分表备份脚本 ===================学员分享分库分表========================== 脚本单双引号的区别: 单引号是强引用,强制输出是所见即所得. 双引号是解析变量 和 多个字符串.数字等连接一个字符串 条件1  ||    条件2                      或   假真   真假 条件1 && 条件2                      并   真真    假假 !条件1  && 条件2    

mysql简单的单表查询详解

mysql简单的单表查询详解 MySQL的查询操作: 单表查询:简单查询 多表查询:连续查询 联合查询: 选择和投影: 投影:挑选要显示的字段 选择:挑选符合条件的行 投影:SELECT 字段1, 字段2, ... FROM tb_name;  SELECT * FROM tb_name; 选择:SELECT 字段1, ... FROM tb_name WHERE 子句; 布尔条件表达式 mysql> CREATE TABLE students (SID INT UNSIGNED AUTO_IN

更改MYSQL数据库不区分大小写表名

今天郁闷死了,在LINUX下调一个程序老说找不到表,但是我明明是建了表的,在MYSQL的命令行下也可以查到,为什么程序就找不到表呢? 后来请教了一个老师才搞定,原来是LINUX下的MYSQL默认是要区分表名大小写的,哎,弄了那么旧,害死我了. 让MYSQL不区分表名大小写的方法其实很简单: 1.用ROOT登录,修改/etc/my.cnf 2.在[mysqld]下加入一行:lower_case_table_names=1 3.重新启动数据库即可 更改MYSQL数据库不区分大小写表名