这道题暂时没有弄明白,这两天有空就看看,然后补充上
SQL15 查找employees表emp_no与last_name的员工信息
SQL 15 题目 SQL 15 题目
题目:查找employees表所有emp_no为奇数,且last_name不为Mary的员工信息,并按照hire_date逆序排列
题意:每个title下,emp_no重复的员工忽略不计
方法1:使用%
SELECT *
FROM employees
WHERE emp_no % 2 = 1
AND last_name<>'Mary'
ORDER BY hire_date DESC;
补充:emp_no % 2=1也可以改成MOD(emp_no, 2)=1,但是某些sql版本可能不支持后者(比如题库就不支持)
补充:不相等有三种表示方式:<>、!=、IS NOT
注意:last_name是varchar类型,所以对它的判断需要加上单引号
方法2:使用&
SELECT *
FROM employees
WHERE emp_no & 1
AND last_name<>'Mary'
ORDER BY hire_date DESC;
补充:sql中/表示标准除法,如101/2得到50.5,而DIV表示整数除法,如101 DIV 2得到50
补充:奇偶数查询:参考资料:https://blog.csdn.net/ccStroy/article/details/78061861
查询奇数的一般方法:如上(最好是位运算&)
查询偶数的一般方法:emp_no=(emp_no>>1<<1)
但是,以上的一般方法,针对的是字段全是数字的情况,如果对于身份证这种中间隐藏了一部分的,积极无法使用
所以更好的方法是使用正则化表达式(当然题库这里无法使用正则化表达式,可能是版本或设置问题)
查询奇数的正则化方法:emp_no REGEXP ‘[13579]
补充:顺便说一下正则化表达式:
^aa:以aa开头
aa$:以aa结尾
.:匹配任何字符
[abc]:[字符集合],包含中括号内的字符
[^abc]或[!abc]:[字符集合],不包含中括号内的字符
a|b|c:匹配a或b或c,如(中|美)国
:匹配前面的子表达式0次或者多次。如,zo能匹配’z’以及’zoo’。*等价于{0,}
+:匹配前面的子表达式1次或者多次。如,’zo+’能匹配’zo’,但不能匹配’z’。+等价于{1,}
{n}:n是一个非负整数,匹配前面的子表达式2次。如,o{2} 能匹配’food’中的两个o,但不能匹配’Bob’中的o
{n, m}:m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。
SQL16 统计出当前各个title类型对应的员工当前薪水对应的平均工资
SQL 16 题目 SQL 16 题目 SQL 16 题目
解答:
使用:INNER JOIN+GROUP BY
不要忘记时间是 :“当前!!!”
SELECT t.title, AVG(salary) AS avg
FROM titles as t
INNER JOIN salaries as s
ON t.emp_no=s.emp_no
WHERE t.to_date='9999-01-01'
AND s.to_date='9999-01-01'
GROUP BY t.title;
注意:AVG(*)是自动命名为avg的,所以不用重命名
补充:可以在连接表的时候给的条件更多一些
SELECT t.title, AVG(salary)
FROM titles as t
INNER JOIN salaries as s
ON t.emp_no=s.emp_no
AND t.to_date='9999-01-01'
AND s.to_date='9999-01-01'
GROUP BY t.title;
学习目标:正则化,正确的审题!
网友评论