`
andrew1024
  • 浏览: 71468 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

MYSQL 教程: 高级查询

阅读更多


查找出员工及其部门名

mysql> select employee.name as employeeName, department.name as departmentName from employee, department where employee.departmentID = department.departmentID;

+---------------+--------------------------+

| employeeName  | departmentName           |

+---------------+--------------------------+

| Nora Edwards  | Research and Development |

| Ben Smith     | Finance                  |

| Ajay Patel    | Research and Development |

| Candy Burnett | Research and Development |

+---------------+--------------------------+

4 rows in set (0.02 sec)

实际查询的过程如下:

首先找出所有连接:

+---------------+--------------------------+

| name          | name                     |

+---------------+--------------------------+

| Ajay Patel    | Finance                  |

| Nora Edwards  | Finance                  |

| Candy Burnett | Finance                  |

| Ben Smith     | Finance                  |

| Ajay Patel    | Research and Development |

| Nora Edwards  | Research and Development |

| Candy Burnett | Research and Development |

| Ben Smith     | Research and Development |

| Ajay Patel    | Human Resources          |

| Nora Edwards  | Human Resources          |

| Candy Burnett | Human Resources          |

| Ben Smith     | Human Resources          |

| Ajay Patel    | Marketing                |

| Nora Edwards  | Marketing                |

| Candy Burnett | Marketing                |

| Ben Smith     | Marketing                |

+---------------+--------------------------+



               这个查询叫做Cartesian product,笛卡尔集

        两个列名是一样的,为了改进可读性,可以修改如下:

select employee.name as employeeName, department.name as departmentName

from employee, department

where employee.departmentID = department.departmentID;





多个表之间的查询:n个表需要n-1个表达式.

比如查询哪个部门有和Telco Inc相关的业务.

mysql> select department.name from client, assignment, employee, department where client.name='Telco Inc' and client.clientID = assignment.clientID and assignment.employeeID = employee.employeeID and employee.departmentID = department.departmentID;

+--------------------------+

| name                     |

+--------------------------+

| Research and Development |

+--------------------------+

1 row in set (0.00 sec)





自连接

查找和'Nora Edwards'在部门工作的所有员工:

mysql> select e2.name from employee e1, employee e2 where e1.name = 'Nora Edwards' and e1.departmentID = e2.departmentID;

+---------------+

| name          |

+---------------+

| Ajay Patel    |

| Nora Edwards  |

| Candy Burnett |

+---------------+

3 rows in set (0.00 sec)



排除掉'Nora Edwards'的查询方法

select e2.name

from employee e1, employee e2

where e1.name = 'Nora Edwards'

and e1.departmentID = e2.departmentID

and e2.name != 'Nora Edwards';

§7.2  理解不同的连接类型

*基本连接类型

笛卡尔连接又成为全连接,交叉连接,如果添加了条件则是对等连接.

如下查询:

select employee.name, department.name

from employee, department

where employee.departmentID = department.departmentID;



可以用

select employee.name, department.name

from employee join department

where employee.departmentID = department.departmentID;

替代. 也可以用CROSS JOIN or INNER JOIN 代替上面的join



*左连接和右连接



左连接,右连接对应于左右边为空的部分,如下查出没有接任务的雇员.



mysql> select * from employee;

+------------+---------------+-----------------------+--------------+

| employeeID | name          | job                   | departmentID |

+------------+---------------+-----------------------+--------------+

|       6651 | Ajay Patel    | Programmer            |          128 |

|       7513 | Nora Edwards  | Programmer            |          128 |

|       9006 | Candy Burnett | Systems Administrator |          128 |

|       9842 | Ben Smith     | DBA                   |           42 |

+------------+---------------+-----------------------+--------------+

4 rows in set (0.00 sec)



mysql> select * from assignment;

+----------+------------+------------+-------+

| clientID | employeeID | workdate   | hours |

+----------+------------+------------+-------+

|        1 |       7513 | 2003-01-20 |   8.5 |

+----------+------------+------------+-------+



mysql> select employee.name from employee left join assignment on employee.employeeID = assignment.employeeID where clientID is null;

+---------------+

| name          |

+---------------+

| Ben Smith     |

| Ajay Patel    |

| Candy Burnett |

+---------------+

3 rows in set (0.00 sec)



实际的运行过程是使用右边的来匹配左边的.如果左边和右边的有对应,则为相应的值,否则为null.因为clientID为key值,所以不会为空。


§7.3 书写子查询

子查询又称为嵌套查询,是MySQL 4.1新增的功能, 它并没有增加新功能,但是使用子查询比使用连接更有可读性.多表的删除和更新其实也是一种特殊的子查询.本节主要介绍select语句中的子查询.

MySQL有两种子查询:

导出表子查询和表达子式查询.前者的子查询返回一个表.后者出现于select语句中的where子句,分为两种类型.1,返回单个值或行.2,返回布尔值.



*导出表子查询

导出表子查询允许在from子句中嵌入其他查询.可以快速插入临时表,比如:



mysql> select employeeID, name from employee where job='Programmer';

+------------+--------------+

| employeeID | name         |

+------------+--------------+

|       6651 | Ajay Patel   |

|       7513 | Nora Edwards |

+------------+--------------+







*     单值子查询

出现在where子句中:

mysql> select e.employeeID, e.name from employee e, assignment a where e.employeeID = a.employeeID and a.hours = (select max(hours) from assignment);

+------------+--------------+

| employeeID | name         |

+------------+--------------+

|       7513 | Nora Edwards |

+------------+--------------+

1 row in set (0.00 sec)

当然也可以返回一行,但是用处不大,不再讲述.



*     布尔子查询



布尔子查询一般是针对特殊功能,比如: IN, EXISTS, ALL, ANY, and SOME.

以下查询没有活干的员工.

mysql> select name from employee where employeeID not in       (select employeeID        from assignment);

+---------------+

| name          |

+---------------+

| Ben Smith     |

| Ajay Patel    |

| Candy Burnett |

+---------------+

3 rows in set (0.00 sec)



       EXISTS在子查询种使用了主查询的数据,又成为关联查询。如下查询没有任务的员工。

mysql> select e.name, e.employeeID from employee e where not exists           (select *            from assignment            where employeeID = e.employeeID);

+---------------+------------+

| name          | employeeID |

+---------------+------------+

| Ben Smith     |       9842 |

| Ajay Patel    |       6651 |

| Candy Burnett |       9006 |

+---------------+------------+

3 rows in set (0.00 sec)



       查询过程: 针对employee中的每一行,在子查询中查看是否都不匹配。

ALL, ANY, and SOME

select e.name

from employee e, assignment a

where e.employeeID = a.employeeID

and a.hours > all

         (select a.hours

         from assignment a, employee e

         where e.employeeID = a.employeeID

         and e.job='Programmer');

这部分还有待理解。

SELECT 的语法请参考教材。
分享到:
评论

相关推荐

    尚硅谷MySQL全套教程包含MySql核心技术篇和MySQL高级篇

    MYSQL教程 MYSQL教程MYSQL教程 MYSQL教程尚硅谷MySQL全套教程包含MySql核心技术篇和MySQL高级篇。数据库视频教程,全套视频教程。

    2021年MySQL高级教程视频.rar

    05.MySQL高级查询缓存开启查询缓存.avi 06.MySQL高级查询缓存SELECT选项.avi 07.MySQL高级查询缓存失效场景.avi 08.MySQL高级内存优化优化原则.avi 09.MySQL高级内存优化MyISAM内存优化.avi 10.MySQL高级内存优化...

    mysql高级教程

    mysql高级教程

    尚硅谷Java视频教程_MySQL高级视频

    尚硅谷_MySQL高级_慢查询日志 · 50.尚硅谷_MySQL高级_批量插入数据脚本 · 51.尚硅谷_MySQL高级_用Show Profile进行sql分析 · 52.尚硅谷_MySQL高级_全局查询日志 · 53.尚硅谷_MySQL高级_数据库锁理论概述 ·...

    mysql高级视频教程百度云(2019).txt

    52.MySQL高级_全局查询日志.avi 51.MySQL高级_用Show Profile进行sql分析.avi 50.MySQL高级_批量插入数据脚本.avi 49.MySQL高级_慢查询日志.avi 48.MySQL高级_为排序使用索引OrderBy优化.avi 47.MySQL...

    布尔教育Mysql高级视频教程(更新中)

    教程名称:布尔教育Mysql高级视频教程(更新中)课程目录:【】Mysql高级.001.理解触发器【】Mysql高级.002.动手写第1个触发器【】Mysql高级.003.触发器中引用行变量【】Mysql高级.004.再谈行变量【】Mysql高级.005....

    MYSQL高级注入教程

    MYSQL 高级注入 教程 渗透教程 第一课 MYSQL基础教学I 第二课 MYSQL基础教学II 第三课 MYSQL基础教学III 第四课 手工注入-联合查询篇 第五课 手工注入-MYSQL5.0暴库 第六课 手工注入-MYSQL注入高级技巧

    2018最新Mysql高级视频教程

    随着淘宝去IOE(去除IBM小型机、Oracle数据库及EMC存储设备)化的推进,MySQL 数据库在当前的互联网应用中变得越来越重要,本教程主要讲授针对 Java 开发所需的 MySQL 高级知识,课程中会让大家快速掌握索引,如何避免...

    数据库 MySQL 学习笔记高级篇.md

    数据库 MySQL 学习笔记高级篇.md

    MySQL初级与高级教程

    非常好的MySQL初级与高级教程-来自谷粒

    MySQL高级视频教程

    手把手视频详细讲解项目开发全过程,需要的小伙伴自行百度网盘下载,...通过学习函数,掌握在mysql中自定义函数,扩展mysql功能 学习存储过程,轻松封装代码块,提高开发效率; 掌握触发器,丰富功能,减少代码量。

    MySQL高级教程视频.zip

    16.存储过程 - 创建调用查询删除语法 17.存储过程 - 语法 - 变量 18.存储过程 - 语法 - if判断 19.存储过程 - 语法 - 输入参数 20.存储过程 - 语法 - 输出参数 21.存储过程 - 语法 - case结构 22.存储过程 - 语法 - ...

    MySQL高级教程视频

    MySQL 高级 - 课程内容介绍.mp4 │ │ 02. MySQL 高级 - Linux上安装MySQL.avi │ │ 03. MySQL 高级 - 启动及登录MySQL.avi │ │ 04. MySQL 高级 - 索引 - 概述.avi │ │ 05. MySQL 高级 - 索引 - 优势和劣势....

    MySQL高级技术-视频教程

    MySQL是当今互联公司主流的数据库,这套经典的MySQL高级技术课件学习完成后,掌握MySQL,使用MySQL高级技术,驰骋于职场。

    完整版 MySQL8.0从入门到精通 MySQL数据库教程 全套PPT课件资源集合 共26个章节 含全部源代码.rar

    完整版 MySQL8.0从入门到精通 MySQL数据库教程 第07章 查询数据(共50页).ppt 完整版 MySQL8.0从入门到精通 MySQL数据库教程 第08章 插入、更新与删除数据(共12页).ppt 完整版 MySQL8.0从入门到精通 MySQL数据库...

    mysql 高级查询视频教程.txt

    快速掌握mysql 高级查询,sql语句优化教程资源

    MySQL学习笔记2-高级查询与存储.md

    内容概要: 本文首先介绍了MySQL中的几种高级查询方法,包括子查询、联结、聚合函数、排序和限制等,并给出了示例代码。然后重点讲解了MySQL存储过程的创建、...本文内容详实 systemic,非常适合作为MySQL高级教程使用。

    大牛-高级教程MySQL性能优化实战

    大牛-高级教程MySQL性能优化实战。

    MySQL数据库入门到高级笔记快速学习pdf版本

    这是博主自己写的三篇MySQL文章的综合pdf版本,干货满满,同时搭配脑图提高效率,从基础知识,比如对数据库的操作,对数据表的增删改,查单独写了一篇文章从单表到多表,子查询等等,干货满满,最后就是高级部分了,...

Global site tag (gtag.js) - Google Analytics