MySQL的基础问答

#分组过滤  
#HAVING  注意:having写到group by后面,且只能搭配group by来使用
#统计60、70、90号部门的最高工资
#思路:
#1).	确定分组依据(department_id)
select DEPARTMENT_ID from t_employees GROUP BY DEPARTMENT_ID ;
#2).	对分组后的数据,过滤出部门编号是60、70、90信息
select * from t_employees where DEPARTMENT_ID IN (60,70,90);

select DEPARTMENT_ID from t_employees GROUP BY DEPARTMENT_ID HAVING DEPARTMENT_ID IN (60,70,90);
#3).	max()函数处理
select DEPARTMENT_ID,MAX(SALARY) from t_employees GROUP BY DEPARTMENT_ID HAVING DEPARTMENT_ID IN (60,70,90);

#限制查询  limit 起始行,条数   起始从0开始
#查询表中前五名员工的所有信息
select * from t_employees LIMIT 0,5;
#查询表中从第四条开始,查询 10 行
select * from t_employees limit 3,10;
#场景:分页显示
#需求:通过限制查询进行分页显示,每页显示5条,从第一页开始
#第一页:
select * from t_employees limit 0,5;
#第二页:
select * from t_employees limit 5,10;

#第三页:
select * from t_employees LIMIT 10,5;
#规则:根据传入的第几页,要求出起始行
#4页-->(当前页-1)*每页条数
select * from t_employees

#子查询(单行单例)
#查询工资大于Bruce 的员工信息
select salary from t_employees where  first_NAME='Bruce';
#1.先查询到 Bruce 的工资(一行一列)

#2.查询工资大于 6000 的员工信息
select * from t_employees where salary>6000;
#组合
select * from t_employees where salary>(select salary from t_employees where  first_NAME='Bruce');

#枚举子查询---子查询为多行单列
#查询与名为'King'同一部门的员工信息
#1.	先查询 'King' 所在的部门编号(多行单列)
select DEPARTMENT_ID from t_employees where last_NAME='King';
#2.	再查询80、90号部门的员工信息
select * from t_employees where DEPARTMENT_ID in(80,90);
#组合
select * from t_employees where DEPARTMENT_ID in (select DEPARTMENT_ID from t_employees where last_NAME='King');
#关键子ALL 和 ANY  ALL表示高于所有   ANY表示高于部分(用在多行单列中)
#工资高于60部门所有人的信息
#1.查询 60 部门所有人的工资(多行单列)
select salary from t_employees where DEPARTMENT_ID =60;
#2.查询高于 60 部门所有人的工资的员工信息(高于所有)
select * from t_employees where salary>all(select salary from t_employees where DEPARTMENT_ID =60);

#。查询高于 60 部门的工资的员工信息(高于部分)比最低的要高即可
select * from t_employees where salary>any(select salary from t_employees where DEPARTMENT_ID =60);

#多行多列子查询
#查询员工表中工资排名前 5 名的员工信息
#1.	先对所有员工的薪资进行排序(排序后的临时表)
select * from t_employees order by salary DESC;
#2.	再查询临时表中前5行员工信息
select * from(select * from t_employees order by salary DESC) e limit 0,5;

#注意:此题为了说明多行多列子查询而设计;实际上此题可以直接简化查询


#需要先创建t1,t2两张表: 添加一些测试数据
#合并  UNION 去掉重复记录

#UNION ALL  不去重

#表的连接查询: JOIN  ON
#1.内连接方式: INNER JOIN  ON
#1.查询所有有部门的员工信息(不包括没有部门的员工) SQL 标准
select * from t_employees e INNER JOIN t_departments d on e.DEPARTMENT_ID=d.DEPARTMENT_ID;
#2.查询所有有部门的员工信息(不包括没有部门的员工) MYSQL
??
#三表连接查询:
#查询所有员工工号、名字、部门名称、部门所在国家ID
select * from t_employees e INNER JOIN t_departments d on e.DEPARTMENT_ID=d.DEPARTMENT_ID INNER JOIN t_locations l on l.location_id=d.LOCATION_ID;

#左外连接:以左表为标准都要查出来,右表匹配不上则为null
#查询所有员工信息,以及所对应的部门名称(没有部门的员工,也在查询结果中,部门名称以NULL 填充)
select * from t_employees e left JOIN t_departments d on e.DEPARTMENT_ID=d.DEPARTMENT_ID;

#右外连接:以右表为标准都要查出来,左表匹配不上则为null
#查询所有部门信息,以及此部门中的所有员工信息(没有员工的部门,也在查询结果中,员工信息以NULL 填充)
select * from t_employees e RIGHT  JOIN t_departments d on e.DEPARTMENT_ID=d.DEPARTMENT_ID;

#增删改DML操作---添加
#添加一条工作岗位信息   返回得显示1,表示有一个记录成功添加
insert into t_jobs (job_id,job_title,min_salary,max_salary) values('AXX','President',1000,2000);

select * from t_jobs;

#修改
#修改编号为100 的员工的工资为 25000
update t_employees set salary=2500 where EMPLOYEE_ID=100;
select * from t_employees;
#修改编号为135 的员工信息岗位编号为 ST_MAN,工资为3500
update t_employees set DEPARTMENT_ID='ST_MAN',salary=3500 where EMPLOYEE_ID=134
select * from t_employees;
#删除
#删除编号为135 的员工
delete from t_employees where employee_id=136;

#删除姓Steven,并且名为 King 的员工
delete from t_employees where FIRST_name='Steven' and last_name='King';

#主键约束: 用于确定一条记录的唯一性,往往一张表中只有一个字段需要设置主键约束,且是第一个id字段
#设置了主键后,必须确保该字段不能为null
#主键自增长  主键从1开始自增长   一般主键和自增长会搭配使用,方便设置主键
create table text1(
  id int primary key auto_increment,
	name varchar(20) not null,
	salary int not null
)
select * from text1;
#唯一约束  确保某个指定字段的唯一性, 主键约束也是唯一约束,只是有区别; 唯一约束可以设置多个字段
#唯一约束可以设置为null
#1.非空约束
#2.默认值约束   不添加该字段则为默认值,添加了则改变了值
create table text2(
  id int primary key auto_increment,
	name varchar(20) UNIQUE not null ,
	salary int UNIQUE not null default 20
)
select * from text2;
insert into text2(name,salary) values('zs',2000);

#外键约束  一定要有两张表:一张主表,另一种从表  例如专业表和课程表

#规则: 主表先创建表,并先添加数据     删表时从表先删除
#如何确定主表和从表: 关联字段-关联字段中的主键就是在主表中;关联字段的非主键(外键)就是在从表中

#外键约束的是什么?  约束外键的值,一定是主键中存在的; 还有约束上述的规则

#创建主表: 专业表    
create table t4(
	sid int primary key auto_increment,
	name varchar(20) UNIQUE not null 
	
)
#创建从表:课程表
create table t5(
	id int primary key auto_increment,
	name varchar(20) UNIQUE not null ,
	s_id int,
	CONSTRAINT my_id foreign key(s_id) references t4(sid)
)
  #约束 名字  外键(s_id) 引用主表中的主键
insert into t4(name) VALUES('zs');
insert into t4(name) VALUES('ls');

#添加外键
insert into t4(name,sid) values('ww',5);

select * from t4;
#---------------------------------
#1 查询2张表的数据,使用内连接和左外连接
#INNER JOIN LEFT JOIN
select * from emp;
select * from dept;
select d.dno,d.dname,e.eno,e.ename from emp e INNER JOIN dept d ON e.dno=d.dno;
select d.dno,d.dname,e.eno,e.ename from emp e LEFT JOIN dept d ON e.dno=d.dno;
#2 查询部门101和105部门所有员工工资,并按照降序排列
#相当于是多行多列的子查询,一张虚拟表的查询,可用把查询结果放在from后,作为一张虚拟表
select dno,salary from emp where dno IN(101,105);
select dno,salary from (select dno,salary from emp where dno IN(101,105)) e ORDER BY salary DESC;

#3 查询部门101和105所有员工工资,并且按照工资降序排列,如果部门中工资相同,则按照性别排列(女在前)
select 
select dno,esex ,salary from emp where dno=101 or dno=105 ORDER BY salary DESC ,esex ASC;

#4 查询部门名称为主公的所有员工信息
select dno from dept where dname='主公' ;#单行单列
select * from emp where dno=(select dno from dept where dname='主公');

select *  from emp e inner JOIN  dept d ON e.dno=d.dno where d.dname='主公';
select * from emp e left JOIN  dept d ON e.dno=d.dno where d.dname='主公';

#5 查询102部门的所有员工人数
#看错题目了:谨慎,有个题没写出来
select * from emp where dno;
select COUNT(*) from emp where dno='102';
select COUNT(*) from emp e inner JOIN  dept d ON e.dno=d.dno where d.dno=102;

#6 查询105部门的平均工资
select dno,AVG(salary) from emp where dno='105';
select d.dno,AVG(salary) from emp e inner JOIN  dept d ON e.dno=d.dno where d.dno=105;

#7 查询103部门中工资最高的和最低的
select d.dno,MAX(salary) '最高的',MIN(salary) '最低的' from emp e inner JOIN  dept d ON e.dno=d.dno where d.dno=103;
select dno,MAX(salary) '最高的',MIN(salary) '最低的' from emp where dno=103;

#8 查询每一个部门的工资总和并按照降序排列
select SUM(salary) from emp GROUP BY dno;
select SUM(salary) from(select SUM(salary) from emp GROUP BY dno) e ORDER BY SUM(salary) DESC;

select d.dno,sum(salary) from emp e inner JOIN  dept d ON e.dno=d.dno GROUP BY d.dno;
select d.dno,sum(salary) from emp e inner JOIN  dept d ON e.dno=d.dno GROUP BY d.dno ORDER BY SUM(salary) DESC;

#9 查询每一个部门的工资总和,要求只显示总工资大于90w的部门信息
select dno,SUM(salary) from emp GROUP BY dno;
select dno,SUM(salary) from emp GROUP By dno HAVING SUM(salary)>900000;

select d.dno,sum(salary) from emp e inner JOIN  dept d ON e.dno=d.dno GROUP BY d.dno;
select d.dno,sum(salary) from emp e inner JOIN  dept d ON e.dno=d.dno GROUP BY d.dno HAVING SUM(salary)>900000;

 

#1、 查询Student表中的所有记录的Sname、Ssex和Class列。
 select * from student;
select sname,ssex,class from student;

#2、 查询教师所有的单位即不重复的Depart列。
select * from teacher;
select DISTINCT depart from teacher;

#3、 查询Student表的所有记录。
select * from student;

#4、 查询Score表中成绩在60到80之间的所有记录。
select * from score;
select * from score where degree>=60 and degree<=80;

#5、 查询Score表中成绩为85,86或88的记录。
select * from score 
select * from score where degree IN(85,86,89);
select degree from score GROUP BY  degree HAVING degree in (85,86,89);

#6、 查询Student表中“95031”班或性别为“女”的同学记录。
select * from student;
select * from student where class='95031' or ssex='女';

#7、 以Class降序查询Student表的所有记录。
select * from student;
select * from student ORDER BY class DESC;

#8、 以Cno升序、Degree降序查询Score表的所有记录。
select * from score;
select * from score ORDER BY cno ASC,degree DESC;

#9、 查询“95031”班的学生人数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值