Conjunto de preguntas incorrectas de Leetcode SQL

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_nochar (4) NOT NULL,
emp_noint (11) NOT NULL,
from_datedate NOT NULL,
to_datedate NOT NULL,
PRIMARY KEY ( emp_no, dept_no));
CREATE TABLE salaries(
emp_noint (11) NOT NULL,
salaryint (11) NOT NULL,
from_datedate NOT NULL,
to_datedate 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_noint (11) NO NULL,
titlevarchar (50) NOT NULL,
from_datefecha NOT NULL,
to_datefecha 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_noint (11) NOT NULL,
salaryint (11) NOT NULL,
from_datedate NOT NULL,
to_datedate NOT NULL,
PRIMARY KEY ( emp_no, from_date));
CREATE TABLE SI NO EXISTE "títulos" (
emp_noint (11) NOT NULL,
titlevarchar ( 50) NOT NULL,
from_datedate NOT NULL,
to_datedate 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 
Publicado 6 artículos originales · me gusta 0 · visitas 331

Supongo que te gusta

Origin blog.csdn.net/linph174/article/details/105176849
Recomendado
Clasificación