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() // 计数
order by 排序查询
SELECT * FROM student order by id ;(默认升序)
SELECT * FROM student order by id desc;(降序)
SELECT * FROM student order by id asc;(升序)
分组查询
SELECT * FROM student GROUP BY sex;
先分组后排序
SELECT * FROM student GROUP BY sex ORDER BY id ;
分组后添加条件
SELECT * FROM student GROUP BY sex HAVING age > 18;
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='陈二')
如果查询结果不唯一(ANY,ALL):
#列出至少有一个员工的所有部门。
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);
SELECT * FROM student WHERE id limit 1,1;
第一个参数是起始下标(从0开始)
第二个参数是返回的记录个数
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;
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;