| |
|
开发:
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,如MySQL、Oracle、SqlServer (客户机服务器,简称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 null或is 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.【面试题】
????????????????????????? 分组函数做条件一定放在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后面:支持表子查询 ???????? ???????? where或having后面: ????????????????? ???????? 标量子查询(单行子查询) ????????????????? ???????? 列子查询(多行子查询) ????????????????? ???????? 行子查询(用的较少) 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_name和last_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 可以包含重复项 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |