Mysql基础

数据库存储数据的优点:

  • 可存储大量数据;

  • 方便检索;

 数据种类

层次结构模型数据库;

网状结构模型数据库;

关系结构**模型数据库:使用二维表格来存储数据;

关系-对象模型数据库;

MySQL就是关系型数据库!

任何数据库语句里都有四种语句

  • DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等;

  • DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据);

  • DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别;

  • DQL(Data Query Language):数据查询语言,用来查询记录(数据)。

这些sql语句都有语法要求:

  • SQL语句可以单行或多行书写,以分号结尾;

  • 可以用空格和缩进来来增强语句的可读性;

  • 关键字不区别大小写,建议使用大写;

DDL,DML,DCL都是比较基础的,就不展开说了,最主要的的是DQL

DQL的语法

SELECT selection_list /*要查询的列名称*/

 FROM table_list /*要查询的表名称*/

 WHERE condition /*行条件*/

 GROUP BY grouping_columns /*对结果分组*/

 HAVING condition /*分组后的行条件*/

 ORDER BY sorting_columns /*对结果分组*/

 LIMIT offset_start, row_count /*结果限定*/

执行顺序是

FROM -> WHERE-> GROUP BY-> HAVING->SELECT-> ORDER BY->LIMIT

DQL有很多查询

基础查询,条件查询,模糊查询,字段控制查询,排序,分组查询,分页查询等

基础查询

SELECT * FROM stu;

SELECT 字段1, 字段2, 字段3 ... FROM 表名 ;

SELECT sid, sname, age FROM stu;

条件查询

#使用where关键字
SELECT * FROM stu WHERE gender = 'female' AND ge < 50 ;

模糊查询

#使用关键字like
SELECT * FROM stu WHERE sname LIKE '_____';

字段控制查询

SELECT *,sal+IFNULL(comm,0) FROM emp;

SELECT 字段1 [ AS 别名1 ] , 字段2 [ AS 别名2 ] ... FROM 表名;
或者
SELECT 字段1 [ 别名1 ] , 字段2 [ 别名2 ] ... FROM 表名;

排序

#排序方式:ASC : 升序(默认值)  ,DESC: 降序
SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1 , 字段2 排序方式2 ,...;

分组查询

#使用GROUP BY  [ HAVING  ] 关键字
SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组 后过滤条件 ];

分页查询

#LIMIT 
SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数 ;

查询实例


CREATE TABLE emp (
  empno INT,
  ename VARCHAR (50),
  job VARCHAR (50),
  mgr INT,
  hiredate DATE,
  sal DECIMAL (7, 2),
  comm DECIMAL (7, 2),
  deptno INT
) ;

CREATE TABLE dept (
  deptno INT,
  dname VARCHAR (14),
  loc VARCHAR (13)
) ;

#查询出部门编号为30的所有员工
SELECT * FROM emp WHERE deptno=30;

#所有销售员的姓名、编号和部门编号
SELECT ename,empno,deptno FROM emp WHERE job='SALESMAN';

#找出奖金高于工资的员工
SELECT * FROM emp WHERE comm > sal;

#找出奖金高于工资60%的员工
SELECT * FROM emp WHERE comm > sal*0.6;

#找出部门编号为10中所有经理,和部门编号为20中所有销售员的详细资料
SELECT * FROM emp WHERE (deptno =10 and job ='MANAGER') or (deptno =20 and job ='SALESMAN');

#找出部门编号为10中所有经理,部门编号为20中所有销售员,还有即不是经理又不是销售员但其工资大或等于2000的所有员工详细资料
SELECT * FROM emp WHERE (job not in ('MANAGER','SALESMAN') and sal>=2000) or (deptno =10 and job ='MANAGER') or (deptno =20 and job ='SALESMAN');

#有奖金的岗位
SELECT job FROM emp WHERE comm != 0;

#无奖金或奖金低于500的员工
SELECT * FROM emp WHERE comm is null or comm<500;

#查询名字由五个字组成的员工
SELECT * FROM emp WHERE ename like'_____';

#查询1982年入职的员工
SELECT * FROM emp WHERE YEAR(hiredate)=1982;

#查询所有员工详细信息,用编号升序排序
SELECT * FROM emp ORDER BY empno

#查询所有员工详细信息,用工资降序排序,如果工资相同使用入职日期升序排序
SELECT * FROM emp ORDER BY sal DESC,hiredate ASC;

#查询每个部门的平均工资
SELECT deptno, AVG(sal) FROM emp GROUP BY deptno;

#求出每个部门的员工数量
SELECT deptno 编号,COUNT(*) 人数 FROM emp GROUP BY deptno;

#查询每个岗位的最高工资、最低工资、人数
SELECT job 岗位,MAX(sal) 最高工资,MIN(sal) 最低工资,COUNT(*) 人数 FROM emp GROUP BY job; 

#查询非销售人员工作名称以及从事同一工作雇员的月工资的总和,并且要满足从事同一工作的雇员的月工资合计大于2000,输出结果按月工资的合计升序排列
SELECT job,SUM(sal+IFNULL(comm,0)) FROM emp WHERE job!='SALESMAN' and sal+IFNULL(comm,0)>2000 GROUP BY job ORDER BY sal+IFNULL(comm,0) ASC;

#查出至少有一个员工的部门。显示部门编号、部门名称、部门位置、部门人数
SELECT  base.deptno 部门编号,base.dname 部门名称,base.loc 部门位置,count(1) 部门人数 FROM (SELECT e.*,d.dname,d.loc FROM emp e,dept d WHERE e.deptno=d.deptno)  base GROUP BY base.deptno ORDER BY base.deptno asc;

#列出工资比ALLEN高的所有员工
SELECT * FROM emp WHERE sal>(SELECT sal FROM emp WHERE ename ='ALLEN');

#列出所有员工的姓名及其直接上级的姓名
SELECT n.ename 员工,e.ename 上级 FROM emp e,(SELECT mgr,ename FROM emp WHERE mgr is not null) as n WHERE  e.empno = n.mgr;

#列出受雇日期早于直接上级的所有员工的编号、姓名、部门名称
SELECT  n.empno 编号,n.ename 姓名,d.dname 部门名称 FROM emp e,(SELECT * FROM emp WHERE mgr is not null)  n ,dept d WHERE  e.empno = n.mgr and n.hiredate > e.hiredate and d.deptno=n.deptno;

#列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门
SELECT e.*,d.dname FROM emp e, dept d WHERE e.deptno = d.deptno;
SELECT d.dname FROM dept d WHERE d.deptno not in (SELECT deptno FROM emp);

#列出所有文员(CLERK)的姓名及其部门名称,部门的人数
 #内连接写法
SELECT e.ename,d.dname,num FROM emp e JOIN dept d join (SELECT count(deptno) as num,deptno FROM emp GROUP BY deptno) as f ON e.deptno= d.deptno and job ='CLERK' WHERE f.deptno = d.deptno;

#列出最低薪金大于1500的各种岗位及从事此岗位的员工人数
SELECT min(sal),job,count(job) FROM emp GROUP BY job HAVING min(sal)>1500;

#列出在销售部(SALESMAN)工作的员工的姓名,假定不知道销售部的部门编号
SELECT ename FROM emp WHERE deptno in (SELECT deptno from dept where dname='SALES');

#25. 列出薪金高于公司平均薪金的所有员工信息,所在部门名称,上级领导,工资等级
SELECT e.*,d.dname 部门名称,f.ename 上级领导 FROM emp e, dept d, emp f where e.sal > ( SELECT AVG(sal) FROM emp ) and e.mgr=f.empno and d.deptno = e.deptno;

#列出与SMITH从事相同工作的所有员工及部门名称
SELECT e.*,d.dname 部门名称 from emp e, dept d where e.job in (SELECT job FROM emp where ename='SMITH') and ename <>'SMITH' and e.deptno = d.deptno;

#列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金、部门名称 
SELECT e.ename,e.sal,d.dname FROM emp e, dept d WHERE  e.deptno = d.deptno and sal >(SELECT max(sal) FROM emp WHERE deptno=30 GROUP BY deptno);

#列出在每个部门工作的员工数量、平均工资
SELECT count(1),AVG(sal)  FROM emp  GROUP BY deptno;

#SELECT num,AVG(e.sal) FROM emp e ,(SELECT count(deptno) as num,deptno FROM emp   GROUP BY deptno) d WHERE e.deptno=d.deptno GROUP BY e.deptno;









#1、	查询部门30中的所有员工
SELECT * FROM emp WHERE deptno =30;

#2、	列出所有“CLERK”的姓名,编号和部门
SELECT ename 姓名,empno 编号,dname 部门 FROM emp e, dept d WHERE job = 'CLERK';

#3、	找出提成高于薪水的员工
SELECT * FROM emp WHERE comm > sal;

#4、	找出提成高于60%薪水的员工
SELECT * FROM emp WHERE comm > sal*0.6;

#5、	找出部门10所有经理和部门20中所有办事员(CLERK)的详细资料
SELECT * FROM emp WHERE (deptno =10 and job='MANAGER') or (deptno =20 and job='CLERK');

#6、	找出没有提成或提成低于100的员工
SELECT * FROM emp WHERE (comm is null) or (comm <100);

#7、	显示所有雇员的姓名,工作和薪水,按工作的降序排序,而工作相同时按薪水的升序
SELECT * FROM emp ORDER BY job desc,sal asc;

#8、	显示姓名中包含“A“的所有员工的姓名,
SELECT ename FROM emp WHERE ename like '%A%';

#9、	显示正好为6个字符的雇员姓名
SELECT ename FROM emp WHERE ename like '______';

#10、显示不带‘R’的雇员
SELECT ename FROM emp WHERE ename not like '%R%';

#11、显示所有员工的姓名前三个字符
SELECT SUBSTR(ename,1,3) FROM emp;

#12、显示所有员工的姓名,用‘A’替换所有‘a’
SELECT REPLACE(ename,'A','a') FROM emp  

#13、部门编号为20的部门名,以及该部门的所有员工的姓名,薪水和岗位
SELECT ename,sal,job FROM emp WHERE deptno = 20;

#14、在DALLAS工作的所有员工名,工资和部门名
SELECT ename,sal,d.dname FROM emp e,(SELECT deptno,dname FROM dept WHERE loc ='DALLAS') d WHERE e.deptno = d.deptno ;

#15、员工SCOTT的经理的信息
SELECT * FROM emp WHERE empno = (SELECT mgr FROM emp WHERE mgr is not null);

#16. DISTINCT 去除重复值
#Create table dept_20 as select * from emp where deptno=20;
#Create table job_clerk as select * from emp where job ='CLERK';
#--1.使用dept_20和job_clerk获取部门20 或者岗位为CLERK的所有员工名,工资(不显示重复值)
SELECT ename,sal FROM dept_20 WHERE deptno=20 UNION ALL SELECT ename,sal FROM job_clerk WHERE job ='CLERK'

#--2. 使用dept_20和job_clerk获取部门20 或者岗位为CLERK的所有员工名,工资(显示重复值)
SELECT ename,sal FROM dept_20 WHERE deptno=20 UNION  SELECT ename,sal FROM job_clerk WHERE job ='CLERK'

#--3. 使用dept_20和job_clerk获取部门20并且岗位为CLERK的所有员工名,工资
SELECT ename,sal FROM dept_20 WHERE deptno=20 and job ='CLERK' UNION  SELECT ename,sal FROM job_clerk WHERE  deptno=20 and job ='CLERK';

#--4. 使用dept_20和job_clerk获取部门20但是岗位不为CLERK的所有员工名,工资
SELECT ename,sal FROM dept_20 WHERE deptno=20 and job not in ('CLERK') UNION  SELECT ename,sal FROM job_clerk WHERE  deptno=20 and job not in ('CLERK');

#17.列出至少有一个员工的所有部门名
SELECT dname FROM dept WHERE deptno in (SELECT deptno FROM emp GROUP BY deptno HAVING count(deptno)>1);

#18、列出薪水比‘SMITH’多的所有员工
SELECT * FROM emp WHERE sal >(SELECT sal FROM emp WHERE ename='SMITH');

#19、列出所有员工的姓名以及他的经理的姓名
SELECT d.ename 员工姓名,e.ename 经理姓名 FROM emp e,(SELECT mgr,ename FROM emp WHERE mgr is not null) d WHERE e.empno = d.mgr and e.job='MANAGER';

#20、列出入职日期早于他经理的所有员工的姓名
SELECT d.ename 员工姓名 FROM emp e ,(SELECT mgr,ename,hiredate FROM emp WHERE mgr is not null) d WHERE e.empno = d.mgr and d.hiredate>e.hiredate;

#21、列出各种工作的最低薪水,显示最低薪水大于1500的记录
SELECT min(sal) FROM emp GROUP BY job HAVING min(sal)>1500;

#22、列出薪水高于公司平均水平的所有员工
SELECT * FROM emp WHERE sal>(SELECT AVG(sal) FROM emp);

#23、列出与‘SCOTT’从事相同工作的所有员工
SELECT * FROM emp WHERE job = (SELECT job FROM emp WHERE ename='SCOTT') and ename <> 'SCOTT';

#24、列出某些员工的姓名和薪水,条件是他们的薪水等于部门30中任一员工的薪水
SELECT ename,sal FROM emp WHERE sal in (SELECT sal FROM emp WHERE deptno=30);

#25、列出每个部门的信息以及该部门中的雇员数量
SELECT d.*,count(e.deptno) FROM dept d,emp e WHERE e.deptno=d.deptno GROUP BY e.deptno;

#26、查询每个部门薪水低于改变部门最低薪水的员工的信息


#27、查询工资比岗位平均工资低的员工的信息
SELECT * FROM emp e WHERE e.sal < (SELECT AVG(sal) FROM emp c WHERE e.job = c.job GROUP BY job);

#28、查询EMP表中,工资第5位到第10位的员工信息
SELECT * FROM emp LIMIT 5,5;

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值