(七)MySQL数据操作DQL:多表查询2

(1)准备环境

1)创建员工表

mysql> create table company.employee6(
    -> emp_id int auto_increment primary key not null,
    -> emp_name varchar(10),
    -> age int,
    -> dept_id int);
mysql> insert into employee6(emp_name,age,dept_id) values
    -> (‘tom‘,19,200),
    -> (‘jack‘,30,201),
    -> (‘alice‘,24,202),
    -> (‘robin‘,40,200),
    -> (‘natasha‘,28,204);

2)创建部门表

mysql> create table company.department(
    -> dept_id int,
    -> dept_name varchar(100));
mysql> insert into department values (200,‘hr‘), (201,‘it‘), (202,‘sale‘), (203,‘fd‘);

(2)交叉连接

生成笛卡尔积,不使用任何匹配条件

语法:select 表1.字段1,表1.字段2,表2.字段1 from 表1,表2;

mysql> select employee6.emp_name,employee6.age,employee6.dept_id,department.dept_name from employee6,department;
+----------+------+---------+-----------+
| emp_name | age  | dept_id | dept_name |
+----------+------+---------+-----------+
| tom      |   19 |     200 | hr        |
| tom      |   19 |     200 | it        |
| tom      |   19 |     200 | sale      |
| tom      |   19 |     200 | fd        |
| jack     |   30 |     201 | hr        |
| jack     |   30 |     201 | it        |
| jack     |   30 |     201 | sale      |
| jack     |   30 |     201 | fd        |
| alice    |   24 |     202 | hr        |
| alice    |   24 |     202 | it        |
| alice    |   24 |     202 | sale      |
| alice    |   24 |     202 | fd        |
| robin    |   40 |     200 | hr        |
| robin    |   40 |     200 | it        |
| robin    |   40 |     200 | sale      |
| robin    |   40 |     200 | fd        |
| natasha  |   28 |     204 | hr        |
| natasha  |   28 |     204 | it        |
| natasha  |   28 |     204 | sale      |
| natasha  |   28 |     204 | fd        |
+----------+------+---------+-----------+

(3)内连接:根据两张表的相同字段只连接匹配的行

语法:select 表1.字段n,表2.字段n from 表1,表2 表1.字段 = 表2.字段

根据员工表的dept_id 和部门表的dept_id进行连接,只匹配dept_id相同的行

mysql> select employee6.dept_id,employee6.emp_name,employee6.age,department.dept_name from employee6,department where employee6.dept_id = department.dept_id;
+---------+----------+------+-----------+
| dept_id | emp_name | age  | dept_name |
+---------+----------+------+-----------+
|     200 | tom      |   19 | hr        |
|     201 | jack     |   30 | it        |
|     202 | alice    |   24 | sale      |
|     200 | robin    |   40 | hr        |
+---------+----------+------+-----------+

(4)外连接

语法:select 字段列表 from 表1 left|right join 表2 on 表1.字段 = 表2.字段

1)外连接之左连接:会显示左边表内所有的值,不论在右边表内匹不匹配

mysql> select emp_id,emp_name,age,dept_name from employee6 left join department on employee6.dept_id = department.dept_id;
+--------+----------+------+-----------+
| emp_id | emp_name | age  | dept_name |
+--------+----------+------+-----------+
|      1 | tom      |   19 | hr        |
|      4 | robin    |   40 | hr        |
|      2 | jack     |   30 | it        |
|      3 | alice    |   24 | sale      |
|      5 | natasha  |   28 | NULL      |
+--------+----------+------+-----------+

2)外连接之右连接:会显示右边表内所有的值,不论在左边表内匹不匹配

mysql> select emp_id,emp_name,age,dept_name from employee6 right join department on employee6.dept_id = department.dept_id;
+--------+----------+------+-----------+
| emp_id | emp_name | age  | dept_name |
+--------+----------+------+-----------+
|      1 | tom      |   19 | hr        |
|      2 | jack     |   30 | it        |
|      3 | alice    |   24 | sale      |
|      4 | robin    |   40 | hr        |
|   NULL | NULL     | NULL | fd        |
+--------+----------+------+-----------+

(5)复合条件连接查询

以内连接的方式查询 employee6 和 department 表,并且 employee6 表中的 age 字段值必须大于 25,排序

mysql> select emp_id,emp_name,age,dept_name from employee6,department where employee6.dept_id = department.dept_id and age >25;
+--------+----------+------+-----------+
| emp_id | emp_name | age  | dept_name |
+--------+----------+------+-----------+
|      4 | robin    |   40 | hr        |
|      2 | jack     |   30 | it        |
+--------+----------+------+-----------+
2 rows in set (0.00 sec)

mysql> select emp_id,emp_name,age,dept_name from employee6,department where employee6.dept_id = department.dept_id and age >25 order by age;
+--------+----------+------+-----------+
| emp_id | emp_name | age  | dept_name |
+--------+----------+------+-----------+
|      2 | jack     |   30 | it        |
|      4 | robin    |   40 | hr        |
+--------+----------+------+-----------+
2 rows in set (0.00 sec)

mysql> select emp_id,emp_name,age,dept_name from employee6,department where employee6.dept_id = department.dept_id and age >25 order by age desc;
+--------+----------+------+-----------+
| emp_id | emp_name | age  | dept_name |
+--------+----------+------+-----------+
|      4 | robin    |   40 | hr        |
|      2 | jack     |   30 | it        |
+--------+----------+------+-----------+

(6)子查询

子查询是将一个查询语句嵌套在另一个查询语句中。内层查询语句的查询结果,可以为外层查询语句提供查询条件。

1)带in的子查询

mysql> select * from employee6 where dept_id in (select dept_id from department);
+--------+----------+------+---------+
| emp_id | emp_name | age  | dept_id |
+--------+----------+------+---------+
|      1 | tom      |   19 |     200 |
|      2 | jack     |   30 |     201 |
|      3 | alice    |   24 |     202 |
|      4 | robin    |   40 |     200 |
+--------+----------+------+---------+
4 rows in set (0.00 sec)

2)带比较运算符的子查询

mysql> select dept_name from department where dept_id in (select dept_id from employee6 where age >25);
+-----------+
| dept_name |
+-----------+
| it        |
| hr        |
+-----------+
2 rows in set (0.00 sec)

原文地址:https://www.cnblogs.com/lovelinux199075/p/8903912.html

时间: 2024-11-06 09:58:16

(七)MySQL数据操作DQL:多表查询2的相关文章

(七)MySQL数据操作DQL:单表查询

(1)单表查询 1)环境准备 mysql> CREATE TABLE company.employee5( id int primary key AUTO_INCREMENT not null, name varchar(30) not null, sex enum('male','female') default 'male' not null, hire_date date not null, post varchar(50) not null, job_description varcha

mysql第四篇:数据操作之多表查询

mysql第四篇:数据操作之多表查询 一.多表联合查询 #创建部门 CREATE TABLE IF NOT EXISTS dept ( did int not null auto_increment PRIMARY KEY, dname VARCHAR(50) not null COMMENT '部门名称' )ENGINE=INNODB DEFAULT charset utf8; #添加部门数据 INSERT INTO `dept` VALUES ('1', '教学部'); INSERT INT

07-查询操作(DQL)-多表查询

一. 综述   查询操作主要从两个方面来说:单表查询和多表查询. 多表查询包括:笛卡尔积.外键约束.内连接查询.外链接查询.自连接查询. 二 . 案例设计   1.  设计产品表(product).包括:主键id.产品名称(productName).分类编号(dir_id).零售价(salePrice).供应商(supplier).品牌(brand).折扣(cutoff).成本价(costPrice). 设计产品产品编号表( productdir). 包括:主键id.编号名称( dirName)

mysql 数据操作 多表查询 目录

mysql 数据操作 多表查询 准备 mysql 数据操作 多表查询 多表连接查询 笛卡尔积 mysql 数据操作 多表查询 多表连接查询 内连接 mysql 数据操作 多表查询 多表连接查询 外链接之左连接 右连接 mysql 数据操作 多表查询 多表连接查询 全外连接 原文地址:https://www.cnblogs.com/mingerlcm/p/10523097.html

SQL学习之MySQL数据操作

阅读目录 一 介绍 二 插入数据INSERT 三 更新数据UPDATE 四 删除数据DELETE 五 查询数据SELECT 六 权限管理 一 介绍 MySQL数据操作: DML ======================================================== 在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包括 使用INSERT实现数据的插入 UPDATE实现数据的更新 使用DELETE实现数据的删除 使用SELECT查询数据以及. ==

JAVA调用mysql数据操作时出现错误:impossible to write to binary log since statement is in row format and BINLOG_FORMAT = STATEMENT.'

使用mysql做持久化报错:Cannot execute statement: impossible to write to binary log since BINLOG_FORM ActiveMQ中如果使用mysql innodb的同时,开启了binlog,那么在ack消息的时候,日志里就可会报错:java.sql.SQLException: Cannot execute statement: binlogging impossible since BINLOG_FORMAT = STATE

SQL应用与开发:(七)数据操作 · 查 · (三)使用子查询访问和修改数据

3.使用子查询访问和修改数据 子查询和连接查询一样提供了使用单个查询访问多个表中的数据的方法.子查询在其他结果的基础上提供一种有效地方式来表示WHERE子句的条件.子查询是一个SELECT语句,它定义在SELECT.INSERT.UPDATE或DELECT语句或者另一个子查询中.子查询的SELECT语句可与外部查询指向不同的表. 嵌套的子查询或嵌套的SELECT语句是指包含一个或多个子查询的SELECT语句.子查询可嵌套在外部的SELECT.INSERT.UPDATE或DELECT语句的WHER

MySQL数据操作

一, MySQL的软件架构 a) 开启MySQL服务器:以windows服务的形式开启,在cmd下net start mysql|net stop mysql,在cmd下使用mysqld –default-file= "d:/amp/mysql/my.ini" b) 连接MySQL服务器 c) mysql的帮助命令,help,里面的指令都可以使用  \字母 来完成 d) mysql的注释符:行注释:#或-- ,块注释是/*   */ 二, 数据库的操作 a) 创建数据库:create

mysql四-1:单表查询

一.单表查询的语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条数 二.关键字的执行优先级(重点) 1.from  库.表--找到表 2.where  条件--按照where指定的约束条件,去表中取出一条条记录 3.group by  分组条件--对取出的一条条记录分组,如果没有group by,整体作为一组 4.having  过滤--将分组的结果进行过滤 5.selec