Directorio
20200329
Pregunta 1
Dada una tabla de salarios, como se muestra a continuación, hay valores para m = masculino yf = femenino. Cambie todos los valores de fym (por ejemplo, cambie todos los valores de f por m y viceversa). Solo se requiere una declaración de actualización, y no hay una tabla temporal intermedia.
Tenga en cuenta que solo debe escribir una declaración de actualización, no escriba ninguna declaración de selección.
La respuesta
update salary set sex = IF(sex = 'm', 'f', 'm')
Punto de conocimiento
Puede usar la función if para determinar el valor de una columna para el intercambio de datos. Cuando no hay una condición where, se actualiza la tabla completa.
Uso de la función
IF IF (expr, v1, v2) Si se mantiene la expresión expr, devuelve el resultado v1; de lo contrario, devuelve el resultado v2
Pregunta 2
Escriba una consulta SQL para obtener el segundo salario más alto (Salario) en la tabla Empleado.
La respuesta
Método 1: ordene el salario en orden descendente después de la deduplicación y luego devuelva el segundo registro para obtener el segundo valor más grande.
Quizás solo haya un valor de salario, que devolverá nulo
select (select distinct Salary from Employee limit 1,1) as secondhighestsalary;
Método 2: encuentre el valor máximo menor que el valor máximo del campo, que es el segundo valor más grande
select MAX(Salary) as secondhighestsalary from Employee
where Salary <(select MAX(Salary) from Employee );
Punto de conocimiento
limit N # 返回 N 条记录
offset M # 跳过 M 条记录,M 默认为 0
limit M,N # 相当于 limit N offset M,从第 M 条记录开始,返回 N 条记录
20200412
Pregunta 3
Encuentre el número de empleado emp_no cuyo salario ha aumentado más de 15 veces y el número correspondiente de aumentos t
CREAR TABLA salaries
(
emp_no
int (11) NO NULL,
salary
int (11) NO NULL,
from_date
fecha NO NULL,
to_date
fecha NO NULL,
CLAVE PRIMARIA ( emp_no
, from_date
));
Respuesta:
select emp_no, count(emp_no)as t from salaries
group by emp_no having t>15;
Puntos de conocimiento:
Esta pregunta debe prestar atención a los siguientes cuatro puntos:
1. El número de registros del mismo valor emp_no se puede contar usando la función COUNT () y la instrucción GROUP BY
2. De acuerdo con el significado de la pregunta, el número de aumentos de salida es t, así que use la instrucción AS para contar (emp_no) El valor de se convierte en t
3. Dado que la función COUNT () no se puede usar en la declaración WHERE, la declaración HAVING se usa para limitar la condición de t> 15. 4. Al final hay un malentendido y el aumento es más de 15 veces. El número correspondiente de registros en los salarios debe ser Más de 16 (del segundo registro para contar como el primer aumento), pero en aras de la simplicidad, el primer registro se considera como el primer aumento, así que deje que t> 15
preste atención: estrictamente hablando, el siguiente El salario es más alto que este artículo, pero el aumento se considera siempre que haya un registro en esta pregunta. El mismo salario puede entenderse como un aumento de 0, y el salario que se hace menos se entiende como un aumento negativo.
Dudas:
Esta pregunta debe suponer que cada cambio está aumentando y no se repite.
Pregunta 4
Averigüe el estado actual (to_date = '9999-01-01') de todos los empleados. Solo muestre el mismo salario una vez y en orden inverso
CREAR TABLA salaries
(
emp_no
int (11) NO NULL,
salary
int (11) NO NULL,
from_date
fecha NO NULL,
to_date
fecha NO NULL,
CLAVE PRIMARIA ( emp_no
, from_date
));
Respuesta:
Método 1: mesa pequeña aplicable
select distinct salary from salaries
where to_date='9999-01-01' order by salary desc
Método 2: aplicar a tablas grandes
select salary from salaries
where to_date='9999-01-01' group by salary
order by salary desc
Punto de conocimiento
1. Las tablas grandes generalmente no son eficientes con distintas. Cuando se prohíben grandes cantidades de datos, se recomienda usar group by para resolver problemas duplicados
2. Declaración WHERE Antes de la declaración GROUP BY, SQL calculará la declaración WHERE antes de agrupar.
Declaración HAVING Después de la instrucción GROUP BY, SQL calculará la instrucción HAVING después de agrupar el
grupo de filtro donde se filtran las filas
No es suficiente
El pedido por declaración necesita ser mejorado
Pregunta 5
Obtener el salario actual del gerente actual en todos los departamentos, dado dept_no, emp_no y salario, actualmente significa to_date = '9999-01-01'
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
));
La respuesta
select d.dept_no,d.emp_no,s.salary
from salaries as s inner join dept_manager as d
on s.emp_no = d.emp_no
and s.to_date='9999-01-01'
and d.to_date='9999-01-01'
Solución de error
select dept_no,emp_no,salary from dept_manager
where to_date='9999-01-01'
from salaries inner join dept_manager
on salaries.emp_no = dept_manager.emp_no
Resolución:
Conecte primero y luego donde
Pregunta 6
Obtener todos los empleados no gerentes emp_no
CREAR TABLA dept_manager
(
dept_no
char (4) NO NULL,
emp_no
int (11) NO NULL,
from_date
fecha NO NULL,
to_date
fecha NO NULL,
CLAVE PRIMARIA ( emp_no
, dept_no
));
CREAR TABLA employees
(
emp_no
int (11) NO NULL,
birth_date
fecha NO NULL,
first_name
varchar (14) NO NULL,
last_name
varchar (16) NO NULL,
gender
char (1) NO NULL,
hire_date
fecha NO NULL,
CLAVE PRIMARIA ( emp_no
));
Respuesta:
Método 1: Use LEFT JOIN para conectar las dos tablas y luego seleccione el registro emp_no correspondiente al valor dept_no de NULL de esta tabla
select employees.emp_no from employees
left join dept_manager
on employees.emp_no = dept_manager.emp_no
where dept_no is null;
Método 2: use NOT IN para seleccionar emp_no registros en empleados pero no en dept_manager
select emp_no from employees
where emp_no not in (
select emp_no from dept_manager)
Insuficiente
La declaración para encontrar valores nulos es: donde dept_no es nulo
Pregunta 7
Obtenga el administrador actual de todos los empleados. Si el administrador actual es el suyo, el resultado no se muestra. La representación actual es to_date = '9999-01-01'
La primera columna da el emp_no del empleado actual, y la segunda columna da el manager_no correspondiente a su gerente.
CREAR TABLA dept_emp
(
emp_no
int (11) NO NULL,
dept_no
char (4) NO NULL,
from_date
fecha NO NULL,
to_date
fecha NO NULL,
CLAVE PRIMARIA ( emp_no
, dept_no
));
CREAR TABLA dept_manager
(
dept_no
char (4) NO NULL,
emp_no
int (11) NO NULL,
from_date
fecha NO NULL,
to_date
fecha NO NULL,
CLAVE PRIMARIA ( emp_no
, dept_no
));
La respuesta
select de.emp_no,dm.emp_no AS manager_no
from dept_manager AS dm,dept_emp AS de
where de.emp_no <> dm.emp_no
and de.dept_no = dm.dept_no
and dm.to_date='9999-01-01';
Analizando
1. Debido a que desea exportar su propio administrador y sabe que usted y el departamento del gerente deben ser los mismos, existen restricciones de.dept_no = dm.dept_no
2. seleccione ... desde ... donde ... puede conectarse directamente a la tabla
3. Para mejorar la legibilidad del código , Reemplace dept_emp con el alias de y dept_manager con dm
Pregunta 8
Salario correspondiente
CREAR TABLA dept_emp
(
emp_no
int (11) NO NULL,
dept_no
char (4) NO NULL,
from_date
fecha NO NULL,
to_date
fecha NO NULL,
CLAVE PRIMARIA ( emp_no
, dept_no
));
CREAR TABLA salaries
(
emp_no
int (11) NO NULL,
salary
int (11) NO NULL,
from_date
fecha NO NULL,
to_date
fecha NO NULL,
CLAVE PRIMARIA ( emp_no
, from_date
));
La respuesta
select d.dept_no, s.emp_no, max(s.salary)
from dept_emp 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'
group by dept_no
Analizando
1. Conecte las dos tablas con INNER JOIN primero, la restricción es que el emp_no de las dos tablas es el mismo, es decir d.emp_no = s.emp_no;
2. Use GROUP BY d.dept_no para dividir cada departamento en un grupo, use MAX ( ) La función selecciona la persona mejor pagada de cada grupo
20200413
Pregunta 9
Descripción del título
Agruparse por título de la tabla de títulos, el número de cada grupo es mayor o igual a 2, dar el título y el número correspondiente t.
Tenga en cuenta que el duplicado emp_no se ignora.
CREAR TABLA SI NO EXISTE titles
(
emp_no
int (11) NO NULL,
title
varchar (50) NOT NULL,
from_date
fecha NOT NULL,
to_date
fecha DEFAULT NULL);
La respuesta
Método uno
select title ,count(distinct emp_no) as t
from titles
group by title
having t>=2
Método dos
select title,count(title) as tfrom (select distinct emp_no,title,from_date,to_date from titles )group by title having t>=2;
Dudas:
En esta pregunta, ¿es el número de títulos = emp_no = número de registros?
Pregunta 10
Descripción del título
Encuentre toda la información de los empleados en la tabla de empleados donde emp_no es impar y last_name no es Mary, y ordénelos en el orden inverso de hire_date
CREAR TABLA employees
(
emp_no
int (11) NO NULL,
birth_date
fecha NO NULL,
first_name
varchar (14) NO NULL,
last_name
varchar (16) NO NULL,
gender
char (1) NO NULL,
hire_date
fecha NO NULL,
CLAVE PRIMARIA ( emp_no
))
La respuesta
select * from employees
where emp_no % 2 =1
and last_name != 'Mary'
order by hire_date desc
Resolución:
Hay tres puntos a tener en cuenta:
1. El número de empleado es un número impar, entonces el saldo emp_no (%) debe ser 1
2. El apellido_no es Mary y Mary debe usar '', use '! = 'O' <> 'significa
3. Organice en orden inverso de acuerdo con hire_date, use desc
Pregunta 11
Descripción del título
Calcule el salario promedio correspondiente al salario actual (to_date = '9999-01-01') de los empleados correspondientes a cada tipo de título. El resultado da el título y el promedio de salario promedio.
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 SI NO EXISTE "títulos" (
emp_no
int (11) NOT NULL,
title
varchar ( 50) NOT NULL,
from_date
date NOT NULL,
to_date
date DEFAULT NULL);
La respuesta
select title ,avg(salary) as avg
from titles a inner join salaries b
on a.emp_no= b.emp_no and a.to_date= '9999-01-01' and b.to_date = '9999-01-01'
group by a.title