MySQL学习01-基础语法以及练习

SQL语句:

DDL 数据定义语言(对数据库结构进行改变的语言)

​ 常用:alter改变 、drop 删除 、Create 创建

DML数据操作语言(增删改查)

​			 Insert:增加数据    insert into 表名(列名,列名……)values(值1,值2……)  后面的值要和列一一对应
  			 Update:更新数据    update 表名 set 列名=值,列名=值 where 条件……
  			 Delete:表示删除表格中的所有数据,表结构还有,操作会记入数据库日志
					delete from 表名 where 条件

​			 Trancat table:表示删除表格中的所有数据,表结构还有,只会剩下列名						(截断数据库表格,操作快速效率比delete高,但是操作不会记入数据库日志)
  			 Select:select查询    select列名,列名…… from 表格 where 条件

DCL**数据控制语言(一些授权语句)

			grant 权限 to user

			remove 权限 from user

TCL**事务控制语言

			commit rollback(回滚) savepoint(保存点)

			distinct去重,去掉重复的行
实例:

先创建一个数据库以及相关列表,员工列表emp和部门列表dept
在这里插入图片描述
在这里插入图片描述

create table emp(

empno int PRIMARY KEY,

ename VARCHAR(30) not null,

job VARCHAR(50) not null,

mgr int ,

hiredate date ,

sal int,

comm INT,

deptno int );



create table dept(

deptno int PRIMARY key,

dname VARCHAR(100) not null UNIQUE,

loc VARCHAR(200));



alter TABLE emp ADD CONSTRAINT fk_emp_deptno

FOREIGN KEY(deptno) REFERENCES dept(deptno);



insert into dept values(10,'教学部','济南');

insert into dept values(20,'实训中心','莱芜');

insert into dept values(30,'就业部','济南');

insert into dept values(40,'市场部','济南');

insert into dept values(50,'总经理办公室','济南');



select * from dept;



insert into emp values(1001,'李军','总经理',null,'2018-7-10',10000,2000,50);

insert into emp values(1002,'赵旭','班主任',1003,'2018-7-10',3000,2000,20);

insert into emp values(1003,'李萌','实训中心主任',1001,'2018-7-10',4000,2000,20);

insert into emp values(1004,'刘枫','教学总监',1001,'2018-7-10',15000,2000,10);

insert into emp values(1005,'王涛','嵌入式讲师',1004,'2018-7-10',5000,2000,10);

insert into emp values(1006,'实验者','班主任',1003,'2018-7-10',2888,2000,10);

insert into emp values(1005,'实验者二型','实训中心副主任',1001,'2018-7-10',5000,2000,20);


查找属于教学部的员工的信息

先到部门表中查询教学部的编号,再到员工表中查询谁的部门编号是教学部的

子查询:一个查询结果作为另一个查询的一部分出现

Select * from emp where deptno =(Select deptno from dept where dname=’教学部’)

多表连接查询:查询的内容或者条件出现在多个表格里面,先把多个表格整合成一张大的表格,然后从大的表格里面查询

​ 有低效率的交叉链接和高效率的内链接和外链接,前两个只会出现符合条件的记录

Select * from emp,dept(大表制作)where emp.deptno =dept.deptno(整合相同部门)

​ 或者 Select empno,ename,job,mgr,hiredate,sal,comm,emp.deptno from emp,dept(大表制作)where emp.deptno =dept.deptno(整合相同部门)

Select * from emp **cross join** dept where emp.deptno = dept.deptno and dname=‘教学部’ 交叉链接

Select * from emp **inner join** dept on emp.deptno = dept.deptno; 内链接

上面两种方法只会出现符合条件的对象

外链接特点:主表里面的记录一定会出现在结果里面(不符合条件的东西也会显示),例如下面的right就是指 dept是主表,如果是left的话则emp是主表

但是使用外链接的话,

Select * from emp **right** **outer join** dept on emp.depton = dept.deptno;(right是指右边的表格无论如何都会出现,outer join 是指外链接)

分组聚合查询

​ 1.查询总工资(select sum(sal+comm)),最大工资(max(sal)),最小工资(min(sal)),平均工资(avg(sal)), 最大工资和最小工资差额(max(sal)-min(sal)) from emp;

​ 2.查询各个部门的平均工资 先把所有的员工按照部门分组,然后在每一个组里面按聚合函数做计算

Select deptno, avg(sal) from emp group by deptno

Select *from emp;

​ 3.查询平均工资大于5000的部门信息(分组后再次过滤用HAVING)

Select * from dept where deptno in (Select deptno, avg(sal) from emp group by deptno HAVING avg(sal)>5000)

Where字句和Having有什么区别

​ 相同点:HAVING和WHERE都是对查询结果进行筛选,后面都可以进行条件判 断

​ 不同点:HAVING可用于GROUP BY后,WHERE不行

​ HAVING可用于聚合函数后,WHERE不行

​ HAVING是对分组后数据进行筛选,WHERE是对表数据进行筛选

子查询

Select 字段名, (子查询) from 表名;

作业题

#1列出至少有一个员工的所有部门
#SELECT dname from dept where EXISTS(select * from emp where emp.deptno = dept.deptno);

#2列出薪金比“王涛”多的所有员工
#SELECT ename FROM emp where sal > (SELECT sal from emp where ename='王涛');

#3列出所有员工的姓名及其直接上级的姓名,没有直接领导的员工,领导位置显示Boss
#select e1.ename,e2.ename from emp as e1,emp as e2 where e1.mgr=e2.empno;

#4列出受雇日期早于其直接上级的所有员工
#		select e1.ename,e2.ename from emp as e1,emp as e2 where e1.mgr=e2.empno and e1.hiredate<e2.hiredate;

#5列出部门名称和这些部门的员工信息,包括那些没有员工的部门。
#SELECT * from dept LEFT JOIN emp on dept.deptno = emp.deptno

#6列出所有job为“CLERK”(办事员)的姓名及其部门名称
#SELECT emp.ename,dept.dname FROM emp,dept 
#	WHERE emp.deptno=dept.deptno
#		AND emp.job='办事员'
#;

#7列出最低薪金大于1500的各种工作。
#SELECT distinct job from emp WHERE sal > 1500;

#8列出在部门“教学部”工作的员工的姓名,假定不知道教学部的部门编号。
#SELECT emp.ename from emp,dept WHERE emp.deptno=dept.deptno AND dept.dname='教学部'

#9列出薪金高于公司平均薪金的所有员工。
#SELECT * FROM emp WHERE sal > (SELECT avg(sal) from emp);

#10列出与“刘枫”从事相同工作的所有员工。
#SELECT * from emp WHERE job=(SELECT job FROM emp WHERE ename='刘枫');

#11列出薪金等于部门10中员工的薪金的所有员工的姓名和薪金。
#SELECT ename,sal FROM emp WHERE sal=ANY(SELECT sal FROM emp WHERE deptno=10);

#12列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金。
#SELECT ename,sal FROM emp WHERE sal>ANY(SELECT sal FROM emp WHERE deptno=30);

#13列出在每个部门工作的员工数量、平均工资和平均服务期限。
-- SELECT COUNT(emp.empno), avg(emp.sal) 
-- FROM dept 
-- LEFT JOIN emp
-- on emp.deptno=dept.deptno
-- GROUP BY dept.deptno;

#14列出所有员工的姓名、部门名称和工资。
-- SELECT emp.ename,emp.sal,dept.dname 
-- FROM dept
-- RIGHT OUTER JOIN emp
-- on emp.deptno=dept.deptno
-- GROUP BY emp.ename;

#15列出从事同一种工作但属于不同部门的员工的一种组合。
-- SELECT emp1.ename,emp2.ename,emp1.job,emp2.job,emp1.deptno,emp2.deptno
-- FROM emp AS emp1,emp AS emp2
-- WHERE emp1.job=emp2.job AND emp1.deptno<>emp2.deptno;

#16列出所有部门的详细信息和部门人数。
-- SELECT dept.deptno,dept.dname,dept.loc,COUNT(emp.empno)
-- FROM dept
-- LEFT JOIN emp
-- ON emp.deptno=dept.deptno
-- GROUP BY dept.deptno;

#17列出各种工作的最低工资。
-- SELECT job,min(sal)
-- FROM emp
-- GROUP BY job;

#18、列出各个部门的MANAGER(班主任)的最低薪金(job为MANAGER)
-- SELECT emp.deptno,dept.dname, min(sal)
-- FROM emp,dept
-- WHERE emp.deptno=dept.deptno AND emp.job='班主任'
-- GROUP BY emp.deptno;

#19列出所有员工的年工资,按年薪从低到高排序
-- SELECT emp.ename,(IFNULL(emp.comm,0)+sal)*12 AS NIAN
-- From emp 
-- ORDER BY NIAN;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值