SQL DML语言之 SELECT 复杂查询

本文解析SQL的复杂查询包括:

一、模糊查询             二、排序查询三、等值和非等值查询      四、内连接查询

以下举例所用表

employees表:字段如下

employee_id, first_name, last_name, email, phone_number

job_id, salary, commission_pct, manage_id, department_id

一、模糊查询

1、 like

<1> 通配符: % 任意多个字符(包含0个字符);

<2> _任意单个字符

案例:

/*//查询 last_name 以 ‘k’开头的员工信息SELECT * FROM employees WHERE last_name LIKE 'k%'//查询 last_name 以 ‘King’开头的员工信息
SELECT * FROM employees WHERE last_name LIKE 'King%'/*

//查询第五位为c的名字

SELECT * FROM employees
WHERE last_name LIKE '____c%';

//查询第五位或第三为为c的名字

SELECT * FROM employees
WHERE last_name LIKE '____c%' OR last_name LIKE '__c%';

//查询 姓名 中 第4个字符为_,第5个字符为c的信息

SELECT * FROM employees
WHERE last_name LIKE '___$_c%' ESCAPE '$';

2、 between and 查询条件为某个区间

语法:

between 值 and 值  在某个连续的区间,包含边界值注意: 判断的类型  是  数值型(整数和小数)

案例:工资在8000-10000

SELECT * FROM employees
WHERE salary BETWEEN 8000 AND 10000;//效果等同于
SELECT * FROM employees WHERE salary>=8000 AND salary<=10000;注意:(两个区间值的位置不可写错)
错误的写法★★★
SELECT * FROM employees
WHERE salary BETWEEN 10000 AND 8000;

3、 in (值,值,值)

在某个 不连续的范围之内只要有一个满足即可注:  值的类型 可以为任意类型

案例:

职位 是 IT_PROG, PU_MAN,SA_MAN的员工信息

SELECT * FROM employees WHERE job_id IN('IT_PROG','PU_MAN','SA_MAN');//等效与如下:
SELECT * FROM employees
WHERE job_id='IT_PROG' OR job_id='PU_MAN' OR job_id='SA_MAN'//查询字段depa_id 为30 或 50
SELECT * FROM employees
WHERE department_id IN(30,50);

4 is null

//查询奖金率 为null的姓名

SELECT last_name,commission_pct FROM employees
WHERE commission_pct IS NULL;

//查询奖金率 不为null的姓名

SELECT last_name,commission_pct FROM employees
WHERE NOT( commission_pct IS NULL);
或
SELECT last_name,commission_pct FROM employees WHERE commission_pct IS  NOT NULL;

二、排序查询

1、关键字: order by 排序 的字段名 [asc/desc]

注意:order by子句一般要放在查询语句最后,除了分页查询

2、可以按 字段名、表达式、别名排序

3、按指定的单个字段进行排序

语法:按工资升序

SELECT * FROM employees ORDER BY salary;-- 默认升序SELECT * FROM employees ORDER BY salary ASC;-- asc 代表升序SELECT * FROM employees ORDER BY salary DESC;-- desc 代表降序

示例:

查询 部门编号为80 的 工资、姓名 、部门编号,同时按 薪水 升序

SELECT salary,last_name,department_id
FROM employees
WHERE department_id = 80
ORDER BY salary ASC;

查询 职位在it_prog或fi_account 的员工编号、员工姓名、年薪,同时按 年薪降序

//如果没有奖金率返回0.00
SELECT commission_pct,IFNULL(commission_pct,0) FROM employees;//如果没有奖金率为空返回1
SELECT commission_pct,ISNULL(commission_pct) FROM employees;//所以实现如下:
SELECT employee_id,last_name,salary*12*(1+IFNULL(commission_pct,0)) 年薪
FROM employees
WHERE job_id IN('IT_PROT','FI_ACCOUNT')
ORDER BY 年薪 DESC;

4、多列排序

先按第一个字段排序,如果第一个字段的值相同,则按第二个字段排序,依次类推

SELECT * FROM employees ORDER BY salary ,last_name DESC;

三、等值查询和非等值查询

描述:

连接查询: 要查询的数据来自于多个表

1、笛卡尔集的出现

原因:

没有有效的连接条件,最终的结果集行数为  两个表的行数乘积
执行过程:依次取第一个表的一条记录与第二个表的每一条记录产生关系
解决办法:添加有效的连接条件# 案例:查询 员工姓名、部门名称(各在一个表)
SELECT last_name,department_name
FROM employees,departments#查看每个表中的行数SELECT COUNT(*) FROM employees; //107SELECT COUNT(*) FROM departments; //27SELECT COUNT(*) ,
FROM employees,departments //107*27

2.等值——非等值
2-1 等值连接

两表连接:

/*语法:select 列名,列名 from 表1 别名,表2 别名where 表1的别名.字段=表2的别名.字段注意:<1>为表加上别名为了更有效的区分,以及语法简单<2>如果查询的字段为某两表共有则应该用表名.字段名标识
*/

案例:查询 员工姓名、部门名称

SELECT e.last_name,d.department_name,e.department_id
FROM employees e,departments d
WHERE e.department_id=d.department_id;

案例: 查询员工编号、员工当前工资、职位名称,职位的最高工资

SELECT employee_id,salary,job_title,max_salary
FROM employees e,jobs j
WHERE e.job_id = j.job_id;

三表连接

案例:查询员工的姓名、部门名、部门所在城市

SELECT last_name,department_name,city
FROM employees e,departments d,locations l
WHERE e.department_id = d.department_id
AND d.location_id = l.location_id;

3、非等值连接

判断条件不是一个固定的值而是一个范围

案例: 查询员工的姓名、编号以及工资级别

/*1、要查询的员工姓名、编号来自employees表工资级别grade_level 来自于 job_grades表如:lowest_sal=1000   highest_sal=2999 级别为Alowest_sal=3000   highest_sal=5999 级别为B
*/SELECT last_name,employee_id,salary,grade_levelFROM employees e,job_grades gWHERE e.`salary` BETWEEN g.`lowest_sal` AND g.`highest_sal`;

四、内连接——外连接

(一)、内连接

1、sql99 语法(sql1999 )

JOIN…ON

inner join 表 on条件 内连接(inner可以省略)

outer join 表 on 条件 外连接(outer可以省略)

left outer join 表 on 条件  左外连接
right outer join 表 on 条件  右外连接

2、内连特性

1.效果 等价于 等值连接
2.join左右两个表的位置没有顺序关系
3.为表起别名
4. 查询结果为  多表 关系列的值相等的,也就是匹配的结果

2-1两表连接

案例:查询 员工姓名、部门名称

SELECT last_name,department_name
FROM departments d
INNER JOIN employees e
ON e.`department_id` = d.`department_id`

2-2三表连接

n个表连接,需要n-1个连接条件

案例: 查询 员工姓名、部门名称、部门所在的城市,

SELECT last_name,department_name,city
FROM employees e
INNER JOIN departments d ON e.`department_id`= d.department_id
INNER JOIN locations l ON d.location_id = l.location_id

案例: 查询部门所在城市 中包含 ‘s’的 员工姓名、部门名称、部门所在的城市,

SELECT last_name,department_name,city
FROM employees e
INNER JOIN departments d ON e.`department_id`= d.department_id
INNER JOIN locations l ON d.location_id = l.location_id
WHERE city  LIKE '%s%';

(二)外连接

/*1.查询出 多个表中匹配的数据以及 不匹配的数据作用:看匹配后主表对应的从表哪些不存在A: 1 2 3 4, B: 3 4 5 6  外联:  左外 1 2 3 4 或  右外 3 4 5 6   全外连:1 2 3 4 5 6(mysql不支持)2、左外:★★join 左边的表是主表,
查询的结果: 主表的全部=交集+主表有而从表没有(null)3、右外:★★join 右边的表是主表,
查询的结果: 主表的全部=交集+主表有而从表没有(null)4、左右两表换位置后影响效果(会改变主表)full join on 全外连接(Mysql不支持)
*/

1、左外连接

案例:查询 员工编号,员工名,部门名

SELECT employee_id,last_name,department_name,d.`department_id`
FROM departments d
LEFT OUTER JOIN employees e ON e.`department_id`=d.`department_id`SELECT * FROM departments;
/*
delete from employees where department_id = 30;*/

案例:使用左连接 哪个部门没有员工

SELECT employee_id,department_name,d.`department_id`
FROM departments d
LEFT OUTER JOIN employees e ON e.`department_id`=d.`department_id`
WHERE employee_id IS NULL;

2、右外连接

案例:查询 员工编号,员工名,部门名

//departments 为主表 主要看departments表与employees连接的多余数据中对应employees的记录中哪些为空
SELECT employee_id,last_name,department_name,d.`department_id`
FROM employees e
RIGHT OUTER JOIN departments d ON e.`department_id`=d.`department_id`

SQL SELECT(复杂查询) 之 等值查询 内外连接相关推荐

  1. SQL SELECT INTO语句

    This article will cover the SQL SELECT INTO statement including syntax, parameters and use with mult ...

  2. 【数据库和SQL学习笔记】6.SELECT查询4:嵌套查询、对查询结果进行操作

    数据库系统软件:SQL Server 2019 Express 操作系统:Windows 10 文章目录 嵌套查询 IN 与 NOT IN EXISTS 与 NOT EXISTS 比较运算符 SOME ...

  3. mysql select内部原理_数据库SQL SELECT查询的工作原理

    作为Web开发人员,虽并非专业的DBA,但我们总是离不开数据库.一般开发员只会应用SQL的四条经典语句:select,insert,delete,update.以至于从来没有研究过它们的工作原理,在这 ...

  4. 学数据库还不会Select,SQL Select详解,单表查询完全解析?

    查询操作是SQL语言中很重要的操作,我们今天就来详细的学习一下. 一.数据查询的语句格式 SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式> .. ...

  5. SQL select查询原理--查询语句执行原则转

    1.单表查询:根据WHERE条件过滤表中的记录,形成中间表(这个中间表对用户是不可见的):然后根据SELECT的选择列选择相应的列进行返回最终结果. 1)简单的单表查询 SELECT 字段  FROM ...

  6. exists sql用法_彻底弄懂sql select各种查询用法

    相信很多人和我一样,学习sql 就是记忆各种sql的语法,但是记了一大堆的语法,在遇到实际查询问题时又无从下手的感觉.本文主要是针对sql 中select用法的总结,用于帮助大家解决记了相关语法却不知 ...

  7. 数据库作业:SQL练习4 - SELECT(连接查询、嵌套查询)

    学习了连接查询和嵌套查询. 今天启动SQL server,显示无法连接到服务器,重新打开软件还是一样,后来通过搜索重新启动了SQL server的服务,就可以了. 此电脑右键-管理-展开服务与应用程序 ...

  8. mysql hash索引 btree索引_HASH索引做等值查询会很快,BTree索引做范围查询比较快...

    Oracle: 数据文件包括:控制文件.数据文件.重做日志文件.参数文件.归档文件.密码文件.这是根据文件功能行进行划分,并且所有文件都是二进制编码后的文件,对数据库算法效率有极大的提高.由于Orac ...

  9. server多笔记录拼接字符串 sql_第四章、SQL Server数据库查询大全(单表查询、多表连接查询、嵌套查询、关联子查询、拼sql字符串的查询、交叉查询)...

    4.1.查询的类型 declare @value as int set @value = 50 select  'age:'as age,2008 years,@valueas va --这种查询时跟 ...

最新文章

  1. 学python需要学数据库吗-Python学什么数据库
  2. 自己写的程序发给别人老是会出现缺失各种库,而自己电脑运行却没毛病
  3. Linq to Sql : 动态构造Expression进行动态查询
  4. C++(十)——模板(上)
  5. 锐炬显卡可以linux吗,Intel Broadwell桌面CPU性能测试:Iris Pro 6200核显无敌了
  6. 以太网实习_从最初有从事IT的想法,到现在实习两个月的感受
  7. IDC:2017年中国网络安全市场分析与2018年预测
  8. java_version干什么的_java类中serialVersionUID的作用及其使用
  9. 手机modem开发(3)---Android Modem log分析
  10. apache隐藏版本信息及设置网页缓存
  11. 《学会提问——批判性思维指南》完整读书笔记
  12. 2022年危险化学品经营单位安全管理人员报名考试及危险化学品经营单位安全管理人员复审模拟考试
  13. oracle证件号脱敏,oracle 数据脱敏
  14. service now 接口进行GET、POST
  15. 用计算机开3次方,android系统计算器开3次方
  16. 行走的“摄影神器”三星Galaxy S21!五一出游必备
  17. 【动手学深度学习】(task123)注意力机制剖析
  18. 电容ESR表(一) 电容ESR表的特点、测量原理、电路分析
  19. supervisor 提示:xxx: ERROR (no such process)
  20. 三、elasticsearch 实际应用(碎片篇)

热门文章

  1. 目标检测网络之三叉戟TridentNet
  2. silhouette_matlab
  3. word文档内容联动
  4. 不知不觉openGL已经到4.5了
  5. 《海边的卡夫卡》读书笔记
  6. 详细记录丨公众号如何通过迁移开通留言功能?
  7. 分享给你一份温暖,如冬日暖阳亦或是一杯午后的咖啡
  8. 【编程语言选择】我们学C++将来能做什么?
  9. 计算机 无法进入pe,无法进入老毛桃pe系统解决办法[推荐]
  10. 树莓派模拟量输入范围_模拟量输入值超过了em235的量程范围,可以吗?-工业支持中心-西门子中国...