MySQL学习——SQL查询语句(连接查询&子查询)(三)

一:连接查询:

  连接查询是将俩个或者俩个以上的表按照某个条件连接起来,从中选择需要的数据,连接查询同时查询俩个或者俩个以上的表时使用,当不同的表中存在表示相同意义的字段时,可以通过该字段来连接这几个表,例如,学生表中有course_id字段来表示所学课程的课程号,课程表中有num字段来表示课程号,那么可以通过学生表中的course_id字段与课程表中的num字段来进行连接查询,连接查询包括内连接查询和外连接查询。

1.1 内连接查询

  内连接查询是一种常用的连接查询,内连接查询可以查询俩个或者以上的表。

  注:俩个表中表示相同意思的字段可以是指父表的主键和字表的外键;

例:创建俩个示例表employee和department

mysql>
mysql> show create table department\G
*************************** 1. row ***************************
       Table: department
Create Table: CREATE TABLE `department` (
  `d_id` int(11) DEFAULT NULL,
  `d_name` varchar(20) DEFAULT NULL,
  `function` varchar(20) DEFAULT NULL,
  `address` varchar(20) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> show create table employee\G
*************************** 1. row ***************************
       Table: employee
Create Table: CREATE TABLE `employee` (
  `num` int(11) DEFAULT NULL,
  `d_id` int(11) DEFAULT NULL,
  `name` varchar(20) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `sex` char(4) DEFAULT NULL,
  `homeaddr` varchar(20) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> desc employee;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| num      | int(11)     | YES  |     | NULL    |       |
| d_id     | int(11)     | YES  |     | NULL    |       |
| name     | varchar(20) | YES  |     | NULL    |       |
| age      | int(11)     | YES  |     | NULL    |       |
| sex      | char(4)     | YES  |     | NULL    |       |
| homeaddr | varchar(20) | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

mysql> desc department;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| d_id     | int(11)     | YES  |     | NULL    |       |
| d_name   | varchar(20) | YES  |     | NULL    |       |
| function | varchar(20) | YES  |     | NULL    |       |
| address  | varchar(20) | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

mysql>

插入实验所需数据:

mysql> select * from employee,department;
+------+------+--------+------+------+--------------------+------+-----------+--------------+---------------------+
| num  | d_id | name   | age  | sex  | homeaddr           | d_id | d_name    | function     | address             |
+------+------+--------+------+------+--------------------+------+-----------+--------------+---------------------+
|    1 | 1001 | 张三   |   26 | 男   | 北京市海定区       | 1001 | 科研部    | 研发产品     | 3号楼5层            |
|    1 | 1001 | 张三   |   26 | 男   | 北京市海定区       | 1002 | 生        | 生产产品     | 5号楼1层            |
|    1 | 1001 | 张三   |   26 | 男   | 北京市海定区       | 1003 | 销售部    | 策划销售     | 1号楼销售大厅       |
|    2 | 1002 | 李四   |   24 | 女   | 北京市昌平区       | 1001 | 科研部    | 研发产品     | 3号楼5层            |
|    2 | 1002 | 李四   |   24 | 女   | 北京市昌平区       | 1002 | 生        | 生产产品     | 5号楼1层            |
|    2 | 1002 | 李四   |   24 | 女   | 北京市昌平区       | 1003 | 销售部    | 策划销售     | 1号楼销售大厅       |
|    3 | 1001 | 王五   |   24 | 男   | 湖南长沙市         | 1001 | 科研部    | 研发产品     | 3号楼5层            |
|    3 | 1001 | 王五   |   24 | 男   | 湖南长沙市         | 1002 | 生        | 生产产品     | 5号楼1层            |
|    3 | 1001 | 王五   |   24 | 男   | 湖南长沙市         | 1003 | 销售部    | 策划销售     | 1号楼销售大厅       |
|    4 | 1004 | Aric   |   15 | 男   | England            | 1001 | 科研部    | 研发产品     | 3号楼5层            |
|    4 | 1004 | Aric   |   15 | 男   | England            | 1002 | 生        | 生产产品     | 5号楼1层            |
|    4 | 1004 | Aric   |   15 | 男   | England            | 1003 | 销售部    | 策划销售     | 1号楼销售大厅       |
+------+------+--------+------+------+--------------------+------+-----------+--------------+---------------------+
12 rows in set (0.00 sec)

mysql>

查询结果显示employee表和department表的d_id字段都表示部门号,通过d_id字段可以将employee表和department表进行内连接查询,从employee表中查询出num,name,d_id,age和sex这几个字段。

mysql>
mysql> select num,name,employee.d_id,age,sex,d_name,function from employee,department where employee.d_id = department.d_id;
+------+--------+------+------+------+-----------+--------------+
| num  | name   | d_id | age  | sex  | d_name    | function     |
+------+--------+------+------+------+-----------+--------------+
|    1 | 张三   | 1001 |   26 | 男   | 科研部    | 研发产品     |
|    2 | 李四   | 1002 |   24 | 女   | 生        | 生产产品     |
|    3 | 王五   | 1001 |   24 | 男   | 科研部    | 研发产品     |
+------+--------+------+------+------+-----------+--------------+
3 rows in set (0.00 sec)

mysql>

  

1.2 外连接查询

  外连接查询可以查询俩个或者俩个以上的表,外连接查询也需要通过制定字段来进行连接,当该字段取值相等时,可以查询出该记录,而且该字段取值不相等的记录也可以查询出来,外连接查询包括左连接查询和右连接查询。

  格式: SELECT 属性列表 FROM 表名1 LEFT |  RIGHT JOIN 表名2  ON 表名1属性=表名2属性;

1.2.1 左连接查询

  使用左连接查询employee和department俩表,通过d_id字段进行连接;

mysql>
mysql> select num,name,employee.d_id,age,sex,d_name,function from employee LEFT JOIN department on employee.d_id=department.d_id;
+------+--------+------+------+------+-----------+--------------+
| num  | name   | d_id | age  | sex  | d_name    | function     |
+------+--------+------+------+------+-----------+--------------+
|    1 | 张三   | 1001 |   26 | 男   | 科研部    | 研发产品     |
|    3 | 王五   | 1001 |   24 | 男   | 科研部    | 研发产品     |
|    2 | 李四   | 1002 |   24 | 女   | 生        | 生产产品     |
|    4 | Aric   | 1004 |   15 | 男   | NULL      | NULL         |
+------+--------+------+------+------+-----------+--------------+
4 rows in set (0.00 sec)

mysql>

1.2.2 右连接查询

  使用右连接查询employee和department俩表,通过d_id字段进行连接;

mysql> select num,name,age,sex,department.d_id,d_name,function from employee RIGHT JOIN department on employee.d_id=department.d_id;
+------+--------+------+------+------+-----------+--------------+
| num  | name   | age  | sex  | d_id | d_name    | function     |
+------+--------+------+------+------+-----------+--------------+
|    1 | 张三   |   26 | 男   | 1001 | 科研部    | 研发产品     |
|    2 | 李四   |   24 | 女   | 1002 | 生        | 生产产品     |
|    3 | 王五   |   24 | 男   | 1001 | 科研部    | 研发产品     |
| NULL | NULL   | NULL | NULL | 1003 | 销售部    | 策划销售     |
+------+--------+------+------+------+-----------+--------------+
4 rows in set (0.00 sec)

mysql>

1.2.3 复合条件查询

  在连接查询时,也可以增加其他的限制条件,通过多个条件的复合查询,可以使查询结果更加准确。

例如:使用内连接的方式查询employee表和department表,并且employee表中的age字段的值必须大于24.

mysql>
mysql> select num,name,employee.d_id,age,sex,d_name,function
    -> from employee,department
    -> where employee.d_id = department.d_id
    -> and age>24;
+------+--------+------+------+------+-----------+--------------+
| num  | name   | d_id | age  | sex  | d_name    | function     |
+------+--------+------+------+------+-----------+--------------+
|    1 | 张三   | 1001 |   26 | 男   | 科研部    | 研发产品     |
+------+--------+------+------+------+-----------+--------------+
1 row in set (0.00 sec)

mysql>
mysql>
mysql> select num,name,employee.d_id,age,sex,d_name,function from employee,department where employee.d_id = department.d_id having  age>24;
+------+--------+------+------+------+-----------+--------------+
| num  | name   | d_id | age  | sex  | d_name    | function     |
+------+--------+------+------+------+-----------+--------------+
|    1 | 张三   | 1001 |   26 | 男   | 科研部    | 研发产品     |
+------+--------+------+------+------+-----------+--------------+
1 row in set (0.00 sec)

mysql>

例子:使用内连接的方式查询employee表和department表,并且以age字段的升序方式显示查询结果

mysql>
mysql> select num,name,employee.d_id,age,sex,d_name,function
    -> from employee,department
    -> where employee.d_id=department.d_id
    -> order by age ASC;
+------+--------+------+------+------+-----------+--------------+
| num  | name   | d_id | age  | sex  | d_name    | function     |
+------+--------+------+------+------+-----------+--------------+
|    3 | 王五   | 1001 |   24 | 男   | 科研部    | 研发产品     |
|    2 | 李四   | 1002 |   24 | 女   | 生        | 生产产品     |
|    1 | 张三   | 1001 |   26 | 男   | 科研部    | 研发产品     |
+------+--------+------+------+------+-----------+--------------+
3 rows in set (0.00 sec)

mysql>

二:子查询

  子查询时将一个查询语句嵌套在另一个查询语句中,内层查询语句的查询结果,可以为外层查询语句提供查询条件,因为在特定的情况下,一个查询语句的条件需要另外一个查询语句来获取,例如现在需要从学生成绩表中查询计算机系学生的各科成绩,那么首先就必须知道哪些课程是计算机系学生选修的,因此必须查询计算机学生选修的课程,然后根据这些课程来查询计算机系学生的各科成绩,通过子查询,可以实现多表之间的查询,子查询中可能包括IN,NOT IN,ANY,ALL,EXISTS和NOT EXSITS等关键字,子查询中还可能包含比较运算符,如‘=’,‘!=’,‘>’等;

2.1带IN关键字的子查询

mysql> select * from employee
    -> where d_id IN
    -> (select d_id from department);
+------+------+--------+------+------+--------------------+
| num  | d_id | name   | age  | sex  | homeaddr           |
+------+------+--------+------+------+--------------------+
|    1 | 1001 | 张三   |   26 | 男   | 北京市海定区       |
|    2 | 1002 | 李四   |   24 | 女   | 北京市昌平区       |
|    3 | 1001 | 王五   |   24 | 男   | 湖南长沙市         |
+------+------+--------+------+------+--------------------+
3 rows in set (0.00 sec)

mysql>

查询employee表中的记录,这些记录的d_id字段必须没有在department表中出现过。

mysql>
mysql> select * from employee
    -> where d_id NOT IN
    -> (select d_id from department );
+------+------+------+------+------+----------+
| num  | d_id | name | age  | sex  | homeaddr |
+------+------+------+------+------+----------+
|    4 | 1004 | Aric |   15 | 男   | England  |
+------+------+------+------+------+----------+
1 row in set (0.00 sec)

mysql>

2.2 带比较运算符的子查询

  子查询可以使用比较运算符(=,!=,>,<,>=,<=,<>)等

示例数据表

mysql> select * from computer_stu,scholarship;
+------+------+-------+-------+-------+
| id   | name | score | level | score |
+------+------+-------+-------+-------+
| 1001 | Lily |    85 |     1 |    90 |
| 1001 | Lily |    85 |     2 |    80 |
| 1001 | Lily |    85 |     3 |    70 |
| 1002 | Tom  |    91 |     1 |    90 |
| 1002 | Tom  |    91 |     2 |    80 |
| 1002 | Tom  |    91 |     3 |    70 |
| 1003 | Jim  |    87 |     1 |    90 |
| 1003 | Jim  |    87 |     2 |    80 |
| 1003 | Jim  |    87 |     3 |    70 |
| 1004 | Aric |    77 |     1 |    90 |
| 1004 | Aric |    77 |     2 |    80 |
| 1004 | Aric |    77 |     3 |    70 |
| 1005 | Lucy |    65 |     1 |    90 |
| 1005 | Lucy |    65 |     2 |    80 |
| 1005 | Lucy |    65 |     3 |    70 |
| 1006 | Andy |    99 |     1 |    90 |
| 1006 | Andy |    99 |     2 |    80 |
| 1006 | Andy |    99 |     3 |    70 |
| 1007 | Ada  |    85 |     1 |    90 |
| 1007 | Ada  |    85 |     2 |    80 |
| 1007 | Ada  |    85 |     3 |    70 |
| 1008 | Jeck |    70 |     1 |    90 |
| 1008 | Jeck |    70 |     2 |    80 |
| 1008 | Jeck |    70 |     3 |    70 |
+------+------+-------+-------+-------+
24 rows in set (0.00 sec)

mysql>

从computer_stu表中查询获得一等奖学金的学生的学号,姓名和分数

mysql>
mysql> select id,name,score from computer_stu where score >= (select score from scholarship where level=1);
+------+------+-------+
| id   | name | score |
+------+------+-------+
| 1002 | Tom  |    91 |
| 1006 | Andy |    99 |
+------+------+-------+
2 rows in set (0.00 sec)

mysql>

在department表中查询那些部门没有年龄为24岁的员工;

mysql>  select d_id,d_name from department
    -> where d_id NOT IN
    -> (select d_id from employee where age=24);
+------+-----------+
| d_id | d_name    |
+------+-----------+
| 1003 | 销售部    |
+------+-----------+
1 row in set (0.00 sec)

mysql>

2.3 带EXISTS 关键字的子查询

  EXISTS关键字表示存在,使用EXISTS关键字时,内层查询不会反悔查询记录,而是返回一个真假值,当返回真是外层查询语句进行查询,当返回假时,外层语句不进行查询或者查询 不出任何结果。

例:如果department表中存在d_id取值为1003的记录,则查询employee表的记录:

mysql>
mysql> select * from employee
    -> where EXISTS
    -> (select d_name from department where d_id =1003)
    -> ;
+------+------+--------+------+------+--------------------+
| num  | d_id | name   | age  | sex  | homeaddr           |
+------+------+--------+------+------+--------------------+
|    1 | 1001 | 张三   |   26 | 男   | 北京市海定区       |
|    2 | 1002 | 李四   |   24 | 女   | 北京市昌平区       |
|    3 | 1001 | 王五   |   24 | 男   | 湖南长沙市         |
|    4 | 1004 | Aric   |   15 | 男   | England            |
+------+------+--------+------+------+--------------------+
4 rows in set (0.00 sec)

mysql>

  

例:如果department表中存在d_id取值为1004的记录,则查询emloyee表的记录;

mysql>
mysql> select * from employee
    -> where EXISTS
    -> (select d_name from department where d_id=0);
Empty set (0.00 sec)

mysql>

例:如果department表中存在d_id取值为1003的记录,则查询employee表中age大于24的记录;

mysql>
mysql> select * from employee where age>24 and EXISTS
    -> (select d_name from department where d_id=1003);
+------+------+--------+------+------+--------------------+
| num  | d_id | name   | age  | sex  | homeaddr           |
+------+------+--------+------+------+--------------------+
|    1 | 1001 | 张三   |   26 | 男   | 北京市海定区       |
+------+------+--------+------+------+--------------------+
1 row in set (0.00 sec)

mysql>

2.4 带ANY关键字的子查询

  ANY关键字表示满足其中任一条件,使用ANY关键字时,是要满足内层查询语句返回的结果中的任何一个,就可以通过该条件来执行外层查询语句。

例:查询到底哪位同学能获得奖学金:

mysql>
mysql>  select * from computer_stu where score >= ANY
    -> (select score from scholarship);
+------+------+-------+
| id   | name | score |
+------+------+-------+
| 1001 | Lily |    85 |
| 1002 | Tom  |    91 |
| 1003 | Jim  |    87 |
| 1004 | Aric |    77 |
| 1006 | Andy |    99 |
| 1007 | Ada  |    85 |
| 1008 | Jeck |    70 |
+------+------+-------+
7 rows in set (0.00 sec)

mysql>

2.5 带ALL关键字的子查询

  ALL关键字表示满足所有条件,使用ALL关键字时,只有满足内层查询语句返回的所有结果,才可以执行外层查询语句。

例:从computer_stu表中查询出那些同学可以获得一等奖学金;

mysql>
mysql> select * from computer_stu
    -> where score >= ALL
    -> (select score from scholarship);
+------+------+-------+
| id   | name | score |
+------+------+-------+
| 1002 | Tom  |    91 |
| 1006 | Andy |    99 |
+------+------+-------+
2 rows in set (0.00 sec)

mysql>

  

注:ANY关键字和ALL关键字的使用方式是一样的,但是俩这有很大的区别,使用ANY关键字时,只要满足内层查询语句返回的结果中的任何一个,就可以通过该条件来执行外层查询语句,而ALL关键字刚好相反,只有满足内层查询语句返回的所有结果,才可以执行外层查询语句。

附:合并查询结果(具有去重功能)

  合并查询结果是将多个select语句的查询结果合并在一起,因某种情况下,需要将几个select语句查询出来的结果合并起来显示,例如现在需要查询公司甲和公司乙这俩个公司所有的员工信息,然后将俩次的查询结果合并到一起,进行合并操作使用 UNION和UNION ALL关键字。

格式:select 语句1

    UNION |  UNION ALL

   select  语句2

    UNION |  UNION ALL

  …………

例:从department表和employee表中查询d_id字段的取值,然后通过UNION关键字将结果合并到一起。

mysql>
mysql>
mysql> select d_id from department
    -> UNION
    -> select d_id from employee;
+------+
| d_id |
+------+
| 1001 |
| 1002 |
| 1003 |
| 1004 |
+------+
4 rows in set (0.00 sec)

mysql>

  

时间: 2024-08-02 02:51:33

MySQL学习——SQL查询语句(连接查询&子查询)(三)的相关文章

MYSQL 学习笔记记录整理之三:子查询

1.利用子查询进行过滤 eg:假如需要列出订购物品TNT2的所有客户,具体步骤: 检索包含物品TNT2的所有订单编号 检索具有前一步骤列出的订单编号的所有客户的ID 检索前一步骤返回的所有客户ID的客户信息 上述每个步骤都可以单独作为一个查询来执行,可以把一条SELECT语句返回的结果用于另一条SELECT语句的WHERE语句.也可以使用子查询把3个查询组合成一条语句. select order_num FROM orderitems WHERE prod_id='TNT2'; 输出结果为: o

走向面试之经典的数据库基础:二、SQL进阶之case、子查询、分页、join与视图

一.CASE的两种用法 1.1 等值判断->相当于switch case (1)具体用法模板: CASE expression WHEN value1 THEN returnvalue1 WHEN value2 THEN returnvalue2 WHEN value3 THEN returnvalue3  ELSE defaultreturnvalue END (2)具体使用示例: 假设我们有一个论坛网站,其中有一张User表{ UId,Name,Level },Level是一个int类型,代

SQL主外键和子查询

主键 数据库主键是指表中一个列或列的组合,其值能唯一地标识表中的每一行.这样的一列或多列称为表的主键,通过它可强制表的实体完整性.当创建或更改表时可通过定义 PRIMARY KEY约束来创建主键.一个表只能有一个 PRIMARY KEY 约束,而且 PRIMARY KEY 约束中的列不能接受空值.由于 PRIMARY KEY 约束确保唯一数据,所以经常用来定义标识列. 主键的作用 主键的主要作用如下: (1)保证实体的完整性: (2)加快数据库的操作速度: (3) 在表中添加新记录时,数据库会自

MySQL数据库学习笔记(六)----MySQL多表查询之外键、表连接、子查询、索引

注:本文转自:http://www.cnblogs.com/smyhvae/p/4042303.html 本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, 外键可以有重复的, 可以是空值,用来和其他表建立联系用的.所以说,如果谈到了外键,一定是至少涉及到两张表.例如下面这两张表: 上面有两

sql的基础语句-单行函数,dual,数字函数,日期函数,表连接,集合运算,分组报表,单行子查询,多行子查询

3. 单行函数 3.1 转换函数 select ascii('A'),chr(65) from dual; select to_char(1243123),1231451 from dual;靠左边的就是字符串,靠右边的就是数字 select to_char(123512a121) from dual;   --错误的写法,没有引号表示数字,但是数字里面包含了字母,不合法的输入值 select to_number('123141211') from dual; select to_number(

MySQL多表查询之外键、表连接、子查询、索引

一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, 外键可以有重复的, 可以是空值,用来和其他表建立联系用的.所以说,如果谈到了外键,一定是至少涉及到两张表.例如下面这两张表: 上面有两张表:部门表(dept).员工表(emp).Id=Dept_id,而Dept_id就是员工表中的外键:因为员工表中的员工需要知道自己属于哪个部门,就可以通过外键Dep

在 SQL Server 数据库的 WHERE 语句中使用子查询

这是关于子查询语句的一系列文章中的第三篇.在这篇文章中我们将讨论WHERE语句中的子查询语句.其他的文章讨论了其他语句中的子查询语句. 本次课程中的所有例子都是基于Microsoft SQL Server Management Studio和AdventureWorks2012数据库的.读者可以阅读我的SQL Server使用入门学习使用这些免费的工具. 在WHERE语句中使用子查询 在WHERE语句中使用子查询是非常常见的.常见的用法是用EXISTS或IN测试存在性.在某些情况下重新考虑查询语

Mysql高手系列 - 第12篇:子查询详解

这是Mysql系列第12篇. 环境:mysql5.7.25,cmd命令中进行演示. 本章节非常重要. 子查询 出现在select语句中的select语句,称为子查询或内查询. 外部的select查询语句,称为主查询或外查询. 子查询分类 按结果集的行列数不同分为4种 标量子查询(结果集只有一行一列) 列子查询(结果集只有一列多行) 行子查询(结果集有一行多列) 表子查询(结果集一般为多行多列) 按子查询出现在主查询中的不同位置分 select后面:仅仅支持标量子查询. from后面:支持表子查询

MySQL数据库基础(四)(子查询与链接)(持续更新中)

1.子查询简介 其中,所谓的"外层查询"并不是指"查找",指的是所有SQL语句的统称:结构化查询语言(Structured Query Language),简称SQL. : 2.由比较运算符引发的子查询             注意:当子查询返回多个结果的时候,可以用ANY.SOME.ALL修饰,ANY.SOME是等价的:符合返回结果中的一个即可:ALL:符合全部结果.