1.判断
1. 这句话表示ename as name 可以不要这个as,同理后面的sal salary也是别名,而选项D的Annual Salary中间也有空格,程序会判断为as 但as不能连用,所以错误,选D
2.选B,因为null不能加上判断符号<> C显而易见
3.AB正确,因为sal salary为as别名,所以C错误,3无法找到
2.DESC
-- 查看表结构
DESC dept
DESC emp
3. select语句 流程控制函数
-- 显示所有部门信息
SELECT *
FROM dept
-- 显示所有雇员名及其全年收入
-- (2)显示所有雇员名及其全年收入13月(工资+补助),并指定列别名"年收入”
SELECT ename,(sal * 13)+IFNULL(comm,0) AS '年收入'
FROM emp
4.WHERE语句
-- 4.限制查询数据。
-- (1)显示工资超过2850的雇员姓名和工资。
SELECT ename,sal salary
FROM emp
WHERE sal > 2850
-- (2)显示工资不在1500到2850之间的所有雇员名及工资。
SELECT ename,sal salary
FROM emp
WHERE sal < 2850 AND sal > 1500
-- (3)显示编号为7566的雇员姓名及所在部门编号。
SELECT empno,ename,deptno
FROM emp
WHERE empno IN (7566)
-- (4)显示部门10和30中工资超过1500的雇员名及工资。
SELECT ename,sal salary,deptno
FROM emp
WHERE deptno = 10 OR deptno = 30 AND sal > 1500
-- (5)显示无管理者的雇员名及岗位。
SELECT ename,job
FROM emp
WHERE mgr IS NULL
5.where语句,order by 排序
-- 5.排序数据。
-- (1)显示在1991年2月1日到1991年5月1日之间雇用的雇员名,岗位及雇佣日期,并以雇佣日期进行排序。I
SELECT ename,job,hiredate
FROM emp
-- WHERE hiredate >= '1991-2-1' AND hiredate <= '1991-5-1'
WHERE DATEDIFF(hiredate,'1991-2-1') >= 0 AND DATEDIFF(hiredate,'1991-5-1') <= 0
ORDER BY hiredate
-- (2)显示获得补助的所有雇员名工资及补助,并以工资降序排序
SELECT ename,sal,comm
FROM emp
WHERE comm IS NOT NULL
ORDER BY sal
6.基础的sql查询,函数调用
-- 1.选择部门30中的所有员工.
SELECT *
FROM emp
WHERE deptno = 30
-- 2.列出所有办事员(CLERK)的姓名,编号和部门门编号.
SELECT ename,empno,deptno
FROM emp
WHERE job = 'CLERK'
-- 3.找出佣金高于薪金的员工.
SELECT *
FROM emp
WHERE comm > sal
-- 4.找出佣金高于薪金60%的员工.
SELECT *
FROM emp
WHERE comm > (sal * 0.6)
-- 5.找出部门10中所有经理(MANAGER)和部门20中所有办事员(CLERK)的详细资料.
SELECT *
FROM emp
WHERE deptno = 10 AND job = 'MANAGER' OR deptno = 20 AND job = 'CLERK'
-- 6.找出部门10中所有经理(MANAGER)部门20中所有办事员(CLERK),还有既不是经理又不是办事员
-- 但其薪金大于或等于2000的所有员工的详细资料.
SELECT *
FROM emp
WHERE deptno = 10 AND job = 'MANAGER' OR deptno = 20 AND job = 'CLERK'
OR sal > 2000 AND job
-- 7.找出收取佣金的员工的不同工作.
SELECT DISTINCT job
FROM emp
WHERE comm IS NOT NULL
-- 8.找出不收取佣金或收取的佣金低于100的员工
SELECT *
FROM emp
-- where comm is null or comm < 100 -- 最好不要用null参与比较 改为下句
WHERE comm IS NULL OR IFNULL(comm,0) < 100
-- 9.找出各月倒数第3天受雇的所有员工.
-- 提示: last_day(日期), 可以返回该日期所在月份的最后一天
-- last_day(日期) - 2 得到日期所有月份的倒数第3天
SELECT *
FROM emp
WHERE LAST_DAY(hiredate) - 2 = hiredate
-- 10.找出早于12年前受雇的员工.
SELECT *
FROM emp
-- where abs(DATEDIFF(hiredate,CURRENT_DATE())) > 12 * 365
WHERE DATE_ADD(hiredate,INTERVAL 12 YEAR) < NOW()
-- 11.以首字母小写的方式显示所有员工的姓名.
SELECT CONCAT(LCASE(SUBSTRING(ename,1,1)), SUBSTRING(ename,2))
FROM emp
-- 12.显示正好为5个字符的员工的姓名.
SELECT *
FROM emp
WHERE LENGTH(ename) = 5
6.1
-- 13.显示不带有"R"的员工的姓名.
SELECT *
FROM emp
WHERE ename NOT LIKE '%R%'
-- 14.显示所有 员工姓名的前三个字符
SELECT SUBSTRING(ename,1,3)
FROM emp
-- 15.显示所有员工的姓名,用a替换所有"A"
SELECT REPLACE(ename,'A','a')
FROM emp
-- 16.显示满10年服务年限的员工的姓名和受雇日期.
SELECT ename,hiredate
FROM emp
WHERE DATE_ADD(hiredate,INTERVAL 12 YEAR) < NOW()
-- 17.显示员工的详细资料按姓名排序
SELECT *
FROM emp
ORDER BY ename
.
-- 18.显示员工的姓名和受雇日期,根据其服务年限,将最老的员工排在最前面.
SELECT ename,hiredate
FROM emp
ORDER BY hiredate
-- 19.显示所有员工的姓名、工作和薪金按工作降序排序,若工作相同则按薪金排序
SELECT ename,job,sal
FROM emp
ORDER BY job DESC,sal
-- 20.显示所有员工的姓名、加入公司的年份和月份按受雇日期所在月排序,若月份相同则将最早年份
-- 的员工排在最前面.
SELECT ename,YEAR(hiredate),MONTH(hiredate)
FROM emp
ORDER BY MONTH(hiredate),YEAR(hiredate)
-- 21.显示在一个月为30天的情况所有员工的日薪金,忽略余数.
SELECT ename,FLOOR (sal / 30) AS 'daySal'
FROM emp
ORDER BY daySal
-- 21.显示在一个月为30天的情况所有员工的日薪金,忽略余数.
SELECT ename,FLOOR (sal / 30) AS 'daySal' -- 使用ROUND四舍五入
FROM emp
ORDER BY daySal
-- 22.找出在(任何年份的)2月受聘的所有员工。
SELECT ename,hiredate
FROM emp
WHERE MONTH(hiredate) = 2
-- 23.对于每个员工,显示其加入公司的天数.
SELECT ename, hiredate , DATEDIFF(CURRENT_DATE,hiredate)
FROM emp
-- 24. 显示姓名字段的任何位置包含" A"的所有员工的姓名.
SELECT ename
FROM emp
WHERE ename LIKE '%A%'
-- 25.以年月日的方式显示所有员工的服务年限(大概)
SELECT ename,FLOOR(DATEDIFF(NOW(),hiredate) / 365 ) AS '工作年' ,
FLOOR(DATEDIFF(NOW(),hiredate) % 365 / 31) AS '工作月',
DATEDIFF(NOW(),hiredate) % 31 AS '工作日'
FROM emp
7.多表查询,子查询,子列
-- (1).列出至少有一个员工的所有部门
SELECT COUNT(*) AS c,deptno
FROM emp
GROUP BY deptno
HAVING c > 1
-- (2).列出薪金比"SMITH"多的所有员工。
SELECT *
FROM emp
WHERE sal > (
SELECT sal
FROM emp
WHERE ename = 'SMITH'
) -- 把该查询做一个子查询
-- (3).列出受雇日期晚于其直接上级的所有员工。
/*
先把emp表当做两张表 worker,leader
条件 1. worker.hiredate > leader.hiredate
*/
SELECT worker.ename AS '员工名字',worker.hiredate, leader.ename AS '领导名字',leader.hiredate
FROM emp worker,emp leader
WHERE worker.hiredate > leader.hiredate
AND worker.mgr = leader.empno
-- (4).列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门。
SELECT dname,emp.*
FROM dept -- 使用左连接 外连接
LEFT JOIN emp ON dept.deptno = emp.deptno
ORDER BY dname
-- (5).列出所有"CLERK" : (办事员)的姓名及其部门名称。
SELECT dname,emp.*
FROM emp,dept -- 使用左连接 外连接
WHERE emp.job = 'CLERK'
ORDER BY dname
-- (6).列出最低薪金大于1500的各种工作。
SELECT MIN(sal) AS min_sal , job
FROM emp
GROUP BY job
HAVING min_sal > 1500
-- (7).列出在部门"SALES"销售部) 工作的员工的姓名。
SELECT ename,dname
FROM emp,dept
WHERE emp.deptno = dept.deptno AND dname = 'SALES'
-- (8).列出薪金高于公司平均薪金的所有员工。
SELECT *
FROM emp
WHERE sal > (
SELECT AVG(sal)
FROM emp
)
-- (9).列出与"SCOTT"从事相同工作的所有员工。
SELECT *
FROM emp
WHERE job = (SELECT job
FROM emp
WHERE ename = 'SCOTT')
-- (10).列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金。
SELECT ename,sal
FROM emp
WHERE sal > (SELECT MAX(sal)
FROM emp
WHERE deptno = 30 /*先查出30号部门里最大的工资*/)
-- (11).列出在每个部门工作的员工数量、平均工资和平均服务期限。
SELECT COUNT(*) AS '各部门的员工数量',FLOOR(AVG(sal)) AS '平均工资',FLOOR (AVG(DATEDIFF(NOW(),hiredate))) AS '平均服务期限'
FROM emp
GROUP BY deptno
-- (11).列出在每个部门工作的员工数量、平均工资和平均服务期限。
SELECT COUNT(*) AS '各部门的员工数量',
FORMAT(AVG(sal),2) AS '平均工资',
FORMAT (AVG(DATEDIFF(NOW(),hiredate)) / 365,2) AS '平均服务期限(年)'
FROM emp
GROUP BY deptno
-- (12).列出所有员工的姓名、部门名称和工资。
SELECT *
FROM emp
JOIN dept ON emp.deptno = dept.deptno
-- (13).列出所有部门的详细信息和部门人数。
SELECT dept.*,c
FROM dept,(SELECT COUNT(*) AS c,deptno
FROM emp
GROUP BY deptno /*-- 看作子查询*/)tmp
WHERE tmp.deptno = dept.deptno
-- (14).列出各种工作的最低工资。
SELECT MIN(sal),job
FROM emp
GROUP BY job
-- (15).列出MANAGER (经理)的最低薪金。
SELECT MIN(sal),job
FROM emp
WHERE job = 'MANAGER'
GROUP BY job
-- (16).列出所有员工的年工资,按年薪从低到高排序。
SELECT ename,(sal + IFNULL(comm,0)) * 12 yearSal
FROM emp
ORDER BY yearSal
8.综合
-- 完成最后一个综合的练习
-- 8. 设学校环境如下:一个系有若干个专业,每个专业一年只招一个班,每个班有若干个学生。
-- 现要建立关于系、学生、班级的数据库,关系模式为:
-- 班CLASS (班号classid,专业名subject,系名deptname,入学年份enrolltime,人数num)
-- 学生STUDENT (学号studentid,姓名name,年龄age,班号classid)
-- 系 DEPARTMENT (系号departmentid,系名deptname)
-- 试用SQL语言完成以下功能: homework05.sql 10min
--
-- (1) 建表,在定义中要求声明:
-- (1)每个表的主外码。
-- (2)deptname是唯一约束。
-- (3)学生姓名不能为空。
-- 创建表 系 DEPARTMENT (系号departmentid,系名deptname)
CREATE TABLE DEPARTMENT (
departmentid VARCHAR(32) PRIMARY KEY,
deptname VARCHAR(32) UNIQUE NOT NULL);
-- 班CLASS (班号classid,专业名subject,系名deptname,入学年份enrolltime,人数num)
CREATE TABLE `class` (
classid INT PRIMARY KEY,
`subject` VARCHAR(32) NOT NULL DEFAULT '',
deptname VARCHAR(32) , -- 外键字段,在表定义后指定
enrolltime INT NOT NULL DEFAULT 2000,
num INT NOT NULL DEFAULT 0,
FOREIGN KEY (deptname) REFERENCES DEPARTMENT(deptname));
-- 学生STUDENT (学号studentid,姓名name,年龄age,班号classid)
CREATE TABLE hsp_student (
studentid INT PRIMARY KEY,
`name` VARCHAR(32) NOT NULL DEFAULT '',
age INT NOT NULL DEFAULT 0,
classid INT, -- 外键
FOREIGN KEY (classid) REFERENCES `class`(classid));
-- 添加测试数据
INSERT INTO department VALUES('001','数学');
INSERT INTO department VALUES('002','计算机');
INSERT INTO department VALUES('003','化学');
INSERT INTO department VALUES('004','中文');
INSERT INTO department VALUES('005','经济');
INSERT INTO class VALUES(101,'软件','计算机',1995,20);
INSERT INTO class VALUES(102,'微电子','计算机',1996,30);
INSERT INTO class VALUES(111,'无机化学','化学',1995,29);
INSERT INTO class VALUES(112,'高分子化学','化学',1996,25);
INSERT INTO class VALUES(121,'统计数学','数学',1995,20);
INSERT INTO class VALUES(131,'现代语言','中文',1996,20);
INSERT INTO class VALUES(141,'国际贸易','经济',1997,30);
INSERT INTO class VALUES(142,'国际金融','经济',1996,14);
INSERT INTO hsp_student VALUES(8101,'张三',18,101);
INSERT INTO hsp_student VALUES(8102,'钱四',16,121);
INSERT INTO hsp_student VALUES(8103,'王玲',17,131);
INSERT INTO hsp_student VALUES(8105,'李飞',19,102);
INSERT INTO hsp_student VALUES(8109,'赵四',18,141);
INSERT INTO hsp_student VALUES(8110,'李可',20,142);
INSERT INTO hsp_student VALUES(8201,'张飞',18,111);
INSERT INTO hsp_student VALUES(8302,'周瑜',16,112);
INSERT INTO hsp_student VALUES(8203,'王亮',17,111);
INSERT INTO hsp_student VALUES(8305,'董庆',19,102);
INSERT INTO hsp_student VALUES(8409,'赵龙',18,101);
SELECT * FROM department
SELECT * FROM class
SELECT * FROM hsp_student
-- (3) 完成以下查询功能
-- 3.1 找出所有姓李的学生。
-- 查表 hsp_student , like
SELECT *
FROM hsp_student
WHERE `name` LIKE '李%'
-- 3.2 列出所有开设超过1个专业的系的名字。
-- 1. 先查询各个系有多少个专业
SELECT COUNT(*) AS nums, deptname
FROM class
GROUP BY deptname HAVING nums > 1
-- 3.3 列出人数大于等于30的系的编号和名字。
-- 1. 先查出各个系有多少人, 并得到 >= 30 的系
SELECT SUM(num) AS nums, deptname
FROM class
GROUP BY deptname
HAVING nums >= 30
-- 2. 将上面的结果看成一个临时表 和 department 联合查询即可
SELECT tmp.*, department.departmentid
FROM department , (
SELECT SUM(num) AS nums, deptname
FROM class
GROUP BY deptname
HAVING nums >= 30
) tmp
WHERE department.deptname = tmp.deptname;
-- (4) 学校又新增加了一个物理系,编号为006
-- 添加一条数据
INSERT INTO department VALUES('006','物理系');
-- (5) 学生张三退学,请更新相关的表
-- 分析:1. 张三所在班级的人数-1 2. 将张三从学生表删除 3. 需要使用事务控制
-- 开启事务
START TRANSACTION;
-- 张三所在班级的人数-1
UPDATE class SET num = num - 1
WHERE classid = (
SELECT classid
FROM hsp_student
WHERE NAME = '张三'
);
DELETE
FROM hsp_student
WHERE NAME = '张三';
-- 提交事务
COMMIT;
SELECT * FROM hsp_student;
SELECT * FROM class