12-27 周报:MySQL查询

MySQL 查询

1.常用的MySQL函数

1.数学函数 
  #随机数 
  rand()//范围0~1 
 SELECT rand();
  #截取小数点后几位数字
 truncate(需要修改的字段,剩下的小数位数) ; 
 SELECT TRUNCATE(money,0) FROM book ;
  #四舍五入
  round();
 SELECT ROUND(money) FROM book ;
 2.日期函数
  将时间转化为规定格式的字符串:
 SELECT DATE_FORMAT(now(),'%y年%m月%h:%i:%s')
  获取当前时间
 now();//年月日+时分秒
 curdate();//年月日
 curtime();//时分秒
3.流程控制函数
 
 (1):
 ifnull(字段,数据/字符串)  如果字段中有数据为空,则会返回‘,’后面的内容。 
 例如:
 select sal+ifnull(comm,0) from emp;

 (2):
 case
   when 条件 then "返回的数据"
   when 条件 then "返回的数据" 
   when 条件 then "返回的数据"
   else "以上条件都没有达到则返回的数据"
end 字段名

例如:
 SELECT 
	ename,
	sal, 
  CASE 
	WHEN sal<=2000 THEN '1级'
	WHEN sal>2000 THEN '2级'
	WHEN sal>=3000 THEN '3级'
	else '错误' 
END "工资级别"
	FROM emp;

4.聚合函数
 (1)min() //取最小值
 (2)max() //取最大值
 (3)sum() //求和
 (4)avg() //求平均数
 (5)count() // 计数

2.排序查询(order by)

  • order by 对查询的结果进排序。
  • 默认升序,desc 降序,asc 降序。
   order by 排序查询
   
  SELECT * FROM student order by id ;(默认升序)
  SELECT * FROM student order by id desc;(降序)
  SELECT * FROM student order by id asc;(升序)

3.分组查询()

  • 把查询的字段进行分祖,在字段值相同的分为一组。但只打印每组第一条数据
  • 可以先分组然后排序,但是不能先排序后分组
  • 如果分组后需要添加条件,需要使用 having
分组查询
 SELECT * FROM student GROUP BY sex;
先分组后排序
 SELECT * FROM student GROUP BY sex ORDER BY id ;
分组后添加条件
 SELECT * FROM student GROUP BY sex HAVING age > 18;
 

4.子查询

  • 一个语句的查询结果作为另一个语句的查询条件使用
  • 子查询必须查询的里面,并且整个子查询的过程要用()括起来
  • 子查询可以包含 GROUP BY , ORDER BY ,LIMIT ,函数等
  • 子查询的外层查询可以是:SELECT , INSERT , UPDATE SET , DO等
  • 当子查询返回的不是一个值时需要用到:

1.>any (大于子查询结果中的任意一个==大于最小值)
2. 3.>all (大于子查询结果中的所有数据 == 大于最大值)
4. 5.=any (等于子查询中任意一个结果即可)

1.SELECT sal FROM emp WHERE ename='陈二'; //查出名字为陈二的人的薪水
2.SELECT * FROM emp WHERE sal>1600;//查出薪水高于陈二的所有人

使用子查询:
	# 查询出所有薪水在'陈二'之上的所有人员信息。
	SELECT * FROM emp WHERE sal>(SELECT sal FROM emp WHERE ename='陈二')
如果查询结果不唯一(ANYALL):
    #列出至少有一个员工的所有部门。
	SELECT `dname` FROM dept WHERE deptno = ANY ( SELECT  deptno  FROM emp GROUP BY deptno);
    #列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金。
	SELECT ename ,sal FROM emp WHERE sal> ALL(SELECT sal FROM emp WHERE emp.deptno=30);

5.分页查询(limit)

SELECT * FROM student WHERE id limit 1,1;
第一个参数是起始下标(从0开始)
第二个参数是返回的记录个数

6.多表联查

  • inner join(内连接,或等值连接): 获取两个表中字段相匹配的记录。
  • left join (左连接):获取左边表的所有数据,即使右边没有对应匹配的数据。
  • right join(右连接):获取右边所有数据,即使左边没有相对应的数据。
  SELECT * FROM student INNER JOIN teacher ON s_id = t_id;
  SELECT * FROM student LEFT JOIN teacher ON s_id = t_id;
  SELECT * FROM student RIGHT JOIN teacher ON s_id = t_id;

7.模糊查询

  • 使用“%”(任意个任意字符) 使用 “_”(任意一个字符)
   SELECT * FROM student WHERE name LIKE "  %  _  "

练习题

#部门表
CREATE TABLE dept ( deptno INT PRIMARY KEY auto_increment COMMENT '部门编号', dname VARCHAR ( 14 ), #部门名字
loc VARCHAR ( 13 ) #地址
);#员工表
CREATE TABLE emp (
empno INT PRIMARY KEY auto_increment,#员工编号
ename VARCHAR ( 10 ),#员工姓名
job VARCHAR ( 9 ),#岗位
mgr INT,#直接领导编号
hiredate date,#雇佣日期,入职日期
sal INT,#薪水
comm INT,#提成
deptno INT NOT NULL,#部门编号
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 emp
VALUES
	( 7369, '刘一', '职员', 7902, '1980-12-17', 800, NULL, 20 );
INSERT INTO emp
VALUES
	( 7499, '陈二', '推销员', 7698, '1981-02-20', 1600, 300, 30 );
INSERT INTO emp
VALUES
	( 7521, '张三', '推销员', 7698, '1981-02-22', 1250, 500, 30 );
INSERT INTO emp
VALUES
	( 7566, '李四', '经理', 7839, '1981-04-02', 2975, NULL, 20 );
INSERT INTO emp
VALUES
	( 7654, '王五', '推销员', 7698, '1981-09-28', 1250, 1400, 30 );
INSERT INTO emp
VALUES
	( 7698, '赵六', '经理', 7839, '1981-05-01', 2850, NULL, 30 );
INSERT INTO emp
VALUES
	( 7782, '孙七', '经理', 7839, '1981-06-09', 2450, NULL, 10 );
INSERT INTO emp
VALUES
	( 7788, '周八', '分析师', 7566, '1987-06-13', 3000, NULL, 20 );
INSERT INTO emp
VALUES
	( 7839, '吴九', '总裁', NULL, '1981-11-17', 5000, NULL, 10 );
INSERT INTO emp
VALUES
	( 7844, '郑十', '推销员', 7698, '1981-09-08', 1500, 0, 30 );
INSERT INTO emp
VALUES
	( 7876, '郭十一', '职员', 7788, '1987-06-13', 1100, NULL, 20 );
INSERT INTO emp
VALUES
	( 7900, '钱多多', '职员', 7698, '1981-12-03', 950, NULL, 30 );
INSERT INTO emp
VALUES
	( 7902, '大锦鲤', '分析师', 7566, '1981-12-03', 3000, NULL, 20 );
INSERT INTO emp
VALUES
	( 7934, '木有钱', '职员', 7782, '1983-01-23', 1300, NULL, 10 );
	#1.列出至少有一个员工的所有部门。
	SELECT `dname` FROM dept WHERE deptno = ANY ( SELECT  deptno  FROM emp GROUP BY deptno);
	#2.列出薪金比"刘一"多的所有员工。
	SELECT ename FROM emp WHERE sal >(SELECT sal  FROM emp WHERE ename='刘一');
	#3. 列出所有员工的姓名及其直接上级的姓名。
	SELECT ename,(SELECT ename FROM emp e2 WHERE e1.mgr =e2.empno) mname FROM emp e1 ;
	# 4.列出受雇日期早于其直接上级的所有员工。
	SELECT ename FROM emp e1  WHERE hiredate<(SELECT hiredate FROM emp e2 WHERE e1.mgr =e2.empno);
	# 5.列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门。
	SELECT dname ,empno,ename,job,sal FROM dept LEFT JOIN emp ON dept.deptno=emp.deptno ;
	#  6.列出所有job为“职员”的姓名及其部门名称。
	SELECT ename ,dname FROM emp LEFT JOIN dept ON dept.deptno=emp.deptno WHERE job='职员';
	#7.列出最低薪金大于1500的各种工作。
	SELECT job FROM emp GROUP BY emp.job HAVING MIN(emp.sal)>1500;
	# 8.列出在部门 "销售部" 工作的员工的姓名,假定不知道销售部的部门编号。
	SELECT ename FROM emp LEFT JOIN dept ON dept.deptno=emp.deptno WHERE dept.dname='销售部';
	# 9.列出薪金高于公司平均薪金的所有员工。
	SELECT ename FROM emp e1 WHERE e1.sal> (SELECT AVG(e2.sal) FROM emp e2);
	# 10.列出与"周八"从事相同工作的所有员工。
	SELECT ename FROM emp e1 WHERE e1.job=(SELECT job FROM emp e2 WHERE ename='周八');
	# 11.列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金。
	SELECT ename ,sal FROM emp e1 WHERE e1.sal =ANY(SELECT e2.sal FROM emp e2 WHERE e2.deptno=30);
	#12.列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金。
	SELECT ename ,sal FROM emp WHERE sal> ALL(SELECT sal FROM emp WHERE emp.deptno=30);
	#13.列出在每个部门工作的员工数量、平均工资。
	SELECT dname ,(SELECT COUNT(ename) FROM emp WHERE emp.deptno=dept.deptno),(SELECT AVG(emp.sal) FROM emp WHERE emp.deptno=dept.deptno)FROM  dept;
	#14.列出所有员工的姓名、部门名称和工资。
	SELECT ename , dname , sal FROM emp LEFT JOIN dept ON emp.deptno=dept.deptno ;
	#15.列出所有部门的详细信息和部门人数。
	SELECT dname, loc ,(SELECT COUNT(ename) FROM emp  WHERE dept.deptno=emp.deptno)	FROM dept;
	# 16.列出各种工作的最低工资。
	SELECT job,(SELECT MIN(sal) FROM emp e2 WHERE e2.job=e1.job) FROM emp e1 GROUP BY job;
	#17.列出各个部门的 经理 的最低薪金
	SELECT dname,(SELECT MIN(sal) FROM emp WHERE emp.job='经理'AND dept.deptno=emp.deptno) FROM dept;
	#18.列出所有员工的年工资,按年薪从低到高排序。
	SELECT ename ,sal*12 FROM emp ORDER BY sal*12 ASC;
	#19.查出emp表中薪水在3000以上(包括3000)的所有员工的员工号、姓名、薪水
	SELECT empno,ename,sal FROM emp WHERE sal>3000 OR sal=3000;
	# 20.查询出所有薪水在'陈二'之上的所有人员信息。
	SELECT * FROM emp WHERE sal>(SELECT sal FROM emp WHERE ename='陈二')
	# 21.查询出emp表中部门编号为20,薪水在2000以上(不包括2000)的所有员工,显示他们的员工号,姓名以及薪水,以如下列名显示:员工编号 员工名字 薪水
	SELECT empno,ename,sal FROM emp WHERE sal>2000 AND emp.deptno=20;
	# 22.查询出emp表中所有的工作种类(无重复)
	SELECT job FROM emp GROUP BY job;
	# 23.查询出所有奖金(comm)字段不为空的人员的所有信息。
	SELECT * FROM emp WHERE comm IS NOT NULL
	# 24.查询出薪水在800到2500之间(闭区间)所有员工的信息。(注:使用两种方式实现and以及between and)
	SELECT * FROM emp WHERE sal>800 AND sal<2500;
	# 25.查询出员工号为7521,7900,7782的所有员工的信息。(注:使用两种方式实现,or以及in)
	SELECT * FROM emp WHERE empno IN (7521 ,7900 ,7782)
	# 26.查询出名字中有“张”字符,并且薪水在1000以上(不包括1000)的所有员工信息。
	SELECT * FROM emp WHERE ename LIKE '%张%' AND sal>1000;
	# 27.查询出名字第三个汉字是“多”的所有员工信息。
	SELECT * FROM emp WHERE ename LIKE '_多_';
	# 28.将所有员工按薪水升序排序,薪水相同的按照入职时间降序排序。
	SELECT * FROM emp  ORDER BY sal ASC, emp.hiredate DESC
	# 29.将所有员工按照名字首字母升序排序,首字母相同的按照薪水降序排序。 order by convert(name using gbk) asc; 
	SELECT * FROM emp ORDER BY CONVERT(ename USING gbk)  ASC ,sal DESC
	# 30.查询出最早工作的那个人的名字、入职时间和薪水。
	SELECT* FROM emp WHERE emp.hiredate = (SELECT MIN(emp.hiredate) FROM emp  )
	#31.显示所有员工的名字、薪水、奖金,如果没有奖金,暂时显示100.
	SELECT ename, sal, comm FROM emp 
	# 32.显示出薪水最高人的职位。
	SELECT job FROM emp WHERE sal =(SELECT MAX(sal) FROM emp)
	#33.查出emp表中所有部门的最高薪水和最低薪水,部门编号为10的部门不显示。
	SELECT emp.deptno, MAX(sal), MIN(sal) FROM emp GROUP BY deptno HAVING deptno<>10 ; 
	# 34.删除10号部门薪水最高的员工。
	DELETE  FROM emp WHERE deptno=10 AND sal = (SELECT max FROM ( SELECT MAX(sal) max FROM emp e1 WHERE deptno=10) s);
  #  35.将薪水最高的员工的薪水降30%。
  UPDATE emp SET sal=sal*0.7 WHERE sal= (SELECT max FROM (SELECT MAX(sal) max FROM emp) f);
	#36.查询员工姓名,工资和 工资级别(工资>=3000 为3级,工资>2000 为2级,工资<=2000 为1级)
  #语法:case when ... then ... when ... then ... else ... end
  SELECT 
	ename,
	sal, 
  CASE 
	WHEN sal<=2000 THEN '1级'
	
	WHEN sal>2000 THEN '2级'
	
	WHEN sal>=3000 THEN '3级'
	
	else '错误' 
END "工资级别"
	
	FROM emp;
 

你可能感兴趣的:(mysql)