IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> MySQL学习笔记(B站网课:MySQL_基础+高级篇- 数据库 -sql -mysql教程_mysql视频_mysql入门_尚硅谷)未完结不定时补充 -> 正文阅读

[大数据]MySQL学习笔记(B站网课:MySQL_基础+高级篇- 数据库 -sql -mysql教程_mysql视频_mysql入门_尚硅谷)未完结不定时补充

???????? 一、为什么要学习数据库

???????? 二、数据库的相关概念

????????????????? DBMS、DB、SQL

???????? 三、数据库存储数据的特点

???????? 四、初始MySQL

????????????????? MySQL产品的介绍

????????????????? MySQL产品的安装★

????????????????? MySQL服务的启动和停止★

????????????????? MySQL服务的登录和退出★

????????????????? MySQL的常见命令和语法规范

???????? 五、DQL语言的学习★

????????????????? 基础查询★

????????????????? 条件查询★

????????????????? 排序查询★

????????????????? 常见函数★

????????????????? 分组查询★

????????????????? 连接查询★

????????????????? 子查询√

????????????????? 分页查询★

????????????????? union联合查询√

???????? 六、DML语言的学习★????????????

????????????????? 插入语句???????????????????????????????????????????????????

????????????????? 修改语句???????????????????????????????????????????????????

????????????????? 删除语句???????????????????????????????????????????????????

???????? 七、DDL语言的学习

????????????????? 库和表的管理√

????????????????? 常见数据类型介绍√

????????????????? 常见约束√

???????? 八、TCL语言的学习

????????????????? 事务和事务处理

???????? 九、视图的讲解√

???????? 十、变量

???????? 十一、存储过程和函数

???????? 十二、流程控制结构

###数据库的好处

???????? 1.持久化数据到本地

???????? 2.可以实现结构化查询,方便管理

????????

###数据库相关概念

???????? 1.DB:数据库,保存一组有组织的数据的容器

???????? 2.DBMS:数据库管理系统,又称为数据库软件(产品),用于管理DB中的数据

???????? 3.SQL:结构化查询语言,用于和DBMS通信的语言

###数据库存储数据的特点

???????? 1.将数据放到表中,表再放到库中

???????? 2.一个数据库中可以有多个表,每个表都有一个的名字,用来标识自己。表名具有唯一性。

???????? 3.表具有一些特性,这些特性定义了数据在表中如何存储,类似java中 “类”的设计。

???????? 4.表由列组成,我们也称为字段。所有表都是由一个或多个列组成的,每一列类似java 中的“属性”。

???????? 5.表中的数据是按行存储的,每一行类似于java中的“对象”。

###常见的DBMS:MySQL、Oracle、DB2、SqlServer

Oracle:贵

DB2:适合处理大量数据

SqlServer:只能安装在windows操作系统下

###DBMS分为两类:

–基于共享文件系统的DBMS,如Access

–基于客户机——服务器的DBMS,如MySQLOracleSqlServer

(客户机服务器,简称C/S架构,C代表客户端,S代表服务端。MySQL使用时需要安装客户端和服务端。“安装数据库”一般指安装数据库的服务端。)

##MySQL产品的介绍和安装

##MySQL服务的启动和停止

???????? 方式一:计算机——右击管理——服务Windows管理工具——服务)

???????? 方式二:通过管理员身份运行cmd——以管理员身份运行)

???????? net start 服务名(启动服务)net start mysql

???????? net stop 服务名(停止服务)net stop mysql

##MySQL服务的登录和退出??

???????? 方式一:通过mysql自带的客户端(只限于root用户)

???????? 方式二:通过windows自带的客户端

登录:mysql -uroot -p123456

???????? mysql 【-h主机名 -P端口号 】-u用户名 -p密码(对于连接本机的端口号为3306的登录,【】中内容可以省略

若显示密码:mysql -h localhost -P 3306 -u root -p123456(注意:hlocalhost、P3306、uroot之间有无空格都可,但是p123456之间不能有空格,其中123456是账号root的密码)

若不想显示密码:mysql -h localhost -P 3306 -u root -p 按下回车键,再输入密码。

????????

退出:

???????? exit或快捷键ctrl+c(此方式只适合root用户)

##MySQL的常见命令

???????? 1.查看当前所有的数据库:show databases;

?共4个数据库,其中:

information_schema用于保存元数据信息

mysql用于保存用户信息

performance_schema搜集性能信息、性能参数

sys

前3个不能动

????????

2.打开指定的库:use 库名;

???????? 3.查看当前库的所有表:show tables;

???????? 4.查看其它库的所有表:show tables from 库名;

???????? ???????? use sys;

???????? ???????? show tables;

???????? ???????? show tables from mysql;(sys库中查看mysql库中所有的表

select database();(查看目前在哪个库,不要忘记()

???????? 5.创建表:

???????? ???????? create table 表名(

???????? ???????? ???????? 列名 列类型,

???????? ???????? ???????? 列名 列类型,

???????? ???????? ???????? …(最后一个字段不用加,

???????? ???????? );

???????? ???????? ?

???????? 6.查看表结构:desc 表名;

???????? 查看表数据:select * from 表名;

???????? 插入表数据:insert into 表名 (id,name) values(1,’john’);

???????? 修改表数据:update 表名 set name=’rose’ where id=1;

???????? 删除表数据:delete from 表名 where id=1;

???????? 7.查看服务器的版本

???????? 方式一:登录到mysql服务端:select version();

???????? 方式二:没有登录到mysql服务端:mysql --version或mysql --V

##MySQL的语法规范

???????? 1.不区分大小写,但建议关键字大写,表名、列名小写

???????? 2.每条命令最好用分号结尾

???????? 3.每条命令根据需要,可以进行缩进或换行

???????? 4.注释

????????????????? 单行注释:#注释文字

????????????????? 单行注释:-- 注释文字(注意--与文字之间有空格

????????????????? 多行注释:/* 注释文字? */

###SQL的语言分类

???????? DQL(Data Query Language):数据查询语言

????????????????? select

???????? DML(Data Manipulate Language):数据操作语言

????????????????? insert 、update、delete

???????? DDL(Data Define Languge):数据定义语言

????????????????? create、drop、alter

???????? TCL(Transaction Control Language):事务控制语言

????????????????? commit、rollback

执行sql脚本myemployees.sql,手动刷新。?

###DQL语言(数据查询语言)

##进阶1:基础查询

语法:SELECT 查询列表(要查询的东西可以有多个)【FROM 表名】;

???????? 特点:

通过select查询完的结果,是一个虚拟的表格,不是真实存在的;

查询列表可以是:表中的字段、常量值、表达式、字段、函数

##补充:

1.在做查询或一些操作之前,建议先打开/启用指定的库:use myemployees;

2.着重号`用以区分字段和关键字(左上角第2排第1个),如:?

3.要执行谁就选中谁,点击“执行查询”或者F9

4.不区分“字符”和“字符串”,没有“字符串”的概念,只要是字符,都用’’

???????? commission_pct(奖金率)字段中有null,因此利用ifnull函数:

ifnull (字段名,如果该字段为null想要返回的值)

##进阶2:条件查询

???????? 条件查询:根据条件过滤原始表的数据,查询到想要的数据

???????? 语法: select 查询列表 from 表名 where 筛选条件;

???????? 分类:

???????? 一、按条件表达式筛选

???????? 简单条件运算符: >? <? >= ?<= ?= ?!= ?<>(mysql中标准写法为<>,也支持!=)

???????? ???????? 案例1:查询工资大于12000员工信息

????????????????? select * from employees where salary>12000;

???????? ???????? 案例2:查询部门编号不等于90号的员工名和部门编号

????????????????? select last_name,department_id from employees where department_id <>90;

???????? 二、按逻辑表达式筛选

???????? 逻辑运算符:

???????? and(&&):两个条件同时成立,结果为true,否则为false

???????? or(||):两个条件只要有一个成立,结果为true,否则为false

???????? not(!):如果条件成立,则not后为false,否则为true

???????? ???????? 案例1:查询工资在10000到20000之间的员工名、工资和奖金

select last_name,salary,commission_pct

from employees

where salary>10000 and salary<20000;

???????? ???????? 案例2:查询部门编号不是在90到110之间,或者工资高于15000的员工信息

????????????????? select * from employees

????????????????? where department_id<90 or department_id>110 or salary>15000;

或者where not (department_id>=90 and department_id<=110) or salary>15000;

???????? 三、模糊查询

符号(较为复杂的条件运算符):

(一)like

特点:一般和通配符搭配使用

通配符:

①%:任意多个字符,包含0个字符

案例1:查询员工名中包含字符a的员工信息

SELECT * FROM employees WHERE last_name LIKE '%a%';(字符型的值必须用’’引起来)

②_:任意单个字符

案例2:查询员工名中第三个字符为e,第五个字符为a的员工信息

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

案例3:查询员工名中第二个字符为_的员工信息

SELECT * FROM employees WHERE last_name LIKE '_\_%';

SELECT * FROM employees WHERE last_name LIKE '_$_%' ESCAPE '$';(可随意指定转义字符,但要同时使用escape)

(二)between and

①提高语句的简洁度②包含临界值③两个临界值不要调换顺序

案例:查询员工编号在100到120之间的员工信息

SELECT * FROM employees WHERE employee_id >= 120 AND employee_id<=100;

SELECT * FROM employees WHERE employee_id BETWEEN 120 AND 100;

(三)in

含义:判断某字段的值是否属于in列表中的某一项

特点:

①提高语句简洁度

②in列表的值类型必须一致或兼容

in列表中不支持通配符

案例:查询工种编号是IT_PROG、AD_VP之一的员工名和工种编号

SELECT last_name,job_id FROM employees WHERE job_id = 'IT_PROT' OR job_id = 'AD_VP';

SELECT last_name,job_id FROM employees WHERE job_id IN( 'IT_PROT' ,'AD_VP');

(四)is null/is not null

=或<>不能用于判断null值,而is nullis not null可以判断null

案例1:查询没有奖金的员工名

SELECT last_name FROM employees WHERE commission_pct IS NULL;

案例1’:查询有奖金的员工名

SELECT last_name FROM employees WHERE commission_pct IS NOT NULL;

安全等于<=>(判断是否等于null值,也可以判断是否等于普通类型的值,可读性较差)

案例1’’:查询没有奖金的员工名

SELECT last_name FROM employees WHERE commission_pct <=> NULL;

案例2:查询工资为12000的员工信息

SELECT last_name,salary FROM employees WHERE salary <=> 12000;

is null和<=>比较:

IS NULL:仅仅可以判断NULL值,可读性较高,建议使用

<=>:既可以判断NULL值,又可以判断普通的数值,可读性较低

不一样,考虑null

若用and连接所有字段且字段不含null,结果一样,若有一个字段含有null,则结果不一样;

若用or连接所有字段,即使个别字段含有null,结果也同select *一样。

##进阶3:排序查询

???????? 语法:

???????? select 查询列表 from 表名 where 筛选条件 order by 排序列表 【asc|desc】

特点:

①asc代表升序,不写默认升序,desc代表降序

②order by子句可以支持 单个字段、别名、表达式、函数、多个字段

③order by子句在查询语句的最后面,除了limit子句

1.按单个字段排序

SELECT * FROM employees ORDER BY salary DESC;

2.添加筛选条件再排序

案例:查询部门编号>=90的员工信息,并按员工编号降序

SELECT * FROM employees WHERE department_id>=90 ORDER BY employee_id DESC;

3.按表达式排序

案例:查询员工信息,按年薪降序

SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪 FROM employees ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC;

4.按别名排序

案例:查询员工信息,按年薪升序

SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪 FROM employees ORDER BY 年薪 ASC;

5.按函数排序

案例:查询员工名,并且按名字的长度降序

SELECT last_name FROM employees ORDER BY LENGTH(last_name) DESC;

6.按多个字段排序

案例:查询员工信息,要求先按工资降序,再按employee_id升序

SELECT * FROM employees ORDER BY salary DESC,employee_id ASC;

##进阶4:常见函数

概念:类似于java的方法,将一组逻辑语句封装在方法体中,对外暴露方法名

好处:1.隐藏了实现细节? 2.提高代码的重用性

调用:select 函数名(实参列表) 【from 表名】;

???????? ? 函数中参数用到表中字段需要加【from表名】,没用到就不用加

特点:①叫什么(函数名)②干什么(函数功能)

???????? 一、单行函数:做处理使用,传进一个值,返回一个值

???????? (一)字符函数

????????????????? 1.length获取字节个数

SELECT LENGTH('张三丰hahaha');

SHOW VARIABLES LIKE '%char%' 显示字符集

utf8中1个汉字占3个字符

???????????????????????????????????????????????????????????? gdk中1个汉字占2个字符

????????????????? 2.concat拼接字符串

????????????????????????? SELECT CONCAT(last_name,'_',first_name) 姓名 FROM employees;

3.upper转换成大写,lower转换成小写

???????? 示例:将姓变大写,名变小写,然后拼接

???????? SELECT CONCAT(UPPER(last_name),LOWER(first_name)) FROM employees;

4.substr/substring截取字符(注意:索引从1开始)

1.截取从指定索引处后面所有字符

SELECT SUBSTR('李莫愁爱上了陆展元',7) out_put;

2.截取从指定索引处指定字符长度的字符

SELECT SUBSTR('李莫愁爱上了陆展元',1,3) out_put; (3表示截取长度)

3.案例:姓名中首字符大写,其他字符小写然后用_拼接,显示出来

(视频中“姓名”指“姓”)

select concat(

upper(substr(concat(last_name,first_name),1,1)),

'-',

lower(substr(concat(last_name,first_name),2)))

from employees;

5.instr返回子串第一次出现的索引(找不到返回0)

6.trim去前后空格和指定的字符

???????? SELECT TRIM('a' FROM 'aaaaaaaaa张a翠山aaaaaaaaaaaaaaaaaa')? AS out_put;

???????? 结果:张a翠山

7.ltrim去左边空格,rtrim去右边空格

8.lpad用指定的长度实现左填充,rpad用指定的长度实现右填充

SELECT LPAD('殷素素',10,'*') AS out_put; (总字符个数为10)

SELECT LPAD('殷素素',2,'*') AS out_put; (显示为 殷素)

???????? ???????? 9.replace替换

????????????????????????? SELECT REPLACE('周芷若张无忌爱上了周芷若','周芷若','赵敏'); (都会替换)

(二)数学函数

????????????????? 1.round 四舍五入 SELECT ROUND(1.567,2); (保留2位小数)

????????????????? 2.ceil向上取整,返回大于等于该参数的最小整数

????????????????? 3.floor向下取整,返回小于等于该参数的最大整数

????????????????? 4.truncate截断 SELECT TRUNCATE(1.69999,1); (保留1位小数,1.6)

????????????????? 5.mod取余 (mod(a,b)=a-a/b*b,结果的正负与被除数保持一致)

????????????????? 6.rand 随机数,返回0到1之间的小数

???????? (三)日期函数

????????????????? 1.now当前系统日期+时间

????????????????? 2.curdate当前系统日期 (cur指current)

????????????????? 3.curtime当前系统时间

????????????????? 4.可以获取指定的部分,年、月、日、小时、分钟、秒

SELECT YEAR(NOW()) 年;

SELECT MONTH(NOW()) 月;

SELECT MONTHNAME(NOW()) ; (以英文形式返回月)

????????????????? 5.str_to_date 将字符通过指定的格式转换成日期

????????????????? ???????? ?

????????????????? ???????? ?

SELECT * FROM employees

WHERE hiredate = STR_TO_DATE('4-3 1992','%c-%d %Y');

????????????????? 6.date_format将日期转换成字符

????????????????????????? ?

7.datediff函数返回两个日期相差的天数

???????? (四)其他函数

????????????????? 1.version当前数据库服务器的版本

????????????????? 2.database当前打开的数据库

????????????????? 3.user当前连接用户

????????????????? 4.password(‘字符’)返回该字符的密码形式,即自动加密

????????????????? 5.md5(‘字符’)返回该字符md5加密形式

(五)流程控制函数

????????????????? 1.if函数:if else 的效果

????????????????????????? SELECT IF(10<5,'大','小');

????????????????????????? SELECT last_name,IF(commission_pct IS NULL,'无','有') FROM employees;

????????????????? 2.case函数

????????????????????????? 使用一:switch case的效果(处理等值判断)

case 要判断的字段或表达式

when 常量1 then 要显示的值1或语句1; (若为值,不用加;

when 常量2 then 要显示的值2或语句2;

...

else 要显示的值n或语句n;

end

???????? ????????????????? 使用二:类似于多重if(处理条件判断)

?????????????????????????????????? case

when 条件1 then 要显示的值1或语句1

when 条件2 then 要显示的值2或语句2

?????????????????????????????????? ...

else 要显示的值n或语句n

end

????????

二、分组函数/统计函数/聚合函数/组函数:做统计使用,传进一组值,返回一个值

(1)sum求和(2)max最大值(3)min最小值(4)avg平均值(5)count计数

????????????????? 特点:

????????????????? 1.sum和avg一般用于处理数值型,max、min、count可以处理任何数据类型

2.以上五个分组函数都忽略null值,null值并未参与运算,除了count(*)

3.都可以搭配distinct使用,用于统计去重后的结果(distinct 字段)

????????????????? 4.count的参数可以支持:

(1)字段

(2)*(结果是总行数)

(3)常量值,一般放1(假设加了一列,该列每个格子中都是1,结果是总行数)

???????? ??????? ????????????????? 效率:

MYISAM存储引擎下,COUNT(*)的效率高

INNODB存储引擎下,COUNT(*)和COUNT(1)的效率差不多,比COUNT(字段)要高一些,因为COUNT(字段)需要先判断该字段的值是否为null,有筛选过程。

建议使用COUNT(*)

????????????????? 5.和分组函数一同查询的字段要求是group by后的字段

##进阶5:分组查询

???????? 语法:

????????????????? select分组函数,列〈要求出现在group by的后面〉

from表

【where 筛选条件】

group by 分组的列表

【having 分组后的筛选】

【order by 子句】

???????? 执行顺序:from->where->group by->having->select->order by

(order by除limit语句之外放在最后)

???????? order by支持别名,经验证group by和having也支持别名,但少用

???????? 特点:

1.和分组函数一同查询的字段必须是group by后出现的字段

2.【面试题】

筛选分类

数据源

位置

连接的关键字

分组前筛选

原始表

group by前

where

分组后筛选

分组后的结果集

group by后

having

????????????????????????? 分组函数做条件一定放在having子句中

能用分组前筛选的,优先考虑使用分组前筛选,提高效率

????????????????? 3.group by子句支持:

单个字段分组

多个字段分组(,隔开,无先后顺序)

表达式或函数(使用较少)

????????????????? 4.也可以添加排序(排序放在整个分组查询的最后)

????????

案例:

简单分组(“每个”后面是分组标准)

案例1:查询每个工种的最高工资

???????? select max(salary),job_id from employees group by job_id;

???????? 案例2:查询每个位置上的部门个数

???????? select count(*),location_id from departments group by location_id;

添加筛选条件(分组前筛选)

案例1:查询邮箱中包含a字符的每个部门的最高工资

???????? select max(salary),department_id from employees

where email like ’%a%’ group by department_id;

案例2:查询有奖金的每个领导手下员工的平均工资

select avg(salary),manager_id from employees

where commission_pct is not null group by manager_id;

添加复杂的筛选条件(分组后筛选)

案例1:查询哪个部门的员工个数>2

select count(*),department_id from employees

#where count(*)>2 (员工表中没有count(*)字段,报错!!!)

group by department_id

having count(*)>2; (正确做法)

?????????????????????????

案例2:每个工种有奖金的员工的最高工资>12000的工种编号和最高工资

????????????????????????? select job_id,max(salary) from employees

where commission_pct is not null

group by job_id

having max(salary)>12000;

案例3:领导编号>102的每个领导手下最低工资>5000的领导编号和最低工资

select manager_id,min(salary) from employees

where manager_id>102

group by manager_id

having min(salary)>5000;

????????????????? 按表达式或函数分组

案例:按员工姓名的长度分组,查询每一组的员工个数并筛选员工个数>5的

select length(last_name),count(*) from employees

group by length(last_name) (group by后面也支持函数/表达式/别名)

having count(*)>5; (group by和having后面支持别名,但不常用,但是where后面不支持别名

????????????????? 按多个字段进行分组

????????????????????????? 案例:查询每个部门每个工种的员工的平均工资

????????????????????????? select avg(salary),department_id,job_id from employees

group by department_id,job_id;

????????????????? 添加排序

????????????????????????? 案例:查询每个部门每个工种的员工的平均工资并按平均工资的高低显示

????????????????????????? select avg(salary),department_id,job_id from employees

group by department_id,job_id

order by avg(salary) desc;

##进阶6:连接查询/多表查询/多表连接查询

???????? 含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询

???????? 笛卡尔乘积现象:表1 有m行,表2有n行,结果=m*n行

发生原因:没有有效的连接条件 如何避免:添加有效的连接条件

分类:

???????? ???????? 按年代分类:

???????? ????????????????? sql92标准:仅仅支持内连接

???????? ????????????????? sql99标准【推荐】:支持内连接+外连接(左外和右外)+交叉连接

???????? ???????? 按功能分类:

????????????????? ???????? 内连接:等值连接、非等值连接、自连接

????????????????? ???????? 外连接:左外连接、右外连接、全外连接

????????????????? ???????? 交叉连接

一、sql92标准

(一)等值连接

???????? ①多表等值连接的结果为多表的交集部分

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

③多表的顺序没有要求

④一般需要为表起别名

⑤可以搭配前面介绍的所有子句使用,比如排序、分组、筛选

????????????????? 1.简单的连接

案例:查询员工名和对应的部门名

SELECT last_name,department_name FROM employees,departments

WHERE employees.department_id=departments.department_id;

2.为表起别名(提高语句简洁度,区分多个重名字段)

???????? 注意:如果为表起了别名,则查询的字段就不能使用原来的表名去限定

???????? 案例:查询员工名、工种号、工种名

???????? select last_name,e.job_id,job_title (job_id有歧义)

from employees as e,jobs as j (先执行,再用原来的表名会报错)

???????? where e.job_id=j.job_id;

????????????????? 3.两个表的顺序可以调换

????????????????? 4.可以加筛选

????????????????????????? 案例1:查询有奖金的员工名、部门名

????????????????????????? select last_name,department_name from employees e,departments d

????????????????????????? where e.department_id=d.department_id

and commission_pct is not null;

????????????????????????? 案例2:查询城市名中第二个字符为o的部门名和城市名

????????????????????????? select department_name,city from departments d,locations l

????????????????????????? where d.location_id=l. location_id

????????????????????????? and city like '_o%';

????????????????? 5.可以加分组

????????????????????????? 案例1:查询每个城市的部门个数

????????????????????????? select city,count(*) 部门个数 from locations l,departments d

where l.location_id=d.location_id

????????????????????????? group by city;

案例2:查询有奖金的每个部门的部门名、部门领导编号、该部门最低工资

select department_name,d.manager_id,min(salary)

from departments d,employees e

where d.department_id=e.department_id and commission_pct is not null

group by department_name,manager_id; (不能确定这两个字段一一对应,因此分组条件都写上)

???????? ???????? 6.可以加排序

????????????????????????? 案例:查询每个工种的工种名和员工的个数,并且按员工个数降序

????????????????????????? select job_title,count(*)

????????????????????????? from jobs j,employees e

????????????????????????? where j.job_id=e.job_id

????????????????????????? group by job_title

????????????????????????? order by count(*) desc;

???????? ???????? 7.可以三表连接

(二)非等值连接

????????????????????????? 案例1:查询员工的工资和工资级别excel中模糊比对)

????????????????????????? SELECT salary,grade_level FROM employees e,job_grades g

WHERE salary BETWEEN g.`lowest_sal` AND g.`highest_sal`;

(三)自连接

????????????????????????? 案例:查询员工名和该员工的上级名

SELECT e.employee_id,e.last_name,m.employee_id,m.last_name

FROM employees e,employees m

?WHERE e.`manager_id`=m.`employee_id`;

二、sql99语法:通过join关键字实现连接

???????? ???????? 含义:1999年推出的sql语法

???????? ???????? 支持:支持内连接+外连接(左外和右外)+交叉连接???

???????? ???????? 语法:

???????? ????????????????? select 查询列表

???????? ????????????????? from 表1 别名

【连接类型】 join 表2 (原来的,替换成【连接类型】 join

on 连接条件 (原来的连接条件用where,替换成on

【连接类型】 join 3

on 连接条件

???????? ????????????????? 【where 筛选条件】

???????? ????????????????? 【group by 分组字段】

???????? ????????????????? 【having 分组后的筛选条件】

???????? ????????????????? 【order by 排序的字段或表达式】

???????? ???????? 连接类型:

????????????????????????? 内连接inner

????????????????????????? 外连接

?????????????????????????????????? 左外left【outer】 右外right【outer】 全外full【outer】 不支持全外

????????????????????????? 交叉连接cross

???????? ???????? 好处:语句上,连接条件(on)和筛选条件(where)实现了分离,简洁明了。

(一)内连接(等值连接、非等值连接、自连接)

????????????????? 特点:

①添加排序、分组、筛选②inner可以省略

③ 筛选条件放在where后,连接条件放在on后,提高分离性,便于阅读

④inner join连接和sql92语法中的等值连接效果一样,都是查询多表的交集

1.等值连接

案例:查询部门个数>3的城市名和部门个数

select city,count(*) from locations l

inner join departments d

on l.location_id=d.location_id

group by city

having count(*)>3;

????????????????? 2.非等值连接

????????????????????????? 案例:查询工资级别中员工个数>20的并且按工资级别降序排列

????????????????????????? select count(*),grade_level

from employees e

????????????????????????? inner join job_grades g

????????????????????????? on e.salary between g.lowest_sal and g.highest_sal;

????????????????????????? group by grade_level

????????????????????????? having count(*)>20

order by grade_level desc;

?????????????????

3.自连接

????????????????????????? 案例:查询姓名中包含字符k的员工及其上级的名字

????????????????????????? select e.last_name,m.last_name

????????????????????????? from employees e

????????????????????????? inner join employees m

????????????????????????? on e.manager_id=m.employee_id

where e.last_name like ‘%k%’;

???????? (二)外连接(左外、右外、全外)

应用场景:用于查询一个表中有,另一个表没有的记录

特点:

1.外连接的查询结果为主表中的所有记录

???????? ?????????????????????????????????? 如果从表中有和它匹配的(连接条件一致),则显示匹配的值

?????????????????????????????????? ???????? 如果从表中没有和它匹配的,则显示null

?????????????????????????????????? ???????? 外连接查询结果=内连接结果+主表中有而从表没有的记录

2.左外连接,left 【outer】 join左边的是主表

右外连接,right 【outer】 join右边的是主表

???????????????????????? 3.左外和右外交换两个表的顺序,可以实现同样的效果

???????????????????????? 4.全外连接=内连接的结果+表1中有但表2没有的+表2中有但表1没有的

????????????????????????? 5.全外连接mysql不支持)

????????????????? 引入案例:查询男朋友不在男神表的女神名

????????????????? 主表:看想查询的内容来自于哪个表,该例中主表为女神表

????????????????? select b.name,

from beauty b left outer join boys bo 或 from boys bo right outer join beauty b

on b.boyfriend_id=bo.id

where bo.id is null; (最好选择从表中的主键列

案例1:查询哪个部门没有员工(部门表为主表)

select department_name

from departments d

left join employees e

on d.department_id=e.department_id

where employee_id is null; (去掉内连接结果,剩下非交集部分)

(三)交叉连接(笛卡尔乘积)

sql92和 sql99pk

功能:sql99支持的较多

可读性:sql99实现连接条件和筛选条件的分离,可读性较高

主表是女神表

select b.id,b.name,bo.*

from beauty b

left join boys bo

on b.boyfriend_id=bo.id

where b.id>3;

##进阶7:子查询

含义:一条查询语句中又嵌套了另一条完整的select语句,其中被嵌套的select语句,称为子查询或内查询;在外面的查询语句,称为主查询或外查询。

分类:

???????? 按子查询出现的位置:

???????? ???????? select后面:仅仅支持标量子查询

???????? ???????? from后面:支持表子查询

???????? ???????? wherehaving后面:

????????????????? ???????? 标量子查询(单行子查询)

????????????????? ???????? 列子查询(多行子查询)

????????????????? ???????? 行子查询(用的较少)

exists后面(相关子查询)

???????? ???????? ???????? 表子查询

按结果集的行列数不同:

???????? ???????? 标量子查询(结果集只有一行一列)子查询的结果只有一行一列

???????? ???????? 列子查询(结果集只有一列多行)

???????? ???????? 行子查询(结果集有一行多列或多行多列)

???????? ???????? 表子查询(结果集一般为多行多列)

特点:

①子查询放在小括号内

②子查询一般放在条件的右侧

③标量子查询,一般搭配着单行操作符使用>? <? >=? <=? =? <>

列子查询,一般搭配着多行操作符使用in ?any/some ?all

④子查询的执行优先于主查询执行,主查询的条件用到了子查询的结果

一、where或having后面:

1.标量子查询(单行子查询)

???????? 案例1:查询工资比Abel高的员工信息

???????? select * from employees

???????? where salary>(select salary from employees where last_name=’Abel’);

案例2:返回工种编号与141号员工(的工种编号)相同,工资比143号员工(的工资)多的员工姓名,job_id 和工资

???????? select last_name,job_id,salary from employees

???????? where job_id= (select job_id from employees where employee_id=141)

and salary>(select salary from employees where employee_id=143);

案例3:返回公司工资最少的员工的last_name,job_id和salary

select last_name,job_id,salary from employees

where salary=(select min(salary) from employees);

案例4:查询最低工资大于50号部门最低工资的部门id和其最低工资

select department_id,min(salary) from employees group by (department_id)

having min(salary)>(select min(salary) from employees where department_id=50);

非法使用标量子查询

SELECT MIN(salary),department_id

FROM employees

GROUP BY department_id

HAVING MIN(salary)>(

????????????????????????? SELECT salary

????????????????????????? FROM employees

????????????????????????? WHERE department_id = 250);

2.列子查询(多行子查询)

多行操作符

in/not in等于列表中的任意一个

判断a是否in(1,2,3),a=1或2或3,都可显示。括号内替换成查询语句。

any|some和子查询返回的某一个值比较

a>any(1,2,3)等价于a>min(1,2,3)

all 和子查询返回的所有值比较*

a>all(1,2,3)等价于a>max(1,2,3)

???????? 案例1:返回location_id是1400或1700的部门中的所有员工姓名

???????? select last_name from employees

where department_id in(

select distinct department_id from departments where location_id in(1400,1700));

案例2:返回其它工种中比job_id为‘IT_PROG’工种任一工资低的员工的员工号、姓名、job_id以及salary

select employee_id,last_name,job_id,salary from employees

where salary<any (select distinct salary from employees where job_id=’IT_PROG’)

and job_id<>’IT_PROG’;

3.行子查询(多列多行)

???????? 案例:查询员工编号最小并且工资最高的员工信息

(法一)select * from employees

where employee_id=(select min(employee_id) from employees)

???????? and salary=(select max(salary) from employees);

???????? 使用行子查询:满足判断条件都用=

(法二)select * from employees

where (employee_id,salary)=(select min(employee_id),max(salary) from employees);

二、select后面:仅仅支持标量子查询

????????????????? 案例:查询每个部门的员工个数

????????????????? select d.*,(

select count(*)

from employees e

where e.department_id=d.department_id

)

from departments d;

???????? 三、from后面:将子查询的结果集充当表格使用,几行几列都可以,必须起别名。

????????????????? 案例:查询每个部门的平均工资的工资等级

????????????????? 1’查询每个部门的平均工资

select avg(salary),department_id from employees group by department_id

2’连接1’的结果集和工资等级表,非等值连接

????????????????? select ag_dep.*,g.grade_level

from job_grades g

????????????????? inner join(

select avg(salary) ag,department_id

from employees

group by department_id

) ag_dep

????????????????? on ag_dep.ag between lowest_sal and highest_sal;

???????? 四、exists后面(相关子查询):只关心子查询的结果有没有值。结果是布尔类型。

????????????????? 语法:exists(完整的查询语句)

结果:1或0

执行顺序:先执行外查询,再根据子查询过滤。

????????????????? 案例1:查询有员工的部门名

(用exists)select department_name from departments d

????????????????? where exists(select * from employees e where d.department_id=e.department_id);

(用in)select department_name from departments d

????????????????? where d.department_id in(select department_id from employees);

????????????????? 案例2:查询没有女朋友的男神信息

(用exists)select bo.* from boys bo where not exists(

select boyfriend_id from beauty b where bo.id=b.boyfriend_id);

(用in)select bo.* from boys bo where bo.id not in (select boyfriend_id from beauty);

案例:

1.查询和Zlotkey相同部门的员工姓名和工资

select last_name,salary from employees where department_id=(select department_id from employees where last_name=’Zlotkey’);

2.查询工资比公司平均工资高的员工的员工号、姓名和工资

select employee_id,last_name,salary from employees

where salary>(select avg(salary) from employees);

3.查询各部门中工资比本部门平均工资高的员工的员工号、姓名和工资

子查询的结果同

select employee_id,last_name,salary

from employees e

inner join (

select avg(salary) ag,department_id from employees group by department_id) ag_dep

on e.department_id=ag_dep.department_id

where salary>ag_dep.ag;

4.查询和姓名中包含字母u的员工在相同部门的员工的员工号和姓名

select employee_id,last_name from employees where department_id in(select distinct department_id from employees where last_name like’%u%’);

5.查询在部门的location_id为1700的部门工作的员工的员工号

select employee_id from employees

where department_id in(select department_id from departments where location_id=1700);

6.查询管理者是King的员工姓名和工资

1’查询姓名为King的员工号

select employee_id from employees where last_name=’King’

2’查询管理者编号是1’的结果的员工姓名和工资

select last_name,salary

from employees

where manager_id in ( select employee_id from employees where last_name=’K_ing’);

7.查询工资最高的员工的姓名,要求first_namelast_name显示为一列,列名为姓名

select concat(first_name,last_name) from employees

where salary=(select max(salary) from employees);

##进阶8:分页查询

应用场景:当要显示的数据,一页显示不全,需要分页提交sql请求

语法: ??????????????????执行顺序

???????? ???????? select 查询列表????????????????????? 7

???????? ???????? from 表???????????????????????????????????? 1

???????? ???????? 【join type join 表2?????????????? 2

???????? ???????? on 连接条件??????????????????????????? 3

???????? ???????? where 筛选条件???????????????????? 4

???????? ???????? group by 分组字段???????????????? ???????? 5

???????? ???????? having 分组后的筛选??????????? 6

???????? ???????? order by 排序的字段】???????? 8

???????? ???????? limit 【offset,】size;????????????? 9

???????? offset要显示条目的起始索引(起始索引从0开始

???????? size要显示的条目个数

???????? ???????? 案例1:查询前5条员工信息

????????????????? select * from employees limit 0,5;

或select * from employees limit 5; (从第一条开始可以忽略起始索引)

???????? ???????? 案例2:查询第11条到第25条员工信息

????????????????? select * from employees limit 10,15;

???????? ???????? 案例3:显示有奖金且工资较高的前十名的员工信息

????????????????? select * from employees where commisstion_pct is not null

order by salary desc limit 10;

特点:

???????? ???????? ①limit语句放在查询语句的最后,语法上在最后,执行顺序也是最后。

???????? ???????? ②公式

???????? ???????? 要显示的页数page,每页的条目数size

???????? ???????? select 查询列表

???????? ???????? from 表

????????????????? limit (page-1)*size,size;

???????? 找规律:

????????????????? 每页条目数size=10

????????????????? 要显示的页数page=1:第1页—>起始索引0

????????????????? 要显示的页数page=2:第2页—>起始索引10

????????????????? 要显示的页数page=3:第3页—>起始索引20

##进阶9:联合查询

union(联合/合并):将多条查询语句的结果合并成一个结果

引入案例:查询部门编号>90或邮箱包含a的员工信息

(法一)select * from employees where department_id>90 or email like ‘%a%’;

(法二)select * from employees where department_id>90

union

select * from employees where email like ‘%a%’;

语法:查询语句1 union 查询语句2 union ...

应用场景:要查询的结果来自多个表,且多个表没有直接的连接关系,但查询信息一致

特点:

???????? ???????? 1.多条查询语句的查询列数必须一致

???????? ???????? 2.要求多条查询语句的查询的每一列的类型和顺序最好一致

???????? ???????? 3.union关键字默认去重,如果使用union all 可以包含重复项

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-09-14 13:24:52  更:2021-09-14 13:26:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 19:36:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码