SQL38 针对actor表创建视图actor_name_view
CREATE VIEW actor_name_view AS SELECT
first_name AS first_name_v,
last_name AS last_name_v
FROM
actor;
SELECT * FROM actor_name_view;
SQL39 针对上面的salaries表emp_no字段创建索引idx_emp_no
SELECT * FROM salaries FORCE INDEX(idx_emp_no) WHERE emp_no=10005
SQL40 在last_update后面新增加一列名字为create_date
ALTER TABLE actor ADD COLUMN create_date datetime NOT NULL DEFAULT '2020-10-01 00:00:00' AFTER last_update;
触发器是一种与表操作有关的数据库对象
# 即表的操作事件触发表上的触发器的执行
# 创建触发器 mysql
# SQL41 构造一个触发器audit_log
# 触发名字 触发时机 触发事件 在那张表上建立触发器
CREATE TRIGGER audit_log AFTER INSERT ON employees_test FOR EACH ROW
BEGIN
INSERT INTO audit
VALUES
( new.id, new.NAME );
END;
链接 https://blog.csdn.net/weixin_41177699/article/details/80302987
SQL42 删除emp_no重复的记录,只保留最小的id对应的记录。
DELETE FROM titles_test
WHERE id NOT in (SELECT * FROM (SELECT min(id) FROM titles_test GROUP BY emp_no) a )
#MySQL中不允许在子查询的同时删除表数据(不能一边查一边把查的表删了)
分组获取到最小id
SELECT min(id) FROM titles_test GROUP BY emp_no
SQL43 将所有to_date为9999-01-01的全部更新为NULL,且 from_date更新为2001-01-01。
UPDATE titles_test
set to_date=null,
from_date='2001-01-01'
WHERE to_date='9999-01-01'
#将id=5以及emp_no=10001的行数据替换成id=5以及emp_no=10005,其他数据保持不变,使用replace实现,直接使用update会报错
UPDATE titles_test
SET emp_no = REPLACE(emp_no,'10001','10005')
WHERE id = 5;
SQL45 将titles_test表名修改为titles_2017
ALTER TABLE titles_test RENAME to titles_2017
在audit表上创建外键约束,其emp_no对应employees_test表的主键id
ALTER TABLE audit ADD CONSTRAINT FOREIGN KEY(EMP_no) REFERENCES employees_test(id);
SQL48 将所有获取奖金的员工当前的薪水增加10%
UPDATE salaries sa
INNER JOIN emp_bonus bo on bo.emp_no = sa.emp_no
SET salary = salary *1.1
WHERE sa.to_date='9999-01-01'
SQL50 将employees表中的所有员工的last_name和first_name通过引号连接起来。
SELECT CONCAT(last_name,"'",first_name) name FROM employees
SQL51 查找字符串中逗号出现的次数
SELECT id , LENGTH(string) - LENGTH(REPLACE(string,',','')) FROM strings
SQL52 获取employees中的first_name
SELECT first_name FROM employees ORDER BY SUBSTR(first_name,-2)
# 第二方法
# LEFT(s,n)返回字符串 s 的前 n 个字符
# RIGHT(s,n)返回字符串 s 的后 n 个字符
select first_name
from employees
order by right(first_name,2)
SQL53 按照dept_no进行汇总
SELECT
dept_no,
GROUP_CONCAT( emp_no ) AS employees
FROM
dept_emp
GROUP BY dept_no
# GROUP_CONCAT 聚合函数group_concat(X,Y),其中X是要连接的字段,Y是连接时用的符号,可省略,默认为逗号
SQL54 平均工资salaries
# 查找排除在职(to_date = '9999-01-01' )员工的最大、最小salary之后,其他的在职员工的平均工资avg_salary
SELECT (SUM(salary)-min(salary)-MAX(salary))/(COUNT(*)-2) avg FROM salaries WHERE to_date = '9999-01-01'
select avg(salary) as avg_salary from salaries
where to_date = '9999-01-01'
and salary not in (select max(salary) from salaries where to_date = '9999-01-01')
and salary not in (select min(salary) from salaries where to_date = '9999-01-01')
#分页查询employees表,每5行一页,返回第2页的数据
SELECT * FROM employees LIMIT 5,5
#使用含有关键字exists查找未分配具体部门的员工的所有信息。
SELECT
*
FROM
employees es
WHERE
NOT EXISTS ( SELECT de.emp_no FROM dept_emp de WHERE de.emp_no = es.emp_no )
SQL59 获取有奖金的员工相关信息。
SELECT
es.emp_no,
first_name,
last_name,
btype,
salary,
CASE
btype
WHEN 1 THEN TRUNCATE(salary * 0.1,1)
WHEN 2 THEN TRUNCATE(salary * 0.2,1)
ELSE TRUNCATE(salary * 0.3,1)
END AS bonus
FROM
emp_bonus bo,
salaries sa,
employees es
WHERE
bo.emp_no = sa.emp_no and bo.emp_no= es.emp_no
AND to_date = '9999-01-01'
ORDER BY es.emp_no