一,复习
子句,建个商场表使用哪些字段,约束条件
二、函数
菜鸟教程函数:https://www.runoob.com/mysql/mysql-functions.html
回文~算法
三、第五章~练习题
练习1
1.写一个查询,分别计算100.456 四舍五入到小数点后第2位,第1位,整数位的值。
SELECT ROUND(100.456,2);
SELECT ROUND(100.456,1);
SELECT ROUND(100.456,0);
2.写一个查询,分别计算100.456 从小数点后第2位,第1位,整数位截断的值。
SELECT TRUNCATE(100.456,2);
SELECT TRUNCATE(100.456,1);
SELECT TRUNCATE(100.456,0);
两者的区别在于是否四舍五入,TRUNCATE不进行四舍五入操作!
练习2
1.显示所有员工姓名的前三个字符
SELECT SUBSTRING(ENAME,1,3) FROM emp;
2.显示正好为5个字符的员工的姓名,工资,部门号
SELECT ENAME,SAL,DEPTNO FROM emp WHERE CHAR_LENGTH(ENAME)=5;
练习3
1.写一个查询,用首字母大写,其它字母小写显示雇员的 ename,显示名字的长度,
并给每列一个适当的标签,条件是满足所有雇员名字的开始字母是J、A 或 M 的雇员,
并对查询结果按雇员的ename升序排序。(提示:使用length、substr)
SELECT LENGTH(ename) AS “名字长度”,CONCAT(UPPER(SUBSTR(ename,1,1)),LOWER(SUBSTR(ename,2,10))) AS “格式化名字”
FROM emp WHERE SUBSTR(ename,1,1) IN (‘J’,’A’,’M’) ORDER BY ename DESC;
2.查询员工姓名中中包含大写或小写字母A的员工姓名。
SELECT ename AS “员工姓名” FROM emp WHERE LOCATE(‘A’,ename) <> 0 OR LOCATE(‘a’,ename);
—不等于0,说明存在下标位置,即元素存在
3.显示所有员工的姓名,用a替换所有”A”
SELECT REPLACE(ename,’A’,’a’) FROM emp;
4.查询部门编号为10或20,入职日期在81年5月1日之后,并且姓名中包含大写字母A的员工姓名,员工姓名长度
SELECT LENGTH(ename),ename FROM emp WHERE LOCATE(‘A’,ename)<> 0 AND hiredate>’1981-5-1’ AND deptno IN (10,20);
5.查询每个职工的编号,姓名,工资
要求将查询到的数据按照一定的格式合并成一个字符串.
前10位:编号,不足部分用填充,左对齐
中间10位:姓名,不足部分用填充,左对齐
后10位:工资,不足部分用填充,右对齐
SELECT RPAD(empno,10,”“) “编号”,RPAD(ename,10,”“) “姓名”,LPAD(SAL,10,’‘) “工资” from emp;
练习4
1.查询服务器当前时间
SELECT SYSDATE();
2.查询部门10,20的员工截止到2000年1月1日,工作了多少个月,入职的月份。
SELECT ROUND((DATEDIFF(‘2000-1-1’,hiredate)/30)),MONTH(hiredate) AS “入职月份” FROM emp WHERE deptno IN (10,20);
3.如果员工试用期6个月,查询职位不是MANAGER的员工姓名,入职日期,转正日期,入职日期是第多少月,第多少周
SELECT ename,hiredate,ADDDATE(hiredate,INTERVAL 6 MONTH) AS “转正日期”,MONTH(hiredate),WEEKOFYEAR(hiredate) “入职周”
FROM emp
WHERE JOB NOT IN(“MANAGER”);
课后作业
1.计算2000年1月1日到现在有多少月,多少周(四舍五入)。
SELECT ROUND(DATEDIFF(SYSDATE(),”2000-1-1”)/30) AS “月份差值”,ROUND(DATEDIFF(SYSDATE(),”2000-1-1”)/7) AS “周数”;
2.查询员工ENAME的第三个字母是A的员工的信息(使用2个函数)。
SELECT *FROM emp WHERE STRCMP(SUBSTR(ename ,3 , 1),”A”)=0 ;
3.使用trim函数将字符串‘hello’、‘ Hello ’、‘bllb’、‘ hello ’分别处理得到下列字符串ello、Hello、ll、hello。
SELECT TRIM(‘h’ FROM’hello’);
SELECT TRIM(‘ Hello ‘);
SELECT TRIM(‘b’ from ‘bllb’);
SELECT TRIM(‘ hello ‘);
4.将员工工资按如下格式显示:123,234.00 RMB 。
SELECT FORMAT(sal,3) AS “工资” FROM emp ;
mysql的where执行顺序从左往右执行,把严苛的条件放在前面。
四、第六章~练习题
练习1
1.写一个查询,显示所有员工姓名,部门编号,部门名称。
SELECT e.ename AS “员工姓名”,d.deptno “部门编号”,d.dname “部门名称”
FROM emp e,dept d WHERE e.deptno=d.deptno;
2.写一个查询,显示所有工作在CHICAGO并且奖金不为空的员工姓名,工作地点,奖金
SELECT e.ename “员工姓名”,d.loc “工作地点”,e.comm “奖金”
FROM emp e,dept d WHERE e.deptno=d.deptno;
3.写一个查询,显示所有姓名中含有A字符的员工姓名,工作地点。
SELECT e.ename,d.loc
FROM emp e,dept d
WHERE e.deptno=d.deptno AND LOCATE(‘A’,ename)<>0;
练习2
1.查询每个员工的编号,姓名,工资,工资等级,所在工作城市,按照工资等级进行升序排序。
SELECT e.empno “员工编号”,e.ename “员工姓名”,e.sal “员工薪资”,s.grade “员工等级”,d.loc “所在工作城市”
FROM emp e LEFT JOIN dept d ON d.deptno=e.deptno
JOIN salgrade s
WHERE sal BETWEEN losal AND hisal ORDER BY s.grade ASC;
练习3
1.查询所有工作在NEW YORK和CHICAGO的员工姓名,员工编号,以及他们的经理姓名,经理编号。
SELECT e.ename “姓名”,e.empno “员工编号”,d.dname “经理姓名”,d.deptno “经理编号”,d.loc
FROM emp e,dept d
WHERE e.deptno=d.deptno AND d.loc IN (“NEW YORK”,”CHICAGO”);
课后作业:
1.显示员工SMITH的姓名,部门名称,直接上级名称
SELECT e.ename “员工名字”,m.ename AS “直接上级名字”,d.dname AS “部门名称”
FROM emp e,emp m,dept d
WHERE e.mgr=m.empno
AND e.ename=”SMITH”
AND e.deptno=d.deptno ;
2.显示员工姓名,部门名称,工资,工资级别,要求工资级别大于4级。
SELECT e.ename “姓名”,d.dname “部门名称”,e.sal “工资”,s.grade “等级”
FROM emp e,dept d,salgrade s
WHERE s.grade>1
AND e.deptno=d.deptno
AND e.sal BETWEEN s.losal AND s.hisal;
3.显示员工KING和FORD管理的员工姓名及其经理姓名。
SELECT e.ename “姓名”,m.ename “经理名字”, d.ename “管理的员工姓名”
FROM emp m
JOIN emp e ON e.mgr=m.empno
JOIN emp d ON e.empno=d.mgr
WHERE e.ename IN (“KING”,”FORD”);
SELECT A.ENAME ‘员工’, B.ENAME ‘经理’, C.ENAME ‘管理的员工’ FROM emp A
LEFT JOIN emp B ON A.MGR = B.EMPNO
JOIN emp C ON A.EMPNO = C.MGR
WHERE A.ENAME in (‘KING’, ‘FORD’);
4.显示员工姓名,参加工作时间,经理名,参加工作时间,要求参加时间比经理早。
SELECT e.ename AS “员工姓名”,m.ename AS “经理姓名”,e.hiredate AS “参加工作时间”
FROM emp e
JOIN emp m ON e.mgr=m.empno
WHERE e.hiredate<m.hiredate;
