mysql----查询二
-
排序查询
-
常见函数
- 字符函数
- 数学函数
- 日期函数
- 其他函数
- 控制函数
-
单行函数
-
分组函数
-
分组查询
-
连接查询
- 内连接
- 外连接
- 交叉连接
1.温故知新
//复习
一、数据库的好处
》可以持久化数据到本地
》结构化查询
二、数据库常见概念
DB:数据库,存储数据的内容
DBMS:数据库管理系统,又称为数据库软件或数据库产品,用于创建或管理DB
SQL:结构化查询语言,用于和数据库通信的语言,不是某个数据库软件特有的,而是几乎所有的主流数据库软件通用的语言
三、数据库存储数据的特点
1.数据存放到表中,然后表在放到库中
2.一个库可以有多个表,每张表具有唯一的表名用来标识自己
3.表中有一个或多个列,列又称为“字段”,相当于java中的"属性"
4.表中的每一行数据,相当于java中“对象”
四、常见的数据库
mysql oracle db2 sqlserver
#################################
##################################
一、MySQL的背景
前身属于瑞典的一家公司,MySQL AB
08年被sun公司收购
09年sun被oracle收购
二、MySQL的优点
1.开源、免费、成本低
2.性能高、移植性也好
3.体积小,便于安装
三、MySQL的安装
属于c/s架构的软件,一般来讲安装服务端
企业版
社区版
目前电脑上是5.5版本的
四、MySQL服务的启动和停止
方式一:net start 服务名
net stop 服务名
方式二:计算机--右击---管理----服务
五、MySQL服务的登录和退出
登录:
mysql -hloacalhost -P3306 -uroot -proot
mysql -h[主机名] -P[端口] -u[用户] -p[密码]
退出:exit 或者 ctr+c
###########################
########################
DQL语言
一、语法:
select 查询列表 from 表名;
二、特点
1.查询列表可以是字段、常量、表达式、函数,也可以是多个
2.查询结果是一个虚拟表
三、示例
1.查询单个字段
select 字段名 from 表名;
2.查询多个字段
select 字段名,字段名 from 表名;
3.查询所有字段
select * from 表名
4.查询常量
select 常量值
注意:字符型和日期型的常量必须用单引号引起来,数值型不需要
5.查询函数
select 函数名(实参列表)
6. 查询列表
select 100/1234;
7.起别名
as 或者空格
8.去重
select distinct 字段名 from 表名;
9+
作用:做加法运算
select 数值+数值;//直接运算
select 字符+数值:先试图将字符转换成数值,如果转换成功,则继续运算;否则转换成0,在做运算
select null+值;//结果都为null
10.concat函数
功能:拼接字符
select concat(字符1,字符2,字符3,...);
11.ifnull函数
功能:判断某字段或表达式是否为null,如果为null返回指定的值,否则返回原本的值
select ifnull(commission_pct,0) from employees;
12. isnull函数
功能:判断某字段或表达式是否为Null,如果是,返回1,否则返回0
例如:select isnull(commission_pct),commiddion_pct from employees;//sql中isnull()返回真假值,真--1,假---0
##########################
##########################
条件查询
一、语法:
select 查询列表
from 表名
where 筛选条件
二、筛选条件的分类
1.简单条件运算符
> < = != <> <=> <= >=
2.逻辑运算符
&& and
|| or
! not
3.模糊查询
like :一般搭配通配符使用,用于判断字符型数值或者数值型
通配符:%任意多个字符,— 任意单个字符
//高版本的也可以查询数值型数据
例如:select * from employees where department_id like '1__';//查询1开头的三位数字
between and
in
is null /is not null;用于判断Null值
is null PK <=>
普通类型的数值 null值 可读性
is null no yes yes
<=> yes yes no
2.排序查询
#进阶3:排序查询
/*
引入:
select * from employees;
语法:
select 查询列表
from 表
【where 筛选条件】
order by 排序列表 【asc|desc】
特点:1.asc代表是升序,desc代表的是降序,如果不写,默认是升序。
2.order by子句中可以支持单个字段、多个字段、表达式、函数、别名
3.order by子句一般是放在查询语句的最后面,limit子句除外。
执行循序:表----筛选条件---查询列表---order by排序表
*/
#案例:查询员工信息,要求工资从高到低排序
select * from employees order by salary desc;
#从低到高排序
select * from employees order by salary asc;
#案例2:查询部门编号>=90的员工信息,按入职时间的先后进行排序。【添加筛选条件】
select *
from employees
wherre department_id>=90
order by hiredate asc;
#案例3:按年薪的高低显示员工的信息和年薪【按表达式排序】
select *,salary*12(1+ifnull(commission_pct,0)) as 年薪
from employees
order by salary*12*(1+ifnull(commiddion_pct,0)) desc;
#案例4:按年薪的高低显示员工的信息和年薪【按别名排序】
select *,salary*12(1+ifnull(commission_pct,0)) as 年薪
from employees
order by 年薪 desc;
#案例5:按姓名的长度显示员工的姓名和工资【按函数排序】
select length(last_name) as 字节长度, last_name,salary
from employees
order by length(last_name) desc;
#案例6:查询员工信息,要求先按照工资升序,再按照员工编号降序【按多个字段排序】
select *
from employee
order by salary asc,employee_id desc;
#1.查询与员工的姓名和部门号和年薪,按年薪降序,按姓名升序
【自己】:
select name as 姓名,departments_id,salary*12*(1+ifnull(commission_pct,0)) as 年薪
from employees
order by 年薪 desc,姓名 asc;
[老师]:
select last_name,department_id,salary*12*(1+ifnull(commission_pact,0)) as 年薪
from employees
order by 年薪 desc,last_name asc;
#2.选择工资不在8000到17000的员工的姓名和工资,按工资降序
【自己】select name as 姓名,salary*12*(1+ifnull(commission_pct,0) as 年薪
from employees
where 年薪>=8000 and 年薪<=17000
order by 年薪 desc;
[老师]:
select last_name,salary
from employees
where salary not(bentween 8000 and 17000)
order by salary desc;
#3.查询邮箱中包含e的员工信息,并先按邮箱的字节数降序,再按部门号升序
【自己】
select *
from employees
where email_id '%e%'
order by lengtth(email_id) desc,departments_id asc;
[老师]
select *
from employees
where email like '%e%'
order by length(email) desc,department_id asc;
[老师]
select *,length(email)#这是为了查看是否是按照字节数降序排序的所以加上这个语句
from employees
where email like '%e%'
order by length(email) desc,department_id asc;
3.常见函数
#进阶4:常见函数
/*
概念:类似于java的方法,将一组逻辑语句封装在方法体中,对外暴露方法名
好处:1.隐藏了实现细节 2.提高代码的重用性
调用:select 函数名(实参列表) 【from 表】;
特点:
》叫什么(函数名)
》干什么(函数功能)
分类
1.单行函数---又分为:字符函数、数学函数、日期函数、其他函数(补充)、流程控制函数(补充)
如 concat、length、ifnull等
2.分组函数
功能:做统计使用,又称为统计函数、聚合函数、组函数
常见函数总结【都属于单行函数】:
字符函数:
length
concat
substr
instr
trim
upper
lower
lpad
rpad
replace
数学函数:
round
ceil
floor
truncate
mod
日期函数:
now
curdate
curtime
year
month
monthname
day
hour
minute
second
str_to_date
date_formate
其他函数:
verson
database
user
控制函数 if
case
*/
#一、字符函数
#1.length 获取参数值的字节个数
select length('john');
select length('张三丰hahaha');//这个和编码有关系,utf-8中是一个汉字3个字节
show variables like'%char%';//看字符编码用的
#2.concat 拼接字符串
select concat(last_name,'_',first_name) as 姓名 from employees;
#3.upper、lower
select upper('john');#变为大写
select lower('joHn');#变为小写
#示例:将姓变大写,名变小写,然后拼接
select concat(upper(last_name),lower(first_name)) as 姓名 from employees;
#4.substr、substring
注意:索引从1开始
#截取从指定索引处后面所有字符
select substr('李莫愁爱上了陆展元',7) out_put;
#截取从指定索引处指定字符长度的字符
select substr('李莫愁爱上了陆展元',1,3) out_put;
#案例:姓名中首字符大写,其他字符小写,然后用_拼接,显示出来
【自己】(没做出)
/*mysql> select concat(substr(upper(last_name),1,1),substr(lower(last_name,2)),'_',lower(first_name)) from employees;
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'lower'*/
【老师】
select concat(upper(substr(last_name,1,1)),'_',lower(substr(last_name,2))) out_put from employees;
#5.instr返回子串第一次出现的索引,如果找不到返回0
select instr('杨不悔爱上了殷六侠','殷六侠') as out_put;
#6.trim:【注释是自己加的】去掉前后空格等重复的东西的
select length(trim(' 张翠山 ')) as out_put;
select trim('aa' from 'aaaaaaaa张aaaaaaaaa翠山aaaaaaaaaaaaaaa') as out_put;
#7.lpad用指定的字符实现左填充指定长度
select lpad('殷素素',10,'*') as out_put;#用*实现左填充总的长度是10
select lpad('殷素素',2,'*') as out_put;#殷素【在总长度超过指定的长度时候,他就是从右边截断】
#8.rpad 用指定的字符实现右填充指定长度
select rpad('殷素素',12,'ab') as out_put;
#9.replace 替换
select replace('周芷若周芷若周芷若张无忌爱上了周芷若周芷若周芷若周芷若周芷若周芷若周芷若','周芷若','赵敏') as out_put;#周芷若全部替换成了赵敏
二、数学函数
#round 四舍五入
select round(-1.55);
select round(1.567,2);#1.57 #//小数后保留两位
#ceil 向上取整,返回>=该参数的最小整数
select ceil(-1.02);#-1
#floor 向下取整,返回<=该参数的最大整数
select floor(-9.99);
#truncate 截断
select truncate(1.69999,3);#1.699
select truncate(1.69999,2);#1.69
[注意:后面的第二个参数意思说的是保留第一个参数的小数点后的第几位]
#mod取余
/*
mod(a,b): a-a/b*b
例如:mod(-10,-3): -10- (-10)/(-3)* (-3) = -1
*/
select mod(10,3);
select 10%3;
select mod(-10,-3);#-1
三、日期函数
#now 返回当前系统日期+时间
select now();
#curdate 返回当前系统日期,不包含时间
select curdate();
#curtime 返回当前时间,不包含日期
select curtime();
#可以获取指定的部分,年、月、日、小时、分钟、秒
select year(now()) as 年;
select year('1998-1-1')as 年;
select year(hiredate) as 年 from employees;
select month(now()) as 月;
select monthname(now()) as 月;#显示的是英文的月份
/*
格式符 功能
%Y 四位的年份
%y 2位的年份
%m 月份(01,02,03,....11,12)
%c 月份(1,2,3....11,12)
%d 日(01,02,...)
%H 小时(24小时制)
%h 小时(12小时制)
%i 分钟(00,01,...59)
%s 秒(00,01,...59)
*/
#str_to_date 将字符通过指定的格式转换成日期
select str_to_date('1998-3-2','%Y-%c-%d') as out_put;
#案例:查询入职日期为1992-4-3的员工信息
select * from employees where hiredate = '1992-4-3';
select * from employees where hirdate=str_to_date('4-3 1992','%c-%d %Y');
#date_format将日期转换成字符
select date_format(now(),'%y年%m月%d日') as out_put;# 21年02月09日
#查询有奖金的员工名和入职日期(xx月/xx日 xx年)
select last_name,date_format(hiredate,'%m月/%d日 %y年') as 入职日期
from empployees
where commission_pct is not null;
#四、其他函数
select version();
select database();
select user();
#五、流程控制函数
1.#if函数: if else的效果
select if(10<5,'大','小');
select last_name,commission_pct,if(commission_pct is null,'没奖金,呵呵','有奖金,喜喜') as 备注
from employees;
2#case结构:使用一:实现java中switch-case的效果
/*
mysql中:
case 要判断的字段或表达式
when 常量1 then 要显示的值1或语句1;
when 常量2 then 要显示的值2或语句2;
...
else 要显示的值n或语句n;
end
*/
/*
#案例
要求查询员工的工资,要求:部门号= 30,显示的工资为1.1倍
部门号= 40,显示的工资为1.2倍
部门号= 50,显示的工资为1.3倍
其他部门,显示的工资为原工资
*/
select salary as 原始工资 ,department_id,case department_id
when 30 then salary*1.1
when 40 then salary*1.2
when 50 then salary*1.3
else salary
end as 新工资
from employees;
3#case结构:使用二:实现java中多重if的结构
/*
mysql中:
case
when 条件1 then 要显示的值1或语句1
when 条件2 then 要显示的值2或语句2
...
else 要显示的值n 或语句n
end
*/
select salary,
case salary>20000 then 'A'
case salary>15000 then 'B'
case salary>10000 then 'C'
else 'D'
end as 工资级别
from employees;
mysql> show variables like '%char%';
+--------------------------+-------------------------------------------+
| Variable_name | Value |
+--------------------------+-------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | gb2312 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | D:\mysql\MySQL Server 5.5\share\charsets\ |
+--------------------------+-------------------------------------------+
8 rows in set (0.00 sec)
mysql> select length('张ha');
+----------------+
| length('张ha') |
+----------------+
| 4 |
+----------------+
########################
【自己修改】案例:
mysql> select concat(substr(upper(last_name),1,1),lower(substr(last_name,2)),'_',lower(first_name))from employees out_put;
+---------------------------------------------------------------------------------------+
| concat(substr(upper(last_name),1,1),lower(substr(last_name,2)),'_',lower(first_name)) |
+---------------------------------------------------------------------------------------+
| K_ing_steven |
| Kochhar_neena |
| De haan_lex |
| Hunold_alexander |
| Ernst_bruce |
| Austin_david |
| Pataballa_valli |
| Lorentz_diana |
| Greenberg_nancy |
| Faviet_daniel |
| Chen_john |
| Sciarra_ismael |
| Urman_jose manuel |
| Popp_luis |
| Raphaely_den |
| Khoo_alexander |
| Baida_shelli |
| Tobias_sigal |
| Himuro_guy |
| Colmenares_karen |
| Weiss_matthew |
| Fripp_adam |
| Kaufling_payam |
| Vollman_shanta |
| Mourgos_kevin |
| Nayer_julia |
| Mikkilineni_irene |
| Landry_james |
| Markle_steven |
| Bissot_laura |
| Atkinson_mozhe |
| Marlow_james |
| Olson_tj |
| Mallin_jason |
| Rogers_michael |
| Gee_ki |
| Philtanker_hazel |
| Ladwig_renske |
| Stiles_stephen |
| Seo_john |
| Patel_joshua |
| Rajs_trenna |
| Davies_curtis |
| Matos_randall |
| Vargas_peter |
| Russell_john |
| Partners_karen |
| Errazuriz_alberto |
| Cambrault_gerald |
| Zlotkey_eleni |
| Tucker_peter |
| Bernstein_david |
| Hall_peter |
| Olsen_christopher |
| Cambrault_nanette |
| Tuvault_oliver |
| K_ing_janette |
| Sully_patrick |
| Mcewen_allan |
| Smith_lindsey |
| Doran_louise |
| Sewall_sarath |
| Vishney_clara |
| Greene_danielle |
| Marvins_mattea |
| Lee_david |
| Ande_sundar |
| Banda_amit |
| Ozer_lisa |
| Bloom_harrison |
| Fox_tayler |
| Smith_william |
| Bates_elizabeth |
| Kumar_sundita |
| Abel_ellen |
| Hutton_alyssa |
| Taylor_jonathon |
| Livingston_jack |
| Grant_kimberely |
| Johnson_charles |
| Taylor_winston |
| Fleaur_jean |
| Sullivan_martha |
| Geoni_girard |
| Sarchand_nandita |
| Bull_alexis |
| Dellinger_julia |
| Cabrio_anthony |
| Chung_kelly |
| Dilly_jennifer |
| Gates_timothy |
| Perkins_randall |
| Bell_sarah |
| Everett_britney |
| Mccain_samuel |
| Jones_vance |
| Walsh_alana |
| Feeney_kevin |
| Oconnell_donald |
| Grant_douglas |
| Whalen_jennifer |
| Hartstein_michael |
| Fay_pat |
| Mavris_susan |
| Baer_hermann |
| Higgins_shelley |
| Gietz_william |
+---------------------------------------------------------------------------------------+
107 rows in set (0.00 sec)
mysql>
##############################
mysql> select trim('aa'from'aaaaaaaaaaaaaaaaaa张caaaaaaaaaaaaaxcui翠山aaaaaaaaaaaaa') as out_put;
+---------------------------+
| out_put |
+---------------------------+
| 张caaaaaaaaaaaaaxcui翠山a |
+---------------------------+
1 row in set, 1 warning (0.00 sec)
mysql> select trim('a'from'aaaaaaaaaaaaaaaaaa张caaaaaaaaaaaaaxcui翠山aaaaaaaaaaaaa') as out_put;
+--------------------------+
| out_put |
+--------------------------+
| 张caaaaaaaaaaaaaxcui翠山 |
+--------------------------+
1 row in set, 1 warning (0.00 sec)
单行函数
###########单行函数#########
1.#显示系统时间(注:时间+日期)
select now();
2.#查询员工工号,姓名,工资,以及工资提高百分之20后的结果(new salary)
select employees_id,last_name,salary,salary*1.2 as "new salary"
from empolyees;
3.#员工的姓名接首字母排序,并写出姓名的长度(length)
select length(last_name)as 长度,substr(last_name,1,1) as 首字符,last_name
from employees
order by 首字符 asc;#或者asc省略,因为默认就是升序
4#做一个查询,产生下面的结果
<last_name> earns <salary> monthly but wants <salary*3>
Dream Salary
King earns 2400 monthly but wants 72000
【自己做:(思路)】:concat拼接<和>
upper转换大写 lower转换小写
substr截取字符(用从第几个位置开始,截取几个的字符的那个重载的函数)
last_name和salary以及salary*3是要查询的东西
[老师]:
select concat(last_name,'earns',salary,' monthly but wants',salary*3) as "Dream Salary"
from employees
where salary=24000;
5#使用CASE-WHEN,按照下面的条件:
job grade
AD_PRES A
ST_MAN B
IT_PROG C
SA_REP D
ST_CLERK E
产生下面的结果
Last_name Job_id Grade
king AD_PRES A
select last_name,job_id as job,
case job_id
when 'AD_PRES' then 'A'
when 'ST_MAN' then 'B'
when 'IT_PROG' then 'C'
when 'SA_PRE' then 'D'
when 'ST_CLERK' then 'E'
end as Grade
from employees
where job_id ='AD_PRES';
分组函数
/*
分组函数
功能:用作统计使用,又称为聚合函数或统计函数
分类:
sum 求和、avg 平均值、 max 最大值、min 最小值、count 计算个数
特点:
1.sum 、avg一般用于处理数值型
max、min、count可以处理任何类型
2.以上分组函数都忽略null值
3.可以和distinct搭配使用,实现去重
4.count函数的单独介绍
一般使用count(*)用作统计行数
5.和分组函数异同查询的字段要求是group by后的字段
*/
#1.简单的使用
select sum(salary) from employees;
select avg(salary) from employees;
select min(salary) from employees;
select max(salary) from employees;
select count(salary) from employees;
select sum(salary) 和,avg(salary) 平均,max(salary) 最高,min(salary) 最低,count(salary) 个数
from employees;
select sum(salary) 和,round(avg(salary,2)) 平均,max(salary) 最高,min(salary)最低,count(salary)个数
from employees;
#2.参数支持哪些类型
select sum(last_name),avg(last_name) from employees;
select sum(hiredate),avg(hiredate) from employees;
select max(last_name),min(last_name) from employees;
select max(hiredate),min(hiredate) from employees;;
select count(commission_pct) from employees;
select count(last_name) from employees;
#3.是否忽略null
select sum(commission_pct), avg(commission_pct),sum(commission_pct)/35,sum(commission_pct)/107
from employees;
select max(commission_pct),min(commission_pct) from employees;
select count(commission_pct) from employees;
select commission_pct from employees;
#和distict搭配
select sum(distinct salary),sum(salary) from employees;
select count(distinct salary),count(salary) from employees;
#5.count函数的详细介绍
select count(salary) from employees;#统计字段工资的个数
select count(*) from employees;#统计表的行数
select coount(【这里可以是任意的常量值】);#相当于在原来那个表的旁边添加了一列,这一列中的值是你那个填写的常量,统计这个常量的个数就可以统计出来一共又多少行了
效率:
MYISAM存储引擎下,count(*)的效率高
INNODB存储引擎下,count(*)和count(1)的效率差不多,比count(字段)要高一些
#和分组函数一同查询的字段有限制
select avg(salary),employee_id from employees;#不建议这么用,一般要求查询的字段是相同的行数,即:表格是个规则整齐的表格,这里avg最终结果是一个数,employee_id是很多的值,他门的行数不一样,所以不能放一起查
#分组函数案例讲解
#1。查询公司员工工资的最大值,最小值,平均值,总和
select max(salary) as mx_sal,min(salary) as mi_sal,avg(salary) as ag_sal,sum(salary) sm_sal
from employees;
#2,查询员工表中的最大入职时间和最小入职时间的相差天数(diffrence)
select datediff(max(hiredate),min(hiredate)) as diffrence
from employees;
/*
select datediff('2017-10-1','2017-9-29');#结果:2
mysql> select datediff(now(),'1988-1-24');#查询活了多少天
+-----------------------------+
| datediff(now(),'1998-1-24') |
+-----------------------------+
| 8418 |
+-----------------------------+
1 row in set (0.14 sec)
*/
#3.查询部门编号为90的员工个数
select count(*) as 个数
from employees
where department_id =90;
分组查询
#进阶5:分组查询
/*
select 分组函数,列(要求出现在group by的后面)
from 表
【where 筛选条件】
group by 分组的列表
【order by子句】
注意:
查询列表必须特殊,要求是分组函数和group by后出现的字段
*/
/*分组数据:group by
可以使用grop by子句将表中的数据分成若干组
select column,group_function(colum)
from table
[where condition]
[group by group_by_expression]
[order by colum];
明确:where 一定放在from后面
特点:
1.分组查询中的筛选条件分为两类
数据源 位置 关键字
分组前筛选 原始表 group by子句的前面 where
分组后筛选 分组后结果集 group by子句的后面 having
》分组函数做条件肯定是放在having子句中
》能用分组前筛选的,就有限考虑使用分组前筛选。【这样考虑到性能问题】
2.group by子句支持单个字段分组,多个字段分组(多个字段之间用都好隔开没有顺序要求),表达式或函数(相对用的较少)
3.也可以添加排序(排序放在整个分组查询的最后)
*/
#引入:查询每个部门的平均工资
select avg(salary) from employees;
#简单的分组前查询
#案例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 avg(salary),department_id
from employees
where email like '%a%'
group by department_id;
#案例2:查询有奖金的每个领导手下员工的最高工资
select max(salary),manager_id
from employees
where commiddion_pct is not null
group by manager_id;
#添加分组后筛选【添加复杂度筛选条件】
#案例1:查询哪个部门的员工个数>2
#》查询每个部门的员工个数
select count(*) ,department_id
from employees
group by department_id;
#》根据上面结果进行筛选,查询哪个部门的员工个数>2
select count(*),department_id
form employees
group by department_id
having count(*)>2
#案例2:查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
【自己】:
#查每个工种有奖金的员工的最高工资
select salary,job_id
from employees
where commission_pct is not null
group by job_id
having max(salary)>12000;
#在根据以上的结果查工种编号和最高工资
【不会了呀】
【老师】:
#》查询每个工种有奖金的员工的最高工资
select max(salary),job_id
from employees
where commission_pct is not null
group by job_id;
#》根据上面的结果继续筛选,最高工资>12000
select max(salary),job_id
from employees
where commission_pct is not null
group by job_id
having max(salary)>12000;
#案例3:查询领导编号>102的每个领导手下的最低工资>5000的领导编号是哪个,以及其最低工资
【自己】
#查每个编号大于102的领导的手下的最低工资
select min(salary),leader_id
from employees
where leader_id>102
group by leader_id
#根据上面结果查询最低工资大于5000的领导编号和最低工资
select min(salary),leader_id,leader_id##可能是自己开始理解的有误,这里应该是两个,自己理解出错,所以多写了一个
from employees
where leader_id>102
group by leader_id
having min(salary)>5000;
【老师】:
#》查询每个领导手下的员工固定最低工资
select min(salary),manager_id
from employees
group by manager_id
#》添加筛选条件:编号>102
select min(salary),manager_id
from employees
where manager_id>102
group by manager_id
#》添加筛选条件:最低工资>5000
select min(salary),manager_id
from employees
where manager_id>102
group by manager_id
having min(salary)>5000;
#案例:按员工姓名的长度分组,插叙你没一组的员工个数,筛选员工个数>5的有哪些
#》查询每个产犊的员工个数
select count(*),length(last_name) as len_name
from employees
group by length(last_name);
#》添加筛选条件
select count(*),length(last_name) as len_name
from employees
group by length(last_name)
having count(*)>5;
#按多个字段分组
#案例:查询每个部门每个工种的员工的平均工资
select avg(salary),department_id,job_id
from emplpyees
group by job_id,department_id;
#添加排序
##案例:查询每个部门每个工种的员工的平均工资,并且按平均工资的高低显示
select avg(salary),department_id,job_id
from employees
#where department_id is not null#后来添加的筛选条件【在分组前有该条件,分组后有,那么有限考虑分组前的,所以写在这里】
group by job_id,department_id
#having avg(salary)>10000#后来添加的筛选条件
order by avg(salary) desc;
#1.查询各job_id的员工工资的最大值,最小值,平均值,总和,并按job_id升序
select max(salary),min(salary),avg(salary),sum(salary),job_id
from employees
group by job_id
order by job_id;
#2.查询员工最高工资和最低工资的差距(DIFFERENCE)
select max(salary)-min(salary) as DIFFERENCE
from employees;
#3.查询各个管理者手下员工干的最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内
select min(salary),manager_id
from employees
where manager_id is not null
group by manager_id
having min(salary)>=6000;
#4.查询所有部门的编号,员工数量和工资平均值,并按平均工资降序
select department_id,count(*),avg(salary) as average
from employees
group by department_id
order by average desc;
#5.选择具有各个job_id的员工人数
select count(*) as 个数,job_id
from employees
group by job_id;
连接查询
#进阶6:连接查询
##################################################################
连续查询----笛卡尔乘积
/*
含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询
笛卡尔乘积现象:表1 有m行,表2有n行,结果=m*n行
发生原因:没有有效的连接条件
如何避免:添加有效的连接条件
连接查询的分类:
按照年代分类:
sql92标准:仅仅支持内连接
sql99标准【推荐】:支持内连接+外连接(左外和右外)+交叉连接
按功能分类:
内连接:
等值连接
非等值连接
自连接
外连接:
左外连接
右外连接
全外连接
交叉连接:
*/
select * from beauty;
select * from boys;
select name,boyName from boys,beauty
where beauty.boyfriend.id = boys.id;
一、#内连接
1。#等值连接
/*
》多表等值连接的结果为多表的交集部分
》n表连接,至少需要n-1个连接条件
》多表的顺序没有要求
》一般需要为表起别名
》可以搭配前面介绍的所有子句使用,比如排序、分组、筛选
*/
#案例1:查询女神名和对应的男神名
select NAME,boyName
from boys,beauty
where beauty.bofriend_id = boys.id;
#案例2:查询员工名和对应的部门名
select last_name,department_name
from employees,departments
where employees.'department_id' = departments.'department_id';
#2。为表其别名
/*
提高语句的简洁度
区分多个重名的字段
注意:如果为表起了别名,则查询的字段就不能使用原来的表名去限定
*/
#查询员工名,工种号,工种名
[没起名字]
select last_name,employees.job_id,job_title
from employees,jobs
where employees.'job_id' =jobs.'job_id';
[起名字]
select e.last_name,e.job_id,j.job_title
from employees as e,jobs as j
where e.'job_id' =j.'job_id';
#3.两个表的顺序是否可以调换【可以】
#查询员工名、工种号、工种名
select e.last_name,e.job_id,j.job_title
from jobs as j,employees as e
where e.'job_id' = j.'job_id';
#4.可以加筛选条件
#案例:查询有奖金的员工名、部门名显示奖金率
select last_name,department_name,commission_pct
from employees as e,departments as d
where e.'department_id' = d.'department_id'
and e.'commiddion_pct' is not null;
#5.可以添加分组
#案例1:查询每个城市的部门个数
select count(*) as 个数,city
from departments as d,locations as l
where d.'location_id' = l.'location_id'
group by city;
#案例2:查询有奖金的每个部门名和部门的领导编号和该部门的最低工资
select department_name,d.'manager_id',min(salary)
from departments as d,employees as e
where d.'department_id' = e.'department_id'
and commission_pct is not nul
group by department_name,d.'manager_id';
#6.可以添加排序
#案例:查询每个工种的公众名和员工的个数,并且按与纳贡个数降序
select job_title,count(*)
from employees as e,jobs as j
where e.'job_id' = j.'job_id'
group by job_title
order by count(*) desc;
#7.可以实现三表连接
#案例:查询员工名、部门名和所在的城市
select last_name,department_name,city
from employee as e,departments as d,locations as l
where e.'department_id' = d.'department_id'
and d.'location_id' = l.'location_id'
and city like 's%'
order by department_name desc;
###################
#2.非等值连接
#案例1:查询员工的工资和工资级别
select salary,grade_level
from employees as e,job_grades as g
where salary between g.'lowest_sal' and g.'highest_sal'
and g.'grade_level' = 'A';
#3.自连接
#实例:查询员工名和上级的名称
select e.empoyee_id,e.last_name,m.employee_id,m.last_name
from employee as e,employees m
where e.'manager_id' = m.'employee_id';