14. 牛客网MySQL练习

MySQL常用命令集合 (帮你写练习~)

# MySQL查询语句的 执行 & 书写 顺序(7)  SELECT 
(8)  DISTINCT <select_list>
(1)  FROM <left_table>
(3)  <join_type> JOIN <right_table>
(2)  ON <join_condition>
(4)  WHERE <where_condition>
(5)  GROUP BY <group_by_list>
(6)  HAVING <having_condition>
(9)  ORDER BY <order_by_condition>
(10) LIMIT <limit_number>

文章目录

    • 14. 牛客网MySQL练习
      • 14.1 零一到十五
        • 题目01
        • 题目02
        • 题目03
        • 题目04
        • 题目05
        • 题目06
        • 题目07
        • 题目08
        • 题目09
        • 题目10
        • 题目11
        • 题目12
        • 题目13
        • 题目14
        • 题目15
      • 14.2 十六到三十
        • 题目16
        • 题目17
        • 题目18
        • 题目19
        • 题目20
        • 题目21
        • 题目22
        • 题目23
        • 题目24
        • 题目25
        • 题目26
        • 题目 27
        • 题目 28
        • 题目 29
        • 题目 30
      • 14.3 三一到四五
        • 题目 31
        • 题目 32
        • 题目 33
        • 题目 34
        • 题目 35
        • 题目 36
        • 题目 37
        • 题目 38
        • 题目 39
        • 题目 40
        • 题目 41
        • 题目 42
        • 题目 43
        • 题目 44
        • 题目 45
      • 14.4 四六到六十
        • 题目 46
        • 题目 47
        • 题目 48
        • 题目 49
        • 题目 50
        • 题目 51
        • 题目 52
        • 题目 53
        • 题目 54
        • 题目 55
        • 题目 56
        • 题目 57
        • 题目 58
        • 题目 59
        • 题目 60
        • 题目 61

14.1 零一到十五

题目01

查找最晚入职员工的所有信息,为了减轻入门难度,目前所有的数据里员工入职的日期都不是同一天

(sqlite里面的注释为–, mysql为comment)

CREATE TABLE `employees` (`emp_no` int(11) NOT NULL, `birth_date` date NOT NULL, `first_name` varchar(14) NOT NULL, `last_name` varchar(16) NOT NULL, `gender` char(1) NOT NULL, `hire_date` date NOT NULL, PRIMARY KEY (`emp_no`));
# 答案:
select * from employees order by hire_date desc limit 1;

order by 默认从小到大排列, 找最晚入职的员工需要找到 ‘hire_date’ 最大的, 所以需要倒序排列取第一个

order by hire_date desc 排序, 用 limit 1取第一个值


题目02

根据上一题的table; 查找入职员工时间排名倒数第三的员工所有信息

# 代码:
select * from employees order by hire_date limit 2, 1;

题目03

查找各个部门当前 (dept_manager.to_date=‘9999-01-01’) 领导当前 (salaries.to_date=‘9999-01-01’) 薪水详情以及其对应部门编号dept_no

(注: 请以salaries表为主表进行查询,输出结果以salaries.emp_no升序排序,并且请注意输出结果里面dept_no列是最后一列)

CREATE TABLE `salaries` (`emp_no` int(11) NOT NULL, `salary` int(11) NOT NULL, `from_date` date NOT NULL, `to_date` date NOT NULL, PRIMARY KEY (`emp_no`,`from_date`));---------------------------------------------------------------------------------------------CREATE TABLE `dept_manager` (`dept_no` char(4) NOT NULL, `emp_no` int(11) NOT NULL,`to_date` date NOT NULL, PRIMARY KEY (`emp_no`,`dept_no`));
# 代码
select s.*, d.dept_no 
from salaries as s,dept_manager as d
where s.to_date="9999-01-01" and d.to_date="9999-01-01" and d.emp_no = s.emp_no
order by s.emp_no;

多个where子句间用and连接


题目04

查找所有已经分配部门的员工的 last_name 和 first_name 以及 dept_no (请注意输出描述里各个列的前后顺序)

CREATE TABLE `dept_emp` (`emp_no` int(11) NOT NULL, `dept_no` char(4) NOT NULL, `from_date` date NOT NULL, `to_date` date NOT NULL,PRIMARY KEY (`emp_no`,`dept_no`));------------------------------------------------------------------------------------------------CREATE TABLE `employees` (`emp_no` int(11) NOT NULL, `birth_date` date NOT NULL, `first_name` varchar(14) NOT NULL,`last_name` varchar(16) NOT NULL, `gender` char(1) NOT NULL, `hire_date` date NOT NULL,PRIMARY KEY (`emp_no`));
# 代码
select employees.last_name, employees.first_name, dept_emp.dept_no from employees, dept_emp 
where dept_emp.emp_no = employees.emp_no;

多表联合查询


题目05

根据题04的表, 查找所有员工的 last_name 和 first_name 以及对应部门编号 dept_no,也包括暂时没有分配具体部门的员工
(请注意输出描述里各个列的前后顺序)

# 代码
select employees.last_name, employees.first_name, dept_emp.dept_no from employees 
left join dept_emp on dept_emp.emp_no = employees.emp_no;

左连接查询


题目06

查找所有员工入职时候的薪水情况,给出 emp_no 以及 salary, 并按照emp_no进行逆序
(请注意,一个员工可能有多次涨薪的情况)

CREATE TABLE `employees` (`emp_no` int(11) NOT NULL, `birth_date` date NOT NULL,`first_name` varchar(14) NOT NULL, `last_name` varchar(16) NOT NULL,`gender` char(1) NOT NULL, `hire_date` date NOT NULL, PRIMARY KEY (`emp_no`));CREATE TABLE `salaries` (`emp_no` int(11) NOT NULL, `salary` int(11) NOT NULL, `from_date` date NOT NULL, `to_date` date NOT NULL, PRIMARY KEY `emp_no`,`from_date`));
# 代码1: 用inner join
SELECT e.emp_no, s.salary FROM employees AS e INNER JOIN salaries AS s
ON e.emp_no = s.emp_no AND e.hire_date = s.from_date ORDER BY e.emp_no DESC# 代码2: 用多表查询
SELECT e.emp_no, s.salary FROM employees AS e, salaries AS s
WHERE e.emp_no = s.emp_no AND e.hire_date = s.from_date ORDER BY e.emp_no DESC

注意点:

  1. 由于测试数据中,salaries.emp_no不唯一(因为号码为emp_no的员工会有多次涨薪的可能,所以在salaries中对应的记录不止一条),employees.emp_no唯一,即salaries的数据会多于employees,因此需先找到employees.emp_no在salaries表中对应的记录salaries.emp_no,则有限制条件e.emp_no = s.emp_no
  2. 根据题意注意到salaries.from_date 和employees.hire_date的值应该要相等, ( 入职时的工资 ), 因此有限制条件 e.hire_date = s.from_date
  3. 根据题意要按照emp_no值逆序排列,因此最后要加上 ORDER BY e.emp_no DESC

题目07

查找薪水变动超过15次的员工号emp_no以及其对应的变动次数t

CREATE TABLE `salaries` (`emp_no` int(11) NOT NULL, `salary` int(11) NOT NULL,`from_date` date NOT NULL, `to_date` date NOT NULL, PRIMARY KEY (`emp_no`,`from_date`));
# 代码
select emp_no, count(emp_no) from salaries group by emp_no having count(emp_no)>15; 

知识点: 聚合函数, 聚合分组, 以及 聚合筛选


题目08

根据题目07的表, 找出所有员工当前 (to_date=‘9999-01-01’) 具体的薪水 salary 情况,对于相同的薪水只显示一次, 并按照逆序显示

# 代码1: 用distinct关键字
select distinct salary from salaries where to_date='9999-01-01' order by salary desc;# 代码2: 用聚合分组
select salary from salaries where to_date='9999-01-01' group by salary order by salary desc

去重语句 DISTINCT >> 不显示字段重复值


题目09

获取所有部门当前 (dept_manager.to_date=‘9999-01-01’) manager 的当前 (salaries.to_date=‘9999-01-01’) 薪水情况,
给出 dept_no, emp_no 以及 salary (请注意,同一个人可能有多条薪水情况记录)

CREATE TABLE `dept_manager` (`dept_no` char(4) NOT NULL, `emp_no` int(11) NOT NULL,`from_date` date NOT NULL, `to_date` date NOT NULL, PRIMARY KEY (`emp_no`,`dept_no`));-------------------------------------------------------------------------------------------CREATE TABLE `salaries` (`emp_no` int(11) NOT NULL, `salary` int(11) NOT NULL, `from_date` date NOT NULL, `to_date` date NOT NULL, PRIMARY KEY (`emp_no`,`from_date`));
# 代码
select d.dept_no, d.emp_no, s.salary from dept_manager as d, salaries as s
where d.emp_no=s.emp_no and d.to_date='9999-01-01' and s.to_date='9999-01-01'

用 d.emp_no=s.emp_no 来避免对同一个manager的多次选择


题目10

获取所有非manager的员工emp_no

CREATE TABLE `dept_manager` (`dept_no` char(4) NOT NULL, `emp_no` int(11) NOT NULL,`from_date` date NOT NULL, `to_date` date NOT NULL,PRIMARY KEY (`emp_no`,`dept_no`));--------------------------------------------------------------------CREATE TABLE `employees` (`emp_no` int(11) NOT NULL, `birth_date` date NOT NULL, `first_name` varchar(14) NOT NULL, `last_name` varchar(16) NOT NULL, `gender` char(1) NOT NULL, `hire_date` date NOT NULL, PRIMARY KEY (`emp_no`));
# 代码1: 用not in与子查询
select emp_no from employees where emp_no not in (select emp_no from dept_manager);

注意: 子查询加括号

# 代码2: 用left join
select emp_no from 
(select * from employees left join dept_manager on dept_manager.emp_no = employees.emp_no)
where dept_no is null;

思路: 将两张表合并所有数据, 从新表中找倒dept_no为null的数据


题目11

获取所有员工当前的 (dept_manager.to_date=‘9999-01-01’) manager,如果员工是 manager 的话不显示(也就是如果当前的 manager是自己的话结果不显示) 输出结果第一列给出当前员工的 emp_no, 第二列给出其 manager 对应的 emp_no

CREATE TABLE `dept_emp` (`emp_no` int(11) NOT NULL, `dept_no` char(4) NOT NULL, `from_date` date NOT NULL, `to_date` date NOT NULL,PRIMARY KEY (`emp_no`,`dept_no`));--------------------------------------------------------------------------------CREATE TABLE `dept_manager` (`dept_no` char(4) NOT NULL, `emp_no` int(11) NOT NULL, `from_date` date NOT NULL, `to_date` date NOT NULL,PRIMARY KEY (`emp_no`,`dept_no`));
# 代码
select dept_emp.emp_no, dept_manager.emp_no as manager 
from dept_emp inner join dept_manager on dept_emp.dept_no=dept_manager.dept_no
where dept_manager.to_date='9999-01-01' and dept_emp.emp_no!=dept_manager.emp_no;

分析:

  • 员工与自己的manager所在的部门是一样的 >> dept_emp.dept_no=dept_manager.dept_no
  • 员工如果是manager则不显示manager >> dept_emp.emp_no!=dept_manager.emp_no

on和where的区别:

  • on后面的是连接条件,代表两个表建立关系所遵循的规则
  • where后面的可以看作是筛选条件,是对最终结果集进行过滤所遵循的规则

题目12

获取所有部门中当前 (dept_emp.to_date = ‘9999-01-01’) 员工当前 (salaries.to_date=‘9999-01-01’) 薪水最高的相关信息,
给出 dept_no, emp_no 以及其对应的 salary

CREATE TABLE `dept_emp` (`emp_no` int(11) NOT NULL, `dept_no` char(4) NOT NULL,`from_date` date NOT NULL, `to_date` date NOT NULL, PRIMARY KEY (`emp_no`,`dept_no`));--------------------------------------------------------------------------------------------CREATE TABLE `salaries` (`emp_no` int(11) NOT NULL, `salary` int(11) NOT NULL, `from_date` date NOT NULL, `to_date` date NOT NULL, PRIMARY KEY (`emp_no`,`from_date`));
# 代码
select dept_emp.dept_no, dept_emp.emp_no, salaries.salary 
from salaries, dept_emp where dept_emp.emp_no= salaries.emp_no and dept_emp.to_date = '9999-01-01' and salaries.to_date='9999-01-01' group by dept_emp.dept_no having max(salaries.salary)

having与where的区别:

  • having是在分组后对数据进行过滤
  • where是在分组前对数据进行过滤
  • having后面可以使用聚合函数
  • where后面不可以使用聚合

题目13

从 titles 表获取按照 title 进行分组,每组个数大于等于 2,给出 title 以及对应的数目 t。

CREATE TABLE IF NOT EXISTS "titles" (`emp_no` int(11) NOT NULL, `title` varchar(50) NOT NULL,`from_date` date NOT NULL, `to_date` date DEFAULT NULL);
# 代码
select title, count(title) as t from titles group by title having t >= 2;

聚合函数


题目14

从 题目13的 titles 表中获取, 按照 title 进行分组,每组个数大于等于2,给出 title 以及对应的数目t。
注意! 对于重复的 emp_no 进行忽略 (即 emp_no 重复的 title 不计算,title 对应的数目t不增加)。

# 代码
select title, count(distinct emp_no) from titles group by title;

如何忽略emp_no重复的title?

  • 用COUNT(DISTINCT emp_no)可以统计同一title值且不包含重复emp_no值的记录条数

题目15

查找 employees 表所有 emp_no 为奇数,且 last_name 不为 Mary (注意大小写) 的员工信息,并按照 hire_date 逆序排列
(题目不能使用mod函数)

CREATE TABLE `employees` ( `emp_no` int(11) NOT NULL, `birth_date` date NOT NULL, `first_name` varchar(14) NOT NULL, `last_name` varchar(16) NOT NULL,`gender` char(1) NOT NULL, `hire_date` date NOT NULL, PRIMARY KEY (`emp_no`));
# 代码
select * from employees where emp_no%2=1 and last_name<>'Mary' order by hire_date desc;

14.2 十六到三十

题目16

统计出当前 (titles.to_date=‘9999-01-01’) 各个 title 类型对应的员工当前 (salaries.to_date=‘9999-01-01’) 薪水对应的平均工资。
结果给出 title 以及平均工资 avg

CREATE TABLE `salaries` (`emp_no` int(11) NOT NULL, `salary` int(11) NOT NULL, `from_date` date NOT NULL, `to_date` date NOT NULL, PRIMARY KEY (`emp_no`,`from_date`));-------------------------------------------------------------------------------------------CREATE TABLE IF NOT EXISTS "titles" (`emp_no` int(11) NOT NULL, `title` varchar(50) NOT NULL,`from_date` date NOT NULL, `to_date` date DEFAULT NULL);
# 代码
select titles.title, avg(salaries.salary) from titles, salaries 
where titles.emp_no=salaries.emp_no and titles.to_date='9999-01-01' and salaries.to_date='9999-01-01'
group by titles.title;

题目17

查看题目16的salaries表, 获取当前(to_date=‘9999-01-01’)薪水第二多的员工的 emp_no 以及其对应的薪水 salary

# 代码
select emp_no, salary from salaries order by salary desc limit 1, 1;

题目18

查找当前薪水 (to_date=‘9999-01-01’) 排名第二多的员工编号 emp_no、薪水 salary、last_name 以及 first_name
(尽量不使用order by)

CREATE TABLE `employees` (`emp_no` int(11) NOT NULL, `birth_date` date NOT NULL,`first_name` varchar(14) NOT NULL, `last_name` varchar(16) NOT NULL,`gender` char(1) NOT NULL, `hire_date` date NOT NULL, PRIMARY KEY (`emp_no`));-------------------------------------------------------------------------------------------------CREATE TABLE `salaries` (`emp_no` int(11) NOT NULL, `salary` int(11) NOT NULL, `from_date` date NOT NULL, `to_date` date NOT NULL, PRIMARY KEY (`emp_no`,`from_date`));
# 代码1: 使用order by
select e.emp_no, s.salary, e.last_name, e.first_name from employees e, salaries s
where s.to_date='9999-01-01' and s.emp_no=e.emp_no order by s.salary desc limit 1, 1;
# 代码2: 不使用order by
select e.emp_no, max(s.salary), e.last_name, e.first_name from employees e, salaries s
where s.to_date='9999-01-01' and s.emp_no=e.emp_no 
and s.salary not in (select max(salary) from salaries); 

思路:

  • 不能使用order by找第二大的salary
  • 找到salary的最大值, 用max()聚合函数, 然后将最大值排除掉
  • 再用max()找到的就是salary第二大的

题目19

查找所有员工的 last_name 和 first_name 以及对应的 dept_name,也包括暂时没有分配部门的员工

CREATE TABLE `departments` (`dept_no` char(4) NOT NULL, `dept_name` varchar(40) NOT NULL,PRIMARY KEY (`dept_no`));----------------------------------------------------------------------------------------------CREATE TABLE `dept_emp` (`emp_no` int(11) NOT NULL, `dept_no` char(4) NOT NULL, `from_date` date NOT NULL, `to_date` date NOT NULL, PRIMARY KEY (`emp_no`,`dept_no`));----------------------------------------------------------------------------------------------CREATE TABLE `employees` (`emp_no` int(11) NOT NULL, `birth_date` date NOT NULL, `first_name` varchar(14) NOT NULL, `last_name` varchar(16) NOT NULL,`gender` char(1) NOT NULL, `hire_date` date NOT NULL, PRIMARY KEY (`emp_no`));
# 代码
select e.last_name, e.first_name, d.dept_name 
from employees e left join dept_emp de on e.emp_no=de.emp_no 
left join departments d on d.dept_no=de.dept_no;

这是一个多对多的表关联查询, 需要用到两次…join…on…


题目20

查找员工编号emp_no为10001其自入职以来的薪水salary涨幅(总共涨了多少)growth(可能有多次涨薪,没有降薪)

CREATE TABLE `salaries` (`emp_no` int(11) NOT NULL, `salary` int(11) NOT NULL, `from_date` date NOT NULL, `to_date` date NOT NULL, PRIMARY KEY (`emp_no`,`from_date`));
# 代码
select max(salary) - min(salary) from salaaries where emp_no=10001;

在select后面可以使用算术运算符


题目21

查找所有员工自入职以来的薪水涨幅情况,给出员工编号 emp_no 以及其对应的薪水涨幅 growth,并按照 growth 进行升序
注: 可能有 employees 表和 salaries 表里存在记录的员工,有对应的员工编号和涨薪记录,但是已经离职了
离职的员工 salaries 表的最新的 to_date!=‘9999-01-01’,这样的数据不显示在查找结果里面

CREATE TABLE `employees` (`emp_no` int(11) NOT NULL, `birth_date` date NOT NULL, `first_name` varchar(14) NOT NULL, `last_name` varchar(16) NOT NULL, `gender` char(1) NOT NULL, `hire_date` date NOT NULL, PRIMARY KEY (`emp_no`));------------------------------------------------------------------------------------------CREATE TABLE `salaries` (`emp_no` int(11) NOT NULL, `salary` int(11) NOT NULL, `from_date` date NOT NULL, `to_date` date NOT NULL, PRIMARY KEY (`emp_no`,`from_date`));
# 代码1: 用inner join语句
select e.emp_no, (s.salary - sa.salary) as growth
from employees as e inner join salaries as s
on e.emp_no = s.emp_no and s.to_date = '9999-01-01'
inner join salaries as sa
on e.emp_no = sa.emp_no and e.hire_date = sa.from_date
order by growth asc

代码1思路:

  • 员工的工资有涨有跌, 不能简单的用 max(salary)-min(salary) 来计算入职时的工资与现在的工资差

    • 例: 工资浮动为:1200,1000,1300, 那么入职到现在的工资浮动应为100, 而不是300
  • 需要找到入职时的工资 (employees.hire_date=salaries.from_date), 与现在的工资 (salaries.to_date=‘9999-01-01’)

  • 用inner join提取员工现在的工资列表

    select e.emp_no, s.salary from employees as e inner join salaries as s
    on e.emp_no = s.emp_no and s.to_date = '9999-01-01'
    
  • 用inner join提取员工入职时的工资列表

    select e.emp_no, sa.salary from employees as e inner join salaries as sa
    on e.emp_no = s.emp_no and e.hire_date = sa.from_date
    
  • 结合两段代码, 提取工资差

# 代码2: 用子查询方法
select s1.emp_no, (salary - old_salary) as growth from 
(select emp_no ,salary from salaries where to_date='9999-01-01') as s1 
inner join 
(select e.emp_no , salary as old_salary from employees as e left join salaries as s on e.emp_no = s.emp_no and e.hire_date = s.from_date) as s2 
on s1.emp_no = s2.emp_no order by growth

代码2思路:

  • 整体思路与代码1相同

  • 做一个s1表, 找到salaries表中所有员工现在的工资

    select emp_no ,salary from salaries where to_date='9999-01-01'
    
  • 做一个s2表, 找到所有员工入职时的工资

    select e.emp_no , salary as old_salary from employees as e 
    left join salaries as s on e.emp_no = s.emp_no and e.hire_date = s.from_date
    
  • 从两张表中计算出工资差


题目22

统计各个部门的工资记录数,给出部门编码 dept_no、部门名称 dept_name 以及部门在 salaries 表里面有多少条记录 sum

CREATE TABLE `departments` (`dept_no` char(4) NOT NULL, `dept_name` varchar(40) NOT NULL,PRIMARY KEY (`dept_no`)); ---------------------------------------------------------------------------------------------CREATE TABLE `dept_emp` (`emp_no` int(11) NOT NULL, `dept_no` char(4) NOT NULL, `from_date` date NOT NULL, `to_date` date NOT NULL, PRIMARY KEY (`emp_no`,`dept_no`));---------------------------------------------------------------------------------------------CREATE TABLE `salaries` (`emp_no` int(11) NOT NULL, `salary` int(11) NOT NULL, `from_date` date NOT NULL, `to_date` date NOT NULL, PRIMARY KEY (`emp_no`,`from_date`));

思路:

  • departments 表与 salaries 表没有直接联系, 有第三方表 dept_emp 做两表的关联 (有dept_no和emp_no字段)

  • 主表是departments, 需要做一张副表, 含有 dept_no 和 salaries信息

    select d.dept_no, count(s.salary) as sum from dept_emp d, salaries s 
    where d.emp_no=s.emp_no group by d.dept_no;
    
  • 用departments 去 left join 自创的副表

# 代码: 多表联合查询 & 子查询
select de.dept_no, de.dept_name, s1.sum from departments as de left join
(select d.dept_no, count(s.salary) as sum from dept_emp d, salaries s where d.emp_no=s.emp_no group by d.dept_no) as s1 on de.dept_no=s1.dept_no;

题目23

对所有员工的当前 (to_date=‘9999-01-01’) 薪水按照 salary 进行降序排名 (名次: 1~N),相同的 salary 排名并列且按照 emp_no 升序排列

CREATE TABLE `salaries` (`emp_no` int(11) NOT NULL, `salary` int(11) NOT NULL, `from_date` date NOT NULL, `to_date` date NOT NULL, PRIMARY KEY (`emp_no`,`from_date`));

难点:

  • 如何显示排名的名次?
    • 思路: 找到比该salary数据大的salary数量, 例: 大于等于salary=1000的salary数量为1, 那1000的salary就是排名为1
# 代码:
select s1.emp_no, s1.salary, count(distinct s2.salary) as rank
from salaries as s1, salaries as s2 
where s1.to_date='9999-01-01' and s2.to_date='9999-01-01' and s1.salary<=s2.salary
group by s1.emp_no
order by s1.salary desc, s1.emp_no asc

题目24

获取所有非 manager 员工当前的薪水情况,给出 dept_no、emp_no 以及 salary ,当前表示 to_date=‘9999-01-01’

CREATE TABLE `dept_emp` (`emp_no` int(11) NOT NULL, `dept_no` char(4) NOT NULL, `from_date` date NOT NULL, `to_date` date NOT NULL, PRIMARY KEY (`emp_no`,`dept_no`));-------------------------------------------------------------------------------------------CREATE TABLE `dept_manager` (`dept_no` char(4) NOT NULL, `emp_no` int(11) NOT NULL, `from_date` date NOT NULL, `to_date` date NOT NULL, PRIMARY KEY (`emp_no`,`dept_no`));-------------------------------------------------------------------------------------------CREATE TABLE `employees` (`emp_no` int(11) NOT NULL, `birth_date` date NOT NULL,`first_name` varchar(14) NOT NULL, `last_name` varchar(16) NOT NULL,`gender` char(1) NOT NULL, `hire_date` date NOT NULL,PRIMARY KEY (`emp_no`));-------------------------------------------------------------------------------------------CREATE TABLE `salaries` (`emp_no` int(11) NOT NULL, `salary` int(11) NOT NULL, `from_date` date NOT NULL, `to_date` date NOT NULL, PRIMARY KEY (`emp_no`,`from_date`));

思路:

  • emp_no 和 salary 的数据可以直接从 salaries 表中获得, 难点在于区分那个 emp_no 是manager 以及是属于哪个dept_no
  • 判断emp_no是否是manager:
    • 如果emp_no出现在了dept_manager表中, 那么他是manager
    • 所以我们需要的数据应该是: emp_no not in (select emp_no from dept_manager)
  • 判断emp_no属于哪个dept_no
    • 在dept_emp表中有emp_no与dept_no的关系
    • 可以通过: select dept_no, emp_no from dept_emp where to_date=‘9999-01-01’ 来找到emp_no对应的dept_no
# 代码
select de.dept_no, de.emp_no, s.salary from dept_emp de, salaries s 
where de.to_date='9999-01-01' and s.to_date='9999-01-01' and s.emp_no=de.emp_no
and de.emp_no not in (select emp_no from dept_manager);

题目25

获取员工其当前的薪水比其 manager 当前薪水还高的相关信息,当前表示 to_date=‘9999-01-01’
结果第一列给出员工的 emp_no,第二列给出其 manager 的 manager_no,第三列给出该员工当前的薪水 emp_salary , 第四列给该员工对应的 manager 当前的薪水 manager_salary

CREATE TABLE `dept_emp` (`emp_no` int(11) NOT NULL, `dept_no` char(4) NOT NULL, `from_date` date NOT NULL, `to_date` date NOT NULL, PRIMARY KEY (`emp_no`,`dept_no`));-------------------------------------------------------------------------------------------CREATE TABLE `dept_manager` (`dept_no` char(4) NOT NULL, `emp_no` int(11) NOT NULL, `from_date` date NOT NULL, `to_date` date NOT NULL, PRIMARY KEY (`emp_no`,`dept_no`));-------------------------------------------------------------------------------------------CREATE TABLE `salaries` (`emp_no` int(11) NOT NULL, `salary` int(11) NOT NULL, `from_date` date NOT NULL, `to_date` date NOT NULL, PRIMARY KEY (`emp_no`,`from_date`));

思路:

  • 建立2张表

    • 表1显示普通员工工资: (题目24的答案)
    • 表2显示manager工资: (将题目24答案中的 not in, 改为 in)
  • 基于dept_no字段信息将两表中的信息进行比较

    select t1.emp_no, t2.emp_no as manager_no, t1.salary as emp_salary, t2.salary as manager_salary 
    from 表1 as t1, 表2 as t2 
    where t1.salary>t2.salary and t1.dep_no=t2.dep_no
    
# 代码1
select t1.emp_no, t2.emp_no as manager_no, t1.salary as emp_salary, t2.salary as manager_salary 
from 
(select de.dept_no, de.emp_no, s.salary from dept_emp de, salaries s where de.to_date='9999-01-01' and s.to_date='9999-01-01' and s.emp_no=de.emp_noand de.emp_no not in (select emp_no from dept_manager))
as t1, 
(select de.dept_no, de.emp_no, s.salary from dept_emp de, salaries s where de.to_date='9999-01-01' and s.to_date='9999-01-01' and s.emp_no=de.emp_noand de.emp_no in (select emp_no from dept_manager)) 
as t2 
where t1.salary>t2.salary and t1.dept_no=t2.dept_no

转换思路:

  • 无需另建表格
# 代码2
select d.emp_no, dm.emp_no as manager_no, s.salary as emp_salary, ss.salary as manager_salary 
from dept_emp d, dept_manager dm, salaries s, salaries ss
where s.emp_no = d.emp_no and ss.emp_no = dm.emp_no and s.to_date='9999-01-01' and ss.to_date='9999-01-01' and s.salary>ss.salary and d.dept_no = dm.dept_no 

题目26

汇总各个部门当前员工的 title 类型的分配数目,即结果给出部门编号 dept_no、dept_name、其部门下所有的当前(dept_emp.to_date = ‘9999-01-01’)员工的当前(titles.to_date = ‘9999-01-01’) title以及该类型 title 对应的数目 count

(注:因为员工可能有离职,所有dept_emp里面to_date不为’9999-01-01’就已经离职了,不计入统计,而且员工可能有晋升,所以如果titles.to_date 不为 ‘9999-01-01’,那么这个可能是员工之前的职位信息,也不计入统计)

CREATE TABLE `departments` (`dept_no` char(4) NOT NULL, `dept_name` varchar(40) NOT NULL,PRIMARY KEY (`dept_no`));-------------------------------------------------------------------------------------------CREATE TABLE `dept_emp` (`emp_no` int(11) NOT NULL, `dept_no` char(4) NOT NULL, `from_date` date NOT NULL, `to_date` date NOT NULL, PRIMARY KEY (`emp_no`,`dept_no`));-------------------------------------------------------------------------------------------CREATE TABLE IF NOT EXISTS `titles` (`emp_no` int(11) NOT NULL, `title` varchar(50) NOT NULL,`from_date` date NOT NULL, `to_date` date DEFAULT NULL);

思路:

  • dept_no 与 dept_name 可在departments表中获取,
    • 条件: departments.dept_no = dept_emp.dept_no and dept_emp.to_date = ‘9999-01-01’
  • title 与count(title)数据可在 titles 表中获取
    • 条件titles.to_date = ‘9999-01-01’ and titles.emp_no=dept_emp.wmp_no
# 代码2
select b.dept_no, b.dept_name, c.title, count(title)
from dept_emp as a, departments as b, titles as c
where a.dept_no = b.dept_noand a.emp_no = c.emp_noand a.to_date = '9999-01-01'and c.to_date = '9999-01-01'
group by a.dept_no, c.title;

group by 后可以跟随多个分组条件


题目 27

给出每个员工每年薪水涨幅超过5000的员工编号 emp_no、薪水变更开始日期 from_date 以及薪水涨幅值 salary_growth,并按照salary_growth 逆序排列。
提示:在 sqlite 中获取 datetime 时间对应的年份函数为 strftime(’%Y’, to_date)
(数据保证每个员工的每条薪水记录 to_date-from_date=1年,而且同一员工的下一条薪水记录 from_data=上一条薪水记录的to_data)

CREATE TABLE `salaries` (`emp_no` int(11) NOT NULL, `salary` int(11) NOT NULL, `from_date` date NOT NULL, `to_date` date NOT NULL, PRIMARY KEY (`emp_no`,`from_date`));

思路:

  • 注意: 是每年涨幅超过5000的员工, 不是总涨幅超过5000的员工
    如何在数据上理解每年的涨幅 >>> 两个from_date或两个to_date相差为1
# 代码
select s1.emp_no,s1.from_date,(s1.salary-s2.salary) as salary_growth
from salaries as s1,salaries as s2
where s1.emp_no = s2.emp_no and salary_growth>5000and ((strftime('%Y',s1.from_date)-strftime('%Y',s2.from_date)=1) or (strftime('%Y',s1.to_date)-strftime('%Y',s2.to_date)=1))
order by salary_growth desc

问题!! mysql使用strftime()函数报错


题目 28

查找描述信息 (film.description) 中包含 robot 的电影对应的分类名称 (category.name) 以及电影数目 (count(film.film_id)),而且还需要该分类包含电影总数量 (count(film_category.category_id))>=5 部

CREATE TABLE IF NOT EXISTS film (`film_id` smallint(5) NOT NULL DEFAULT '0', `title` varchar(255) NOT NULL, `description` text, PRIMARY KEY (film_id));----------------------------------------------------------------------------------------CREATE TABLE category (`category_id` tinyint(3) NOT NULL, `name` varchar(25) NOT NULL,`last_update` timestamp, PRIMARY KEY ( category_id ));---------------------------------------------------------------------------------------CREATE TABLE film_category (`film_id`  smallint(5) NOT NULL, `category_id` tinyint(3) NOT NULL, `last_update` timestamp);

思路:

  • 理解题目:

    • 需要输出两个字段信息: 电影类别名称 & 该电影类别对应电影的描述中含有’robot’的电影数量
    • 其中, category.name 对应的电影的description中必须包含 “robot”
    • 并且, 该电影类别对应的电影总数量大于等于5部
  • 观察表格:

    • film表, category表, film_category表
    • 多对多关系, 一部电影可以属于多种电影类别, 一个电影类别下也可以有多部电影
  • 提取数据

    • 需要从category提取name字段信息, 以及film中提取到相应的电影数量count(film_id)

      • 涉及到3张表, 需要满足
        category.category_id=film_category.category_id and film_category.film_id=film.film_id
    • select语句中带有聚合函数, 因此必须使用聚合分组:

      • group by category.name
    • 需要满足条件1: description中包含 'roboot’字符串

      • like模糊查询: film.description like ‘%robot%’
    • 需要满足条件2: 电影类别下的电影数量大于等于5

      • 创建一个新表, 内有满足该条件的数据
      (select category.category_id, category.namefrom category, film, film_category where category.category_id=film_category.category_id and film_category.film_id=film.film_id group by category.category_idhaving count(film.film_id)>=5
      ) as t1
      
  • 代码思路:

    • 从t1表中获取类别名称, 再从film中找到该类别对应的电影, 并且描述中含有’robot’的电影数量
# 代码1:
select t1.name, count(film.film_id)
from(select category.category_id, category.namefrom category, film, film_category where category.category_id=film_category.category_id and film_category.film_id=film.film_id group by category.category_idhaving count(film.film_id)>=5) as t1,film, film_category
wherefilm.description like '%robot%'and film_category.category_id=t1.category_idand film_category.film_id=film.film_id
group by t1.name

其他方式

# 代码2:
select c.name,count(*) as name 
from film_category fc,category c,film f,(select category_id from film_category group by film_category.category_id having count(*)>=5) as cc
where f.description like'%robot%'and fc.category_id=c.category_idand fc.category_id = cc.category_idand fc.film_id=f.film_id group by fc.category_id;

题目 29

使用 join 查询方式找出没有分类的电影 id 以及名称

CREATE TABLE IF NOT EXISTS film (`film_id` smallint(5) NOT NULL DEFAULT '0', `title` varchar(255) NOT NULL, `description` text, PRIMARY KEY (film_id));----------------------------------------------------------------------------------------CREATE TABLE category (`category_id` tinyint(3) NOT NULL, `name` varchar(25) NOT NULL,`last_update` timestamp, PRIMARY KEY ( category_id ));---------------------------------------------------------------------------------------CREATE TABLE film_category (`film_id`  smallint(5) NOT NULL, `category_id` tinyint(3) NOT NULL, `last_update` timestamp);

思路:

  • 注意! 必须用join查询方式 (inner join, left join, right join)
  • 需要的字段信息: film_id & title 都可以从film表中提取, 但是需要满足条件
  • 用left join: film为左表, film_category为右表, 保留左表所有数据,将右表加入左表, 查看那些右表字段为null的数据
# 代码
select film.film_id, film.title from film left join film_category 
on film.film_id=film_category.film_id 
where film_category.category_id is null;

题目 30

用子查询的方式找出属于 Action 分类的所有电影对应的 title , description

CREATE TABLE IF NOT EXISTS film (`film_id` smallint(5) NOT NULL DEFAULT '0', `title` varchar(255) NOT NULL, `description` text, PRIMARY KEY (film_id));----------------------------------------------------------------------------------------CREATE TABLE category (`category_id` tinyint(3) NOT NULL, `name` varchar(25) NOT NULL,`last_update` timestamp, PRIMARY KEY ( category_id ));---------------------------------------------------------------------------------------CREATE TABLE film_category (`film_id`  smallint(5) NOT NULL, `category_id` tinyint(3) NOT NULL, `last_update` timestamp);

思路:

  • 需要拿到 title & description 字段, 都可以从 film 中取得, 只需要满足该电影对应的category是Action
  • 回顾子查询的定义:
    • 当一个select语句中包含另一个select 查询语句,则称之为有子查询的语句
    • 可以出现在select后, from之后, 或 where后
  • 子查询, 找到Action类型对应的category_id
    • select category_id from category where name=‘Action’
select film.title, film.description from film, film_category 
where film.film_id=film_category.film_id and film_category.category_id in 
(select category_id from category where name='Action')

14.3 三一到四五

题目 31

获取select * from employees对应的执行计划

explain select * from employees

使用 EXPLAIN 关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的: 看看这些SQL语句的执行计划,查看该SQL语句有没有使用上了索引,有没有做全表扫描等等。这可以帮你分析你的查询语句或是表结构的性能瓶颈


题目 32

将employees表的所有员工的last_name和first_name拼接起来作为Name,中间以一个空格区分
(注:该数据库系统是sqllite,字符串拼接为 || 符号,不支持concat函数)

CREATE TABLE `employees` (`emp_no` int(11) NOT NULL, `birth_date` date NOT NULL, `first_name` varchar(14) NOT NULL, `last_name` varchar(16) NOT NULL,`gender` char(1) NOT NULL,`hire_date` date NOT NULL,PRIMARY KEY (`emp_no`));

mysql中的concat()函数支持字符串的拼接

# mysql代码:
select concat(last_name, ' ', first_name) from employees

SQLite字符串的连接需要用||

# sqlite代码
select last_name||" "||first_name as Name from employees;

题目 33

创建一个actor表,包含如下列信息
(注: sqlite 获取系统默认时间是 datetime(‘now’,‘localtime’) )

列表 类型 是否为NULL 含义
actor_id smallint(5) not null 主键id
first_name varchar(45) not null 名字
last_name varchar(45) not null 姓氏
last_update timestamp not null 最后更新时间,默认是系统的当前时间
# mysql代码
create table actor (actor_id smallint(5) auto_increment not null, first_name varchar(45) not null, last_name varchar(45) not null,last_update timestamp default CURRENT_TIMESTAMP not null, PRIMARY KEY (actor_id)) CHARSET=utf8;
# sqlite代码
create table actor(actor_id smallint(5) not null primary key,first_name varchar(45) not null, last_name varchar(45) not null,last_update timestamp not null DEFAULT (datetime('now', 'localtime')));

在sqlite下设置 CHARSET=utf8 会报错


题目 34

对在题目33中创建的actor表批量插入如下数据 (不能有2条insert语句哦!)

actor_id first_name last_name last_update
1 PENELOPE GUINESS 2006-02-15 12:34:33
2 NICK WAHLBERG 2006-02-15 12:34:33
insert into actor values (1, 'PENELOPE', 'GUINESS', '2006-02-15 12:34:33'), (2, 'NICK', 'WAHLBERG', '2006-02-15 12:34:33');

题目 35

对在题目33中创建的actor表, 批量插入如下数据, 如果数据已经存在,请忽略 (不支持使用replace操作)

actor_id first_name last_name last_update
‘3’ ‘ED’ ‘CHASE’ ‘2006-02-15 12:34:33’
# mysql代码
INSERT IGNORE INTO actor VALUES(3, 'ED', 'CHASE', '2006-02-15 12:34:33');
# sqlite代码
INSERT or IGNORE INTO actor VALUES(3, 'ED', 'CHASE', '2006-02-15 12:34:33');

MySQL中的特殊插入模式:

  • replace into: 如果插入的数据会导致UNIQUE 索引或PRIMARY KEY发生冲突/重复,则先删除旧数据再插入最新的数据
  • insert ignore into: 如果插入的数据会导致UNIQUE索引或PRIMARY KEY发生冲突/重复,则忽略此次操作/不插入数据

题目 36

对在题目33中创建的actor表, 有如下数据:

actor_id first_name last_name last_update
1 PENELOPE GUINESS 2006-02-15 12:34:33
2 NICK WAHLBERG 2006-02-15 12:34:33

请你创建一个actor_name表,并且将actor表中的所有first_name以及last_name导入该表.

actor_name表结构如下:

列表 类型 是否为NULL 含义
first_name varchar(45) not null 名字
last_name varchar(45) not null 姓氏
# 创建表
create table actor_name (first_name varchar(45) not null, last_name varchar(45) not null) CHARSET=utf8;
# 插入数据
insert into actor_name values ('PENELOPE', 'GUINESS'), ('NICK', 'WAHLBERG')# 高级写法
insert into actor_name select first_name,last_name from actor;

题目 37

针对题目33中创建的actor表结构创建索引:
(注: 在 SQLite 中, 除了重命名表和在已有的表中添加列, ALTER TABLE 命令不支持其他操作)

对 first_name 创建唯一索引 uniq_idx_firstname,对 last_name 创建普通索引 idx_lastname
(请先创建唯一索引,再创建普通索引)

# 创建唯一索引:
create unique index uniq_idx_firstname on actor(first_name);# 创建普通索引:
create index idx_lastname on actor(last_name);

题目 38

针对题目33中创建的actor表创建视图 actor_name_view,只包含 first_name 以及 last_name 两列,
并对这两列重新命名,first_name 修改为 first_name_v,last_name 修改为 last_name_v:

什么是视图:

  • 视图是存储的查询语句, 当调用的时候产生结果集, 视图充当的是虚拟表的角色。

  • 其实视图可以理解为一个表或多个表中导出来的表,作用和真实表一样,包含一系列带有行和列的数据

创建视图的语法

  • CREATE VIEW 视图名 AS 完整的SELECT语句;
# 代码
CREATE VIEW actor_name_view AS 
select first_name as first_name_v, last_name as last_name_v from actor;

题目 39

针对 salaries 表 emp_no 字段创建索引 idx_emp_no,查询 emp_no 为10005 , 使用强制索引。

CREATE TABLE `salaries` (`emp_no` int(11) NOT NULL, `salary` int(11) NOT NULL, `from_date` date NOT NULL, `to_date` date NOT NULL, PRIMARY KEY (`emp_no`,`from_date`));---------------------------------------------------------------------------------------------create index idx_emp_no on salaries(emp_no);

mysql强制使用索引:force index(索引名或者主键PRI)

# MySQL代码: 该代码在MySQL中可以正常运行, 但是无法通过牛客网的监测
select * from salaries force index(idx_emp_no) where emp_no=10005;
# sqlite代码: 该代码无法在Mysql运行会报错, 但是可以通过牛客网的检查
SELECT * FROM salaries INDEXED BY idx_emp_no WHERE emp_no = 10005;

题目 40

存在 actor 表,包含如下列信息:

CREATE TABLE IF NOT EXISTS actor (actor_id smallint(5) NOT NULL PRIMARY KEY,first_name varchar(45) NOT NULL,last_name varchar(45) NOT NULL,last_update timestamp NOT NULL DEFAULT (datetime('now','localtime')));

现在在 last_update 后面新增加一列名字为 create_date , 类型为 datetime , NOT NULL ,默认值为 ‘0000-00-00 00:00:00’

添加字段的基本语法:

  • alter table 表名 add 字段名 数据类型 after 字段名;
# 代码
alter table actor add create_date datetime NOT NULL default '0000-00-00 00:00:00';

注意!

  • 该代码可以通过牛客网审核, 但是在mySQL运行时会报错

  • 原因: MySQL的配置文件中有如下配置:

    • ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, 
      ERROR_FOR_DIVISION_BY_ZERO, and NO_ENGINE_SUBSTITUTIN
      
    • 其中NO_ZERO_IN_DATE, NO_ZERO_DATE两个选项禁止了0000这样的日期和时间

  • 解决方法: 使用 SET [SESSION|GLOBAL] sql_mode='modes’语法重新设置sql_mode值

    • set global sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
      
    • SESSION(默认选项): 表示当前回话中生效; GLOBAL**(需重启MySql)**: 表示全局生效

    • 重启MySQL


题目 41

构造一个触发器 audit_log,在向 employees_test 表中插入一条数据的时候,触发插入相关的数据到 audit 中。

CREATE TABLE employees_test(ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL,AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL);--------------------------------------------------------------------------------------------CREATE TABLE audit(EMP_no INT NOT NULL, NAME TEXT NOT NULL);

触发器是与 MySQL 数据表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。

基本语法:

delimiter $$
CREATE <触发器名> < BEFORE 或 AFTER >
<INSERT 或 UPDATE 或 DELETE >
ON <表名> FOR EACH Row
begin
<触发器主体>;
end $$
delimiter ;
# 在mysql中应该使用的代码:
delimiter $$
CREATE TRIGGER audit_log
AFTER INSERT 
ON employees_test FOR EACH ROW
BEGININSERT INTO audit(EMP_no, NAME) VALUES (new.ID, new.NAME);
END $$
delimiter ;
# 在牛客网中使用的代码
CREATE TRIGGER audit_log
AFTER INSERT 
ON employees_test FOR EACH ROW
BEGININSERT INTO audit(EMP_no, NAME) VALUES (new.ID, new.NAME);
END ;

题目 42

在 titles_test 表中 删除 emp_no 重复的记录,只保留最小的id对应的记录。

CREATE TABLE IF NOT EXISTS titles_test (id int(11) not null primary key, emp_no int(11) NOT NULL,title varchar(50) NOT NULL, from_date date NOT NULL, to_date date DEFAULT NULL);

思路:

  • 题目目的:

  • 在titles_test中有emp_no重复的记录, 但是 id 不同; 将重复的emp_no记录删除, 只保留 id 最小的那个

  • 删除重复的emp_no, 只保留最小id的那个emp_no

    • 删除数据的语法: delete from titles_test where 条件语句;
    • 难点在于条件语句怎么写
  • 条件1: 找到哪些emp_no是重复的

    • 通过count(emp_no)可以发现哪些emp_no是重复的

      select emp_no from titles_test group by emp_no having count(emp_no)>1
      
  • 条件2: 保留 id 最小的

    • 可以使用min(id)的方式, 从那些有重复的emp_no集合中找到

      select min(id) from titles_test where emp_no in (select emp_no from titles_test group by emp_no having count(emp_no)>1) group by emp_no
      
  • 将根据 条件1, 条件2 选取出要的结果

    delete from titles_test where emp_no in 条件1 and id not in 条件2
    

上述思路原理上可行, 但是子选择语句过多, 太过繁琐, 转换思路:

  • 实际上只需要用min(id) 再 group by emp_no 即可取出所有不能被删除的数据

  • group by emp_no 使每个emp_no都有, min(id) 使每个emp_no对应的最小id也有了

  • SELECT MIN(id), emp_no FROM titles_test GROUP BY emp_no
    
  • 再用deleate语句将所有不在上述数据中的数据删除即可

注意! MySQL 中有对 delete where in 语句的子查询限制

  • # 例:
    delete from titles_test where emp_no in 
    (select emp_no from titles_test group by emp_no having count(emp_no)>1);
    
  上述代码会报错
`ERROR 1093 (HY000): You can't specify target table 'titles_test' for update in FROM clause`- 改为如下代码: - ```mysqldelete from titles_test where emp_no in (select n.emp_no from(select emp_no from titles_test group by emp_no having count(emp_no)>1)as n);
# 代码
delete from titles_test
where id not in 
(select n.id from (SELECT MIN(id) as id, emp_no FROM titles_test GROUP BY emp_no) 
as n);

题目 43

将所有 to_date 为 9999-01-01 的全部更新为 NULL, 且 from_date 更新为 2001-01-01

CREATE TABLE IF NOT EXISTS titles_test (id int(11) not null primary key, emp_no int(11) NOT NULL,title varchar(50) NOT NULL, from_date date NOT NULL, to_date date DEFAULT NULL);

更新表数据的基本语法

update 表名 set 字段1=值1,字段2=值2,... where 条件;
# 代码:
update titles_test 
SET to_date=NULL,from_date='2001-01-01'
where to_date='9999-01-01'

题目 44

将 id=5 以及 emp_no=10001 的行数据替换成 id=5 以及 emp_no=10005 ,其他数据保持不变,使用 replace 实现。

CREATE TABLE IF NOT EXISTS titles_test (id int(11) not null primary key, emp_no int(11) NOT NULL,title varchar(50) NOT NULL, from_date date NOT NULL, to_date date DEFAULT NULL);

MySQL中replace的两种用法:

  1. replace into

    • 此语句的作用是向表插入数据时使用, 如果插入的数据会导致UNIQUE 索引或PRIMARY KEY发生冲突/重复,则先删除旧数据再插入最新的数据
  2. replace(object, search, replace)

    • 此语句用于在object字段中找到search数据, 并替换成replace数据
    # 例:把表table中的name字段中的aa替换为bb
    update table set name=replace(name,'aa','bb')
    
# 代码:
update titles_test set emp_no=replace(emp_no, '10001', '10005') where id=5;

题目 45

将titles_test表名修改为titles_2017

CREATE TABLE IF NOT EXISTS titles_test (id int(11) not null primary key, emp_no int(11) NOT NULL,title varchar(50) NOT NULL, from_date date NOT NULL, to_date date DEFAULT NULL);

表重命名的基本语法

alter table 表名 rename to 新表名;
# 代码1: 在牛客网过不了审查, 但是MySQL可过
alter table titles_test rename titles_2017;
# 代码2: 牛客网可过, 并且MySQL也不报错
ALTER TABLE titles_test RENAME TO titles_2017;

14.4 四六到六十

题目 46

在audit表上创建外键约束,其emp_no对应employees_test表的主键id
(audit已经创建,需要先drop)
(注:创建表的时候,字段的顺序不要改变)

CREATE TABLE employees_test(ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL);-----------------------------------------------------------------------------------------CREATE TABLE audit(EMP_no INT NOT NULL, create_date datetime NOT NULL);

删除表的基本语法:

  • drop table 表名;
    

创建外键约束的基本语法

  • # 创建外键约束的语法
    CONSTRAINT 约束名 FOREIGN KEY 外键名 (外键字段名) REFERENCES 外表名 (要关联的外表字段名)# 可选参数1: 删除关联关系ON DELETE {RESTRICT 或 CASCADE 或 SET NULL 或 NO ACTION}# 可选参数2: 更新关联关系ON UPDATE {RESTRICT 或 CASCADE 或 SET NULL 或 NO ACTION}
    
# 删除原audit表
drop table audit;# 创建新的audit表 方法1: 并创建外键约束 (该方法牛客网无法通过, 但是MySQL正常)
CREATE TABLE audit(EMP_no INT NOT NULL, create_date datetime NOT NULL,FOREIGN KEY f_k (EMP_no) REFERENCES employees_test (ID));# 创建新的audit表 方法2: 该方法在MySQL与牛客网都正常
CREATE TABLE audit(EMP_no INT NOT NULL,create_date datetime NOT NULL,FOREIGN KEY(EMP_no) REFERENCES employees_test(ID));

题目 47

存在如下的视图:

create view emp_v as select * from employees where emp_no >10005;

如何获取 emp_v 和 employees 的相同数据?

CREATE TABLE `employees` (`emp_no` int(11) NOT NULL, `birth_date` date NOT NULL, `first_name` varchar(14) NOT NULL, `last_name` varchar(16) NOT NULL, `gender` char(1) NOT NULL, `hire_date` date NOT NULL, PRIMARY KEY (`emp_no`));

(你能不用 select * from employees where emp_no >10005完成吗,挑战一下自己对视图的理解吧)

什么是视图:

  • 视图是存储的查询语句, 当调用的时候产生结果集, 视图充当的是虚拟表的角色
  • 其实视图可以理解为一个表或多个表中导出来的表,作用和真实表一样,包含一系列带有行和列的数据
  • 视图中,用户可以使用SELECT语句查询数据,也可以使用INSERT,UPDATE,DELETE修改记录

创建视图的语法:

{CREATE 或 REPLACE} VIEW 视图名 AS 完整的SELECT语句;
# REPLACE: 如果添加原来有同名视图的情况下会覆盖掉原有视图

不太了解题目的意义, 视图本身数据就是来自于目标, 因此视图中的所有数据都与原表相同

# 答案代码1: 牛客网可过, MySQL可过
select * from emp_v
# 答案代码2: 牛客网可过, 但是MySQL报错
select * from employees intersect select * from emp_v;

intersect为产生交集; 但是MySQL不支持INTERSECT操作符; 有inner join

# 答案代码2: 牛客网不可过, MySQL可过
select * from employees inner join emp_v where emp_v.emp_no=employees.emp_no;

题目 48

请你写出更新语句,将所有获取奖金的员工当前的 (salaries.to_date=‘9999-01-01’) 薪水增加 10%。
( emp_bonus 里面的 emp_no 都是当前获奖的所有员工 )

create table emp_bonus(emp_no int not null,btype smallint not null);----------------------------------------------------------------------------------------CREATE TABLE `salaries` (`emp_no` int(11) NOT NULL,`salary` int(11) NOT NULL,`from_date` date NOT NULL,`to_date` date NOT NULL, PRIMARY KEY (`emp_no`,`from_date`));

思路:

  • 更新语句的基本语法

    • update 表名 set 字段1=值1, 字段2=值2, ... where 条件;
      
  • 获取所有当前获奖的员工

    • select emp_no from emp_bonus
      
# 代码
update salaries 
set salary=salary*1.1 
where emp_no in (select emp_no from emp_bonus)and to_date='9999-01-01';

题目 49

针对库中的所有表生成 select count(*) 对应的SQL语句,如数据库里有以下表,

employees; departments; dept_emp; dept_manage; salaries; titles; emp_bonus

(注:在 SQLite 中用 “||” 符号连接字符串,无法使用concat()函数)

MySQL:

  • 获取数据库内的所有表名

    • select table_name from information_schema.tables where table_schema='数据库名'
      
  • 合并字符串:

    • concat('字符串1', '字符串2', ...)
      
# MySQL: 牛客网不通过
SELECT concat('select count(*) from', ' ', TABLE_NAME, ';') 
AS cnts
FROM (select table_name from information_schema.tables where table_schema='test001')
AStbs;

sqlite:

  • 在 SQLite 系统表 sqlite_master 中可以获得所有表的索引,其中字段 name 是所有表的名字,而且对于自己创建的表而言,字段 type 永远是 ‘table’
  • 在 SQLite 中用 “||” 符号连接字符串
# sqlite: 牛客网可通过
SELECT "select count(*) from " || name || ";" 
AS cnts
FROM sqlite_master 
WHERE type = 'table'

题目 50

将 employees 表中的所有员工的 last_name 和 first_name 通过 ’ 连接起来。(不支持concat,请用 || 实现)

CREATE TABLE `employees` (`emp_no` int(11) NOT NULL, `birth_date` date NOT NULL, `first_name` varchar(14) NOT NULL,`last_name` varchar(16) NOT NULL,`gender` char(1) NOT NULL,`hire_date` date NOT NULL,PRIMARY KEY (`emp_no`));
# MySQL
SELECT concat(last_name, "'", first_name) 
AS name
FROMemployees;
# sqlite
SELECTlast_name || "'" || first_name
AS name
FROMemployees

题目 51

查找字符串 ‘10,A,B’ 中逗号 ‘,’ 出现的次数

思路:

  • 获取 ‘10, A, B’ 的长度
  • 然后将逗号替换为空
  • 获取 ‘10AB’ 的长度
  • 两个长度相减, 即是逗号的数量

注意:

  • 空格也是一个字符
select length('10,A,B') - length(REPLACE('10,A,B',',',''))

题目 52

获取 Employees 中的 first_name ,按照 first_name 最后两个字母 进行 升序排列

CREATE TABLE `employees` (`emp_no` int(11) NOT NULL,`birth_date` date NOT NULL,`first_name` varchar(14) NOT NULL,`last_name` varchar(16) NOT NULL,`gender` char(1) NOT NULL,`hire_date` date NOT NULL,PRIMARY KEY (`emp_no`));

mysql中的SUBSTRING()函数可以对字符串进行截取

# 代码1: MySQL可过, 牛客网不通过
select first_name 
from employees
order bysubstring(first_name, -2, 2);
# 代码2: 牛客网 & MySQL都可过
selectfirst_name
fromemployees
order by substr(first_name, length(first_name)-1, 2);

题目 53

按照 dept_no 进行汇总,属于同一个部门的 emp_no 按照逗号进行连接,结果给出 dept_no 以及连接出的结果 employees

CREATE TABLE `dept_emp` (`emp_no` int(11) NOT NULL,`dept_no` char(4) NOT NULL,`from_date` date NOT NULL,`to_date` date NOT NULL,PRIMARY KEY (`emp_no`,`dept_no`));

思路:

  • 需要输出 dept_no & emp_no 两个字段的信息, 其中 emp_no 有多个的话, 不同 emp_no 之间用逗号连接
  • 需要使用GROUP_CONCAT() 函数 (将分组中的字符串与各种选项进行连接)
SELECT dept_no,group_concat(emp_no)
FROMdept_emp
group by dept_no;

题目 54

查找排除最大、最小 salary 之后的当前 (to_date = ‘9999-01-01’ ) 所有员工的平均工资 avg_salary

CREATE TABLE `salaries` ( `emp_no` int(11) NOT NULL,`salary` int(11) NOT NULL,`from_date` date NOT NULL,`to_date` date NOT NULL,PRIMARY KEY (`emp_no`,`from_date`));

思路:

  • 去除 最大&最小 的工资, 用not in
select 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')

题目 55

分页查询 employees 表,每5行一页,返回第2页的数据

CREATE TABLE `employees` (`emp_no` int(11) NOT NULL,`birth_date` date NOT NULL,`first_name` varchar(14) NOT NULL,`last_name` varchar(16) NOT NULL,`gender` char(1) NOT NULL,`hire_date` date NOT NULL,PRIMARY KEY (`emp_no`));

理解题意:

  • 没5行一页, 返回第二行的数据; 其实就是输出第6~10条数据, 可以用limit实现
  • imit后有两个参数,第一个参数为从第几个数据开始,第二个参数为取多少个数据
  • 注意, 第一个参数为0
# 代码
select*
from employees
limit 5, 5

题目 56

获取所有员工的 emp_no、部门编号 dept_no 以及对应的 bonus 类型 btype 和 received,
没有分配奖金的员工不显示对应的bonus类型btype和received

CREATE TABLE `dept_emp` (`emp_no` int(11) NOT NULL, `dept_no` char(4) NOT NULL, `from_date` date NOT NULL, `to_date` date NOT NULL, PRIMARY KEY (`emp_no`,`dept_no`));------------------------------------------------------------------------------------------CREATE TABLE `emp_bonus`(emp_no int(11) NOT NULL, received datetime NOT NULL, btype smallint(5) NOT NULL);------------------------------------------------------------------------------------------CREATE TABLE `employees` (`emp_no` int(11) NOT NULL, `birth_date` date NOT NULL, `first_name` varchar(14) NOT NULL, `last_name` varchar(16) NOT NULL, `gender` char(1) NOT NULL, `hire_date` date NOT NULL, PRIMARY KEY (`emp_no`));

思路:

  • 需要获取emp_no, dept_no, btype, 和 received 四个字段的数据, btype 和 received若为空则显示null
  • 用左连接或右连接进行多表联合查询
# 代码
select employees.emp_no, dept_emp.dept_no,emp_bonus.btype,emp_bonus.received
fromemployees
inner joindept_emp
ondept_emp.emp_no=employees.emp_no
left joinemp_bonus
onemployees.emp_no=emp_bonus.emp_no

需要注意多个join使用时的语句顺序

  • 一个join语句下立马跟上相应的on语句
  • 然后再写下一个join 语句

题目 57

使用含有关键字 exists 查找未分配具体部门的员工的所有信息。

CREATE TABLE `employees` (`emp_no` int(11) NOT NULL, `birth_date` date NOT NULL,`first_name` varchar(14) NOT NULL, `last_name` varchar(16) NOT NULL,`gender` char(1) NOT NULL, `hire_date` date NOT NULL, PRIMARY KEY (`emp_no`));---------------------------------------------------------------------------------------------------CREATE TABLE `dept_emp` (`emp_no` int(11) NOT NULL, `dept_no` char(4) NOT NULL, `from_date` date NOT NULL, `to_date` date NOT NULL, PRIMARY KEY (`emp_no`,`dept_no`));

思路:

  • MySQL中exists的用法:
    • EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False
      EXISTS 指定一个子查询,检测 行 的存在。
# 代码
SELECT * FROM employees WHERE NOT EXISTS 
(SELECT emp_no FROM dept_emp WHERE emp_no = employees.emp_no)

题目 58

存在如下的视图:

create view emp_v as select * from employees where emp_no >10005;-----------------------------------------------------------------------------------------CREATE TABLE `employees` (`emp_no` int(11) NOT NULL, `birth_date` date NOT NULL, `first_name` varchar(14) NOT NULL, `last_name` varchar(16) NOT NULL, `gender` char(1) NOT NULL, `hire_date` date NOT NULL,PRIMARY KEY (`emp_no`));

获取employees中的行数据,且这些行也存在于emp_v中。注意不能使用intersect关键字。
(你能不用select * from employees where emp_no >10005 这条语句完成吗,挑战一下自己对视图的理解)

与 题目 47 一模一样

# 代码
select * from emp_v

题目 59

获取有奖金的员工相关信息。

给出emp_no、first_name、last_name、奖金类型 btype、对应的当前薪水情况 salary 以及奖金金额 bonus。
bonus 类型 btype 为 1 其奖金为薪水 salary 的 10%,btyp e为 2 其奖金为薪水的 20%,其他类型均为薪水的 30%。

当前薪水表示 to_date=‘9999-01-01’

CREATE TABLE `employees` (`emp_no` int(11) NOT NULL, `birth_date` date NOT NULL,`first_name` varchar(14) NOT NULL,`last_name` varchar(16) NOT NULL,`gender` char(1) NOT NULL,`hire_date` date NOT NULL,PRIMARY KEY (`emp_no`));-----------------------------------------------------------------------------------------CREATE TABLE `dept_emp` (`emp_no` int(11) NOT NULL, `dept_no` char(4) NOT NULL,`from_date` date NOT NULL,`to_date` date NOT NULL,PRIMARY KEY (`emp_no`,`dept_no`));-----------------------------------------------------------------------------------------               create table `emp_bonus` (`emp_no` int not null,`received` datetime not null,`btype` smallint not null);----------------------------------------------------------------------------------------- CREATE TABLE `salaries` (`emp_no` int(11) NOT NULL,`salary` int(11) NOT NULL,`from_date` date NOT NULL,`to_date` date NOT NULL, PRIMARY KEY (`emp_no`,`from_date`));

思路:

  • 需要的数据:
    • emp_no, first_name, last_name字段可以从employees表中获得
    • btype字段数据从emp_bonus表中获得
    • salary数据需要从sallaries中获取,
    • bonus需要根据salary, 和btype计算得出
  • 获取有奖金的员工的emp_no, first_name, last_name, btype,
    • 用 employees inner join emp_bonus on emp_no=emp_no
  • 获取员工工资和奖金的数额
    • 用left join
SELECT e.emp_no, e.first_name, e.last_name, eb.btype, s.salary, (s.salary*eb.btype/10.0) AS bonus
FROM employees AS e 
INNER JOIN emp_bonus AS eb
ON e.emp_no=eb.emp_no
left JOIN salaries AS s 
ON eb.emp_no=s.emp_no AND s.to_date='9999-01-01';

题目 60

按照 salary 的累计和求出 running_total,running_total 为前 N 个当前 ( to_date = ‘9999-01-01’) 员工的 salary 累计和

结果需要输出 emp_no, salary, 和 running_total 三个字段的信息

CREATE TABLE `salaries` (`emp_no` int(11) NOT NULL,`salary` int(11) NOT NULL,`from_date` date NOT NULL,`to_date` date NOT NULL,PRIMARY KEY (`emp_no`,`from_date`));

输出案例:

emp_no salary running_total
10001 88958 88958
10002 72527 161485
10003 43311 204796

思路:

  • 输出emp_no, 和 salary字段信息并不难, 难点在于如何将前N个salary字段的信息加总

  • 仅仅输出 emp_no, 和 salary 字段信息

    • select emp_no, salary from salaries where to_date = '9999-01-01'# 输出:
      +--------+--------+
      | emp_no | salary |
      +--------+--------+
      |  10001 |  10765 |
      |  10002 |   7978 |
      +--------+--------+
      
  • 观察输出的数据 :
    emp_no 都是按升序输出的, 那么我们如果要得到一个累加值的话, 只需要将小于等于当前emp_no的salary加总即可

  • 用select语句中嵌套select语句实现

# 代码:
select t1.emp_no, t1.salary,(select sum(t2.salary) from salaries t2 where t2.emp_no<=t1.emp_no and t2.to_date='9999-01-01') as sum
from salaries t1
where t1.to_date = '9999-01-01'

题目 61

对于 employees 表中,输出 first_name 排名 (按 first_name 升序排序) 为奇数的 first_name

CREATE TABLE `employees` (`emp_no` int(11) NOT NULL,`birth_date` date NOT NULL,`first_name` varchar(14) NOT NULL,`last_name` varchar(16) NOT NULL,`gender` char(1) NOT NULL,`hire_date` date NOT NULL,PRIMARY KEY (`emp_no`));

思路:

  • 仅仅输出first_name, 然后按升序排列很简单

    • select first_name from employees order by first_name
      
  • 难点在于如何仅仅输出排列数为奇数的数据

  • 先研究如何得到排列数:

    • 首先需要了解, 字符串是可以使用比较运算符的, 那么我们可以利用上一题的思路拿到排序的数字

    • select t1.first_name, (select count(t2.first_name) from employees t2 where t2.first_name<=t1.first_name) as num
      from employees t1
      order by t1.first_name# 输出:
      +------------+------+
      | first_name | num  |
      +------------+------+
      | Anneke     |    1 |
      | Bezalel    |    2 |
      | Chirstian  |    3 |
      | Duangkaew  |    4 |
      +------------+------+
      
  • 由于select语句是最后才被执行的, 因此无法拿取排列顺序进行奇偶数判断, 所以需要将排列顺序在where语句前拿到

    • 因此需要把子查询语句写在where语句中 (题目中不需要输出排名)
# 代码1: 
select t1.first_name
from employees t1
where(select count(t2.first_name) from employees t2 where t2.first_name<=t1.first_name order by t2.first_name)%2=1# 注意, 由于题目没有要求排序, 所以如果最后加上order by的话,会不通过
# 实际上, 在子选择语句中由于以及使用了比较运算符, 通过得到比某值小或等于的值有多少个可以得知该值的奇偶性, 因此子选择语句中的order by也可以省略
# 代码2:
SELECT e1.first_name 
FROM (SELECT e2.first_name, (SELECT COUNT(*) FROM employees AS e3 WHERE e3.first_name <= e2.first_name) AS rowid FROM employees AS e2) AS e1
WHERE e1.rowid % 2 = 1
order by e1.first_name
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. MSQL学习笔记--锁

    根据加锁的范围,MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类。 全局锁 全局锁就是把整个数据库的实例加锁。命令是 Flush tables with read lock (FTWRL)。 数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句都会被阻塞。…...

    2024/4/15 5:57:41
  2. Java-eclipse-maven-项目打jar包

    1.jar生成Run As -> Maven install2.生成的jar 3.运行 jar(Linux 运行jar包命令)3.1 java -jar shareniu.jar 特点:当前ssh窗口被锁定,可按CTRL + C打断程序运行,或直接关闭窗口,程序退出3.2 java -jar shareniu.jar &&代表在后台运行。特定:当前ssh窗口不被…...

    2024/5/8 11:55:51
  3. 详解Laravel7中间件的使用方法附加案例说明

    今天在群里跟很多小伙伴聊技术,发现很多人还是对laravel里面的中间件使用场景还是不太理解,那么今天我写这个博客帮大家全面剖析一下它,各位小伙伴,把板凳和花生瓜子准备起来吧。课前预备必须有基本的编程经验,熟悉php编程尤佳熟悉laravel有强烈的求知欲望和学习知识技术的…...

    2024/5/8 8:58:29
  4. 【Office】Word 删除最后一页空白页

    把鼠标光标移动到最后一页,然后按键盘上面的删除键即可删除空白页。打开需要删除最后一页的Word空白文档,然后点击上方工具栏的开始按钮。点击开始按钮后在工具栏中找到段落设置,如下图所示进入到段落设置界面后找到行距,然后把行距设置为固定值,接着在找到设置值,然后把…...

    2024/5/8 13:25:48
  5. LeetCode 239. 滑动窗口最大值

    239. 滑动窗口最大值 题意:解法1(暴力法) 思路:建立一个ans数组:长度为窗口在数组中所出现的不同位置的次数即nums.length - k + 1 定一个左顶点(startIndex)不断往右移 根据k确定右顶点(endIndex):nums.length + k - 1 只要右顶点下标超过nums边界则右顶点停止移动 上面…...

    2024/4/15 18:46:08
  6. 程序人生 - 座位险和驾乘险有什么区别,买了后者还需要前者吗?

    司机、乘客座位责任险和全车驾乘险、驾乘无忧险有什么区别?买了驾乘险(或驾乘无忧险)后,还有必要买前者的座位险吗?我是新手,车是新车。1、保额和价格不同同等价格下驾乘险最高保额是远高于座位险的。2、保障不同驾乘险是认人不认车,车主买了驾乘险不管开哪辆车甚至是火…...

    2024/4/15 18:46:06
  7. ZooKeeper-简单操作

    ZooKeeper命令⾏简单操作 通过zkClient 进入Zookeeper客户端命令行./zkCli.sh 连接到本地的Zookeeper服务器 ./zkCli.sh -server ip:端口号./zkCli.sh -server 10.16.200.95:2181参数ZooKeeper -server host:port cmd argsstat path [watch]set path data [version]ls path …...

    2024/4/15 18:46:05
  8. react---路由基本使用 + 路由基础属性(两种路由形式:component 、render) + 传参 + 嵌套 +组件分开合并

    react 路由 npm i react-router-dom # 安装路由插件Router 表示所有需要使用路由的部分都必须包含在此节点内部,一个项目只需要有一个此节点就好此Router有两种常见的形式hash browser,hash路由,连接处有个#,不需要配置,没有兼容,可以直接使用;而浏览器历史记录路由需…...

    2024/4/15 18:46:04
  9. LIO-SAM: Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping论文解读

    文章目录abstract一、Introduction1.1 LOAM的缺点:1.2 LIO-SAM的改进:二、Related Work三、LIDAR INERTIAL ODOMETRY VIA SMOOTHING AND MAPPING(实际工作)A. 符号约定和文章综述B IMU预积分因子C. 激光里程计因子D. GPS因子E. 闭环因子打赏支付宝微信 abstract LIO-SAM将l…...

    2024/5/4 9:08:32
  10. element表格全选功能!!!!

    element表格全选删除功能 // html <el-tableref="multipleTable":data="prohibitedList"tooltip-effect="dark"style="width: 100%"@selection-change="handleSelectionChange"> </el-table> <div><…...

    2024/4/15 18:46:02
  11. 对时系统

    centos6 和centos7的区别 CentOS7中systemctl的使用与CentOS6中service的区别 在centos6中是不能使用systemctl命令的 linux对时 Linux进阶_时间同步(NTP与chrony) chrony 实现NTP协议的的自由软件。可使系统时钟与NTP服务器,参考时钟(例如GPS接收器)以及使用手表和键盘的手…...

    2024/5/8 12:01:39
  12. HDU--1045 Fire Net(二分图)

    HDU–1045 Fire Net(二分图) Problem Description Suppose that we have a square city with straight streets. A map of a city is a square board with n rows and n columns, each representing a street or a piece of wall. A blockhouse is a small castle that has f…...

    2024/4/15 18:46:00
  13. 基于BP的强分类器设计

    基于BP的强分类器设计 1.基于BP_Adaboost的强预测器预测 %% 清空环境变量 clc clear%% 下载数据 load data1 input output%% 权重初始化 k=rand(1,2000); [m,n]=sort(k);%训练样本 input_train=input(n(1:1900),:); output_train=output(n(1:1900),:);%测试样本 input_test=inp…...

    2024/4/22 0:23:04
  14. 字符串减法 (PAT甲级 哈希)

    字符串减法 题目大意 给定两个字符串 S1 和 S2,S=S1−S2 定义为将 S1 中包含的所有在 S2 中出现过的字符删除后得到的字符串。 你的任务就是计算 S1−S2。 输入格式 共两行,第一行包含字符串 S1,第二行包含字符串 S2。 输出格式 输出共一行,表示 S1−S2 的结果。 Code: #…...

    2024/4/15 14:42:25
  15. JavaSE10(抽象类与多态)

    JavaSE一、抽象类1、引入2、final二、多态1、引入2、示例 一、抽象类 1、引入 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。 注意: (1)抽…...

    2024/4/25 11:01:07
  16. 最小区间

    在力扣上刷到的一个题,感觉挺有意思,当时起手写了一个近似O(kn)时间复杂的代码,但提交上去发现果然超时。最后借鉴了另一个题“最小覆盖子串”的思路,在原来的代码上进行了修改,将时间复杂度优化为O(n)。思路大致思路是:先将所有的k个数组合并,为了知道每个数字来自哪个…...

    2024/4/15 14:42:22
  17. LeetCode 1067. 范围内的数字计数

    文章目录1. 题目2. 解题 1. 题目 给定一个在 0 到 9 之间的整数 d,和两个正整数 low 和 high 分别作为上下界。 返回 d 在 low 和 high 之间的整数中出现的次数,包括边界 low 和 high。 示例 1: 输入:d = 1, low = 1, high = 13 输出:6 解释: 数字 d=1 在 1,10,11,12,13…...

    2024/4/15 18:45:59
  18. Python文本解析

    分片 分片,通过分片,记录偏移处,然后提取想要的字符串 line=aaa bbb ccc col1=line[0:3] col3=line[8:] col1 #aaa col3 # ccc split()方法 line=aaa bbb ccc a=line.split ( ) a [aaa, bbb, ccc] a[0] aaa a[1] bbb a[2] ccc line=aaa,bbb,ccc a=li…...

    2024/4/19 23:36:04
  19. 从0基础学习Python(17)[面向对象三大特征[多态]]

    从0基础学习Python (Day17) 面向对象三大特征[多态] 多态 概念 ​ 不同子类的对象调用相同的父类方法,产生不同的结果 特点 调用方法的技巧 ​ 1.多态可以增加代码的灵活度。 ​ 2.以继承和重写为前提 ​ 3.是调用方法的技巧,不会影响类的原本设计 多态和多态性 多态 ​ 多…...

    2024/4/15 18:45:58
  20. 练习备战(一)

    一、非递减排序及旋转数组 #include <iostream>using namespace std;int main() {int a[] = { 3,3,3,3,1,2,3 };int len = sizeof(a) / sizeof(a[0]);int begin = 0;int end = len - 1;while (begin < end) {//中间值int mid = begin + (end - begin) / 2;//相差为1则…...

    2024/4/18 0:40:23

最新文章

  1. 提升执行力的方法论

    2024-5-7记录于PR办公室 一个关于求职的节目&#xff0c;提到如果在一个岗位做了多年&#xff0c;不论你是产品经理或项目经理&#xff0c;是否总结出一套产品/项目/研发的方法论。就这件事&#xff0c;我咨询过一个C语言大师星哥&#xff0c;他是这样说的:一件事在不同的时间段…...

    2024/5/8 18:31:14
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/5/7 10:36:02
  3. 基于Swin Transformers的乳腺癌组织病理学图像多分类

    乳腺癌的非侵入性诊断程序涉及体检和成像技术&#xff0c;如乳房X光检查、超声检查和磁共振成像。成像程序对于更全面地评估癌症区域和识别癌症亚型的敏感性较低。 CNN表现出固有的归纳偏差&#xff0c;并且对于图像中感兴趣对象的平移、旋转和位置有所不同。因此&#xff0c;…...

    2024/5/8 12:38:51
  4. 01背包问题 小明的背包

    2.小明的背包1 - 蓝桥云课 (lanqiao.cn) #include <bits/stdc.h> using namespace std; const int N1010;//开始写的105 开小了 样例过了但最后只过了很少一部分 int n,m; int v[N],w[N]; int f[N][N];int main() {cin>>n>>m;for(int i1;i<n;i){cin>&…...

    2024/5/5 8:41:06
  5. 【干货】零售商的商品规划策略

    商品规划&#xff0c;无疑是零售业的生命之源&#xff0c;是推动业务腾飞的强大引擎。一个精心策划的商品规划策略&#xff0c;不仅能帮助零售商在激烈的市场竞争中稳固立足&#xff0c;更能精准捕捉客户需求&#xff0c;实现利润最大化。以下&#xff0c;我们将深入探讨零售商…...

    2024/5/5 12:33:12
  6. 416. 分割等和子集问题(动态规划)

    题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义&#xff1a;dp[i][j]表示当背包容量为j&#xff0c;用前i个物品是否正好可以将背包填满&#xff…...

    2024/5/7 19:05:20
  7. 【Java】ExcelWriter自适应宽度工具类(支持中文)

    工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...

    2024/5/7 22:31:36
  8. Spring cloud负载均衡@LoadBalanced LoadBalancerClient

    LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon&#xff0c;直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件&#xff0c;我们讨论Spring负载均衡以Spring Cloud2020之后版本为主&#xff0c;学习Spring Cloud LoadBalance&#xff0c;暂不讨论Ribbon…...

    2024/5/8 1:37:40
  9. TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

    一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…...

    2024/5/7 14:19:30
  10. VB.net WebBrowser网页元素抓取分析方法

    在用WebBrowser编程实现网页操作自动化时&#xff0c;常要分析网页Html&#xff0c;例如网页在加载数据时&#xff0c;常会显示“系统处理中&#xff0c;请稍候..”&#xff0c;我们需要在数据加载完成后才能继续下一步操作&#xff0c;如何抓取这个信息的网页html元素变化&…...

    2024/5/8 1:37:39
  11. 【Objective-C】Objective-C汇总

    方法定义 参考&#xff1a;https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...

    2024/5/7 16:57:02
  12. 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】

    &#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格…...

    2024/5/7 14:58:59
  13. 【ES6.0】- 扩展运算符(...)

    【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数&#xff0…...

    2024/5/7 1:54:46
  14. 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?

    文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕&#xff0c;各大品牌纷纷晒出优异的成绩单&#xff0c;摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称&#xff0c;在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁&#xff0c;多个平台数据都表现出极度异常…...

    2024/5/7 21:15:55
  15. Go语言常用命令详解(二)

    文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令&#xff0c;这些命令可以帮助您在Go开发中进行编译、测试、运行和…...

    2024/5/8 1:37:35
  16. 用欧拉路径判断图同构推出reverse合法性:1116T4

    http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b&#xff0c;我们在 a i a_i ai​ 和 a i 1 a_{i1} ai1​ 之间连边&#xff0c; b b b 同理&#xff0c;则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然&#xff0…...

    2024/5/7 16:05:05
  17. 【NGINX--1】基础知识

    1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息&#xff0c;并安装一些有助于配置官方 NGINX 软件包仓库的软件包&#xff1a; apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...

    2024/5/8 18:06:50
  18. Hive默认分割符、存储格式与数据压缩

    目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限&#xff08;ROW FORMAT&#xff09;配置标准HQL为&#xff1a; ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...

    2024/5/8 1:37:32
  19. 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

    文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中&#xff0c;传感器和控制器产生大量周…...

    2024/5/7 16:05:05
  20. --max-old-space-size=8192报错

    vue项目运行时&#xff0c;如果经常运行慢&#xff0c;崩溃停止服务&#xff0c;报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中&#xff0c;通过JavaScript使用内存时只能使用部分内存&#xff08;64位系统&…...

    2024/5/8 1:37:31
  21. 基于深度学习的恶意软件检测

    恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞&#xff0c;例如可以被劫持的合法软件&#xff08;例如浏览器或 Web 应用程序插件&#xff09;中的错误。 恶意软件渗透可能会造成灾难性的后果&#xff0c;包括数据被盗、勒索或网…...

    2024/5/8 1:37:31
  22. JS原型对象prototype

    让我简单的为大家介绍一下原型对象prototype吧&#xff01; 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定&#xff0c;每一个构造函数都有一个 prototype 属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象…...

    2024/5/8 12:44:41
  23. C++中只能有一个实例的单例类

    C中只能有一个实例的单例类 前面讨论的 President 类很不错&#xff0c;但存在一个缺陷&#xff1a;无法禁止通过实例化多个对象来创建多名总统&#xff1a; President One, Two, Three; 由于复制构造函数是私有的&#xff0c;其中每个对象都是不可复制的&#xff0c;但您的目…...

    2024/5/8 9:51:44
  24. python django 小程序图书借阅源码

    开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索图书&#xff0c;轮播图&#xff0…...

    2024/5/8 1:37:29
  25. 电子学会C/C++编程等级考试2022年03月(一级)真题解析

    C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...

    2024/5/7 17:09:45
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57