En cualquier trabajo centrada en los datos, tenemos un profundo conocimiento de SQL es la clave del éxito, aunque esto no es la parte más interesante del trabajo. De hecho, además de la SELECCIÓN DE DONDE GROUP BY ORDER BY, SQL y muchos más métodos. Cuanto más sepa la función, más fácil es el contenido y el funcionamiento de la consulta deseada.
Los autores desean aprender y comunicarse en este artículo las dos cosas siguientes:
función SQL distinto de 1) para estudiar y enseñar algunas funciones básicas
2) explorar algunas preguntas de la entrevista de práctica SQL
* El problema en este artículo sólo desde Leetcode
Pregunta 1: el segundo mayor salario
Escribir una consulta SQL para obtener el segundo salario más alto de la tabla de empleados. Por ejemplo, la tabla Employee dada a continuación, la consulta debe devolver 200 como el segundo salario alto. Si no hay segundo mayor salario, la consulta debe devolver nulo.
+----+--------+
| Id | Salary |
+----+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+----+--------+
1) Solución A : Uso IFNULL , OFFSET
-
IFNULL (expresión, alt): Si nulo, IFNULL () Devuelve el valor especificado, de lo contrario devuelve el valor esperado . Si no hay un segundo salario más alto, lo usaremos devuelve un valor nulo.
-
OFFSET: se utiliza en conjunción con la cláusula compensar ignora la orderBy especificado primero n filas . Esto puede ser útil, ya que desea obtener la segunda fila (el salario segundo más alto)
SELECT
IFNULL(
(SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1
), null) as SecondHighestSalary
FROM Employee
LIMIT 1
2) Solución B : usando MAX ()
Esta consulta representa el salario MAX seleccionado no es igual a la máxima salario, que es igual para seleccionar el segundo más alto salario.
SELECT MAX(salary) AS SecondHighestSalary
FROM Employee
WHERE salary != (SELECT MAX(salary) FROM Employee)
Pregunta 2: duplicado e-mail
Escritura de consultas SQL para encontrar todo el correo electrónico duplicado nombrado Persona de la tabla.
+----+---------+
| Id | Email |
+----+---------+
| 1 | [email protected] |
| 2 | [email protected] |
| 3 | [email protected] |
+----+---------+
1) Solución A : subconsulta COUNT ()
En primer lugar, crear un sub-consulta que muestra el número de veces que la frecuencia de cada correo electrónico. Luego se filtra subconsulta donde el conteo es mayor que 1.
SELECT Email
FROM (
SELECT Email, count(Email) AS count
FROM Person
GROUP BY Email
) as email_count
WHERE count > 1
2) Solución B: HAVING cláusula
-
cláusula HAVING es, en esencia, puede WHERE y la agregación (GROUP BY) se usan en combinación.
SELECT Email
FROM Person
GROUP BY Email
HAVING count(Email) > 1
Pregunta 3: Aumento de la temperatura
Dada una tabla tiempo a continuación, escribir una consulta SQL para encontrar antes de que sus temperaturas más altas en comparación con todas las fechas de Identificación (ayer) la fecha.
+---------+------------------+------------------+
| Id(INT) | RecordDate(DATE) | Temperature(INT) |
+---------+------------------+------------------+
| 1 | 2015-01-01 | 10 |
| 2 | 2015-01-02 | 25 |
| 3 | 2015-01-03 | 20 |
| 4 | 2015-01-04 | 30 |
+---------+------------------+------------------+
Solución: DATEDIFF ()
-
DATEDIFF es la diferencia entre dos fechas, porque hoy vamos a asegurarse de que la temperatura y la temperatura se comparó ayer.
En términos simples, la consulta es para seleccionar la temperatura en una fecha determinada es superior a la temperatura de Identificación de ayer.
SELECT DISTINCT a.Id
FROM Weather a, Weather b
WHERE a.Temperature > b.Temperature
AND DATEDIFF(a.Recorddate, b.Recorddate) = 1
Pregunta 4: Sector salario más alto
Empleados La siguiente tabla contiene todos los empleados. Cada empleado tiene un ID, un cheque de pago, hay una columna ID de departamento.
+----+-------+--------+--------------+
| Id | Name | Salary | DepartmentId |
+----+-------+--------+--------------+
| 1 | Joe | 70000 | 1 |
| 2 | Jim | 90000 | 1 |
| 3 | Henry | 80000 | 2 |
| 4 | Sam | 60000 | 2 |
| 5 | Max | 90000 | 1 |
+----+-------+--------+--------------+
La siguiente tabla contiene los departamentos en todos los sectores de la empresa.
+----+----------+
| Id | Name |
+----+----------+
| 1 | IT |
| 2 | Sales |
+----+----------+
consultas SQL de escritura para encontrar el salario más alto en cada uno de los empleados del departamento. Para estos dos cuadros, la consulta SQL debe devolver (el orden de las filas no importa) la siguiente línea.
+------------+----------+--------+
| Department | Employee | Salary |
+------------+----------+--------+
| IT | Max | 90000 |
| IT | Jim |90000 |
| Sales | Henry | 80000 |
+------------+----------+--------+
Solución : el EN cláusula
-
cláusula IN le permite utilizar múltiples cláusulas OR en la cláusula WHERE. Por ejemplo, cuando el país = 'Canadá' o país = 'EE.UU.' y WHERE país IN ( 'Canadá', 'EE.UU.') del mismo.
-
En este caso, queremos filtrar la tabla departamento para mostrar sólo el salario máximo para cada departamento (es decir DepartmentID). Entonces, podemos unir dos tablas, en la que el DepartmentID filtra y mesa Departamento de sueldos.
SELECT
Department.name AS 'Department',
Employee.name AS 'Employee',
Salary
FROM Employee
INNER JOIN Department ON Employee.DepartmentId = Department.Id
WHERE (DepartmentId , Salary)
IN
( SELECT
DepartmentId, MAX(Salary)
FROM
Employee
GROUP BY DepartmentId
)
Pregunta 5: asientos de intercambio
María es un profesor de secundaria, ella tiene un plano de la sala, por encima de las tiendas el nombre del estudiante y la correspondiente Identificación asiento. Columna ID es incrementos discretos, Mary querían asientos de intercambio adyacentes a los estudiantes.
Puede escribir consultas SQL a la salida de María?
+---------+---------+
| id | student |
+---------+---------+
| 1 | Abbot |
| 2 | Doris |
| 3 | Emerson |
| 4 | Green |
| 5 | Jeames |
+---------+---------+
Para la muestra de entrada, salida:
+---------+---------+
| id | student |
+---------+---------+
| 1 | Doris |
| 2 | Abbot |
| 3 | Green |
| 4 | Emerson |
| 5 | Jeames |
+---------+---------+
Nota: Si el número de alumnos es impar, no hay necesidad de cambiar el último asiento.
Solución : el caso de que el CUANDO
-
CASO CUANDO ENTONCES declaraciones pueden ser considerados como una instrucción IF de codificación.
-
Los primero comprueba si el número de filas cuando una instrucción es impar, si el número de líneas es impar, se aseguran de que el mismo número de identificación.
-
El segundo cuando los estados para cada ID se incrementa (por ejemplo, 1,3,5 convierte 2,4,6)
-
Del mismo modo, la tercera declaración cuando disminuye cada ID (2,4,6 convierte 1,3,5)
SELECT
CASE
WHEN((SELECT MAX(id) FROM seat)%2 = 1) AND id = (SELECT MAX(id) FROM seat) THENid
WHEN id%2 = 1 THEN id + 1
ELSE id - 1
END AS id, student
FROM seat
ORDER BY id
Estas son todas las soluciones, si hay alguna pregunta o comentario, otros comentarios por favor!