This page needs a recent browser (with SharedArrayBuffer support). Please update Chrome, Edge, Firefox or Safari to the latest version. · Esta página necesita un navegador reciente (con soporte para SharedArrayBuffer). Por favor, actualiza Chrome, Edge, Firefox o Safari a la última versión.
1Querying basics · Bases de la consulta
1.1
SELECT y FROM
English
A database 数据库 keeps data in tables 表. A query 查询 reads data with SELECT. SELECT * returns every column; FROM names the table.
Each row 行 is one record 记录. SQL keywords are written in UPPERCASE by habit.
A statement ends with a semicolon ;.
Español
Una base de datos guarda los datos en tablas. Una consulta lee los datos con SELECT. SELECT * devuelve todas las columnas; FROM nombra la tabla.
CREATE TABLE student (id INTEGER, name TEXT, score INTEGER);
INSERT INTO student VALUES (1, 'Mei', 88), (2, 'Sam', 71);
SELECT * FROM student;
Una tabla almacena registros: cada fila es un registro, cada columna es un campo
Cada fila es un registro. Las palabras clave de SQL se escriben en MAYÚSCULAS por convención.
Una sentencia termina con punto y coma ;.
1.2
Elegir columnas
English
List the columns 列 you want, separated by commas. Use AS to rename a column in the result (an alias 别名).
A selected column can also be a calculation — pair it with AS to name the new column:
SELECT DISTINCT col removes duplicate values from the result.
Español
Enumere las columnas que desea, separadas por comas. Use AS para renombrar una columna en el resultado (un alias).
CREATE TABLE student (id INTEGER, name TEXT, score INTEGER);
INSERT INTO student VALUES (1, 'Mei', 88), (2, 'Sam', 71);
SELECT name, score AS mark FROM student;
Una columna seleccionada también puede ser un cálculo; empuje con AS para nombrar la nueva columna:
CREATE TABLE student (id INTEGER, name TEXT, score INTEGER);
INSERT INTO student VALUES (1, 'Mei', 88), (2, 'Sam', 71);
SELECT name, score + 5 AS bonus FROM student;
SELECT DISTINCT col elimina valores duplicados del resultado.
1.3
Filtrado con WHERE
English
WHERE keeps only the rows that match a condition 条件. Compare with =, <> (not equal), <, >, <=, >=. Put text in single quotes.
SQL runs the parts in this order: FROM → WHERE → SELECT.
Common mistakes
Put text values in single quotes: WHERE name = 'Ann'; column names have no quotes.
SELECT * returns every column — name only the columns you need.
WHERE filters rows; it comes after FROM.
Español
WHERE conserva solo las filas que coinciden con una condición. Compare con =, <> (distinto de), <, >, <=, >=. Coloque texto entre comillas simples.
CREATE TABLE student (id INTEGER, name TEXT, score INTEGER);
INSERT INTO student VALUES (1, 'Mei', 88), (2, 'Sam', 71), (3, 'Ana', 95);
SELECT name, score FROM student WHERE score >= 80;
SQL ejecuta las partes en este orden: FROM → WHERE → SELECT.
Errores comunes
Coloque valores de texto entre comillas simples: WHERE name = 'Ann'; los nombres de columna no llevan comillas.
SELECT * devuelve todas las columnas; nombre solo las columnas que necesita.
WHERE filtra filas; viene después de FROM.
2Filtering & logic · Filtrado y lógica
2.1
AND, OR, NOT · Y, O, NO
English
Combine conditions with AND, OR, NOT. AND needs all sides true; OR needs any side true; NOT reverses one. Use brackets to set the precedence 优先级.
Español
Combine condiciones con AND, OR, NOT. AND requiere que todos los lados sean verdaderos; OR requiere que al menos un lado sea verdadero; NOT invierte uno. Utilice paréntesis para establecer la precedencia 优先级.
CREATE TABLE student (id INTEGER, name TEXT, form TEXT, score INTEGER);
INSERT INTO student VALUES (1,'Mei','11A',88),(2,'Sam','11B',71),(3,'Ana','11A',95);
SELECT name FROM student WHERE form = '11A' AND score >= 90;
AND necesita que todos sean verdaderos; OR necesita al menos uno; NOT invierte uno
2.2
LIKE, IN y BETWEEN
English
LIKE matches a text pattern 模式: % stands for any text and _ for one character — these are wildcards 通配符.
Pattern
Matches
'M%'
starts with M
'%a'
ends with a
'%an%'
contains "an"
'M_i'
M, then exactly one character, then i
IN matches a set 集合 of values; BETWEEN matches a range 范围 (both ends included).
Español
LIKE coincide con un patrón de texto 模式: % representa cualquier texto y _ un solo carácter — estos son comodines 通配符.
CREATE TABLE student (id INTEGER, name TEXT, form TEXT, score INTEGER);
INSERT INTO student VALUES (1,'Mei','11A',88),(2,'Sam','11B',71),(3,'Ana','11A',95);
SELECT name FROM student WHERE name LIKE 'M%'; -- starts with M
Patrón
Coincide con
'M%'
comienza con M
'%a'
termina con a
'%an%'
contiene "an"
'M_i'
M, seguido exactamente de un carácter, luego i
IN coincide con un conjunto 集合 de valores; BETWEEN coincide con un rango 范围 (ambos extremos incluidos).
CREATE TABLE student (id INTEGER, name TEXT, form TEXT, score INTEGER);
INSERT INTO student VALUES (1,'Mei','11A',88),(2,'Sam','11B',71),(3,'Ana','11A',95);
SELECT name, score FROM student
WHERE form IN ('11A', '11C') AND score BETWEEN 80 AND 100;
2.3
NULL
English
NULL marks a missing value 缺失值 — nothing was stored in that cell. NULL is not 0 and not an empty string. A comparison with = or <> never matches it; test with IS NULL or IS NOT NULL.
WHERE score = NULL returns no rows at all — not even Sam's row.
A NULL in arithmetic gives NULL: score + 5 stays NULL for Sam.
Common mistakes
Test for an empty value with IS NULL, never = NULL.
In LIKE, % matches any text and _ matches one character: 'A%' means "starts with A".
IN (1, 2, 3) is shorter than many ORs; BETWEEN a AND b includes both ends.
Español
NULL marca un valor ausente 缺失值 — no se almacenó nada en esa celda. NULL no es 0 ni una cadena vacía. Una comparación con = o <> nunca coincidirá con él; pruébelo con IS NULL o IS NOT NULL.
CREATE TABLE student (id INTEGER, name TEXT, score INTEGER);
INSERT INTO student VALUES (1, 'Mei', 88), (2, 'Sam', NULL), (3, 'Ana', 95);
SELECT name FROM student WHERE score IS NULL;
CREATE TABLE student (id INTEGER, name TEXT, score INTEGER);
INSERT INTO student VALUES (1, 'Mei', 88), (2, 'Sam', NULL), (3, 'Ana', 95);
SELECT name, score FROM student WHERE score IS NOT NULL;
WHERE score = NULL no devuelve ninguna fila — ni siquiera la fila de Sam.
Un NULL en una operación aritmética da como resultado NULL: score + 5 permanece NULL para Sam.
Errores comunes
Para verificar si hay un valor nulo, utilice IS NULL, nunca = NULL.
En LIKE, % coincide con cualquier texto y _ con un solo carácter: 'A%' significa "comienza con A".
IN (1, 2, 3) es más corto que múltiples OR; BETWEEN a AND b incluye ambos extremos.
3Sorting & limiting · Ordenación y limitación
3.1
ORDER BY y LIMIT
English
ORDER BY sorts 排序 the result rows. Add DESC for descending 降序 (high to low); the default is ascending 升序 (low to high).
Sort by more than one column
List several columns. A tie 平局 in the first column is broken by the next.
LIMIT (top-N)
LIMIT n keeps only the first n rows — pair it with ORDER BY for a top-N 前 N 名 list.
ORDER BY can also sort by an alias or a calculation: ORDER BY avg_score DESC.
Text sorts alphabetically: ORDER BY name runs A → Z.
Common mistakes
ORDER BY sorts ascending by default; add DESC for descending.
ORDER BY comes near the end, after WHERE and GROUP BY.
LIMIT caps how many rows come back, but only after sorting.
Español
ORDER BY ordena 排序 las filas del resultado. Añade DESC para ordenar de forma descendente 降序 (de mayor a menor); el valor predeterminado es ascendente 升序 (de menor a mayor).
CREATE TABLE student (id INTEGER, name TEXT, score INTEGER);
INSERT INTO student VALUES (1,'Mei',88),(2,'Sam',71),(3,'Ana',95);
SELECT name, score FROM student ORDER BY score DESC;
Ordenar por más de una columna
Enumera varias columnas. Un empate 平局 en la primera columna se resuelve mediante la siguiente.
CREATE TABLE student (id INTEGER, name TEXT, score INTEGER);
INSERT INTO student VALUES (1,'Mei',88),(2,'Sam',88),(3,'Ana',95);
SELECT name, score FROM student ORDER BY score DESC, name ASC;
LIMIT (top-N)
LIMIT n conserva únicamente las primeras n filas — combínalo con ORDER BY para obtener una lista de los N primeros 前 N名.
CREATE TABLE student (id INTEGER, name TEXT, score INTEGER);
INSERT INTO student VALUES (1,'Mei',88),(2,'Sam',71),(3,'Ana',95);
SELECT name, score FROM student ORDER BY score DESC LIMIT 2;
ORDER BY también puede ordenar según un alias o un cálculo: ORDER BY avg_score DESC.
El texto se ordena alfabéticamente: ORDER BY name ordena de la A a la Z.
Errores comunes
ORDER BY ordena de forma ascendente por defecto; añade DESC para ordenar de forma descendente.
ORDER BY aparece cerca del final, después de WHERE y GROUP BY.
LIMIT limita cuántas filas se devuelven, pero solo después del ordenamiento.
ORDER BY ordena; LIMIT conserva las primeras n tras el ordenamiento
4Aggregates & grouping · Funciones agregadas y agrupación
4.1
Funciones de agregación
English
An aggregate function 聚合函数 turns many rows into one summary 汇总 value. Wrap an average in ROUND(x, 2) to tidy it.
Function
Gives
COUNT(*)
how many rows
SUM(col)
the total
AVG(col)
the mean average
MIN(col) / MAX(col)
the smallest / largest value
Español
Una función de agregación 聚合函数 convierte varias filas en un único valor resumen 汇总. Envuelve una media con ROUND(x, 2) para redondearla.
Función
Da
COUNT(*)
cuántas filas hay
SUM(col)
la suma total
AVG(col)
la media aritmética
MIN(col) / MAX(col)
el valor más pequeño / más grande
CREATE TABLE student (id INTEGER, name TEXT, form TEXT, score INTEGER);
INSERT INTO student VALUES (1,'Mei','11A',88),(2,'Sam','11B',71),(3,'Ana','11A',95);
SELECT COUNT(*), ROUND(AVG(score), 2), MAX(score) FROM student;
4.2
GROUP BY y HAVING
English
GROUP BY makes one summary row per group 组. HAVING filters those groups — it is like WHERE, but it runs after grouping.
Whatever order you write them in, SQL always runs the clauses of a query in the same fixed order:
Step
Clause
1
FROM (and any JOIN)
2
WHERE — filter rows
3
GROUP BY — form groups
4
HAVING — filter groups
5
SELECT — compute the output columns
6
ORDER BY, then LIMIT
Common mistakes
You cannot select a plain column beside an aggregate unless it is in GROUP BY.
Filter rows with WHERE (before grouping) and filter groups with HAVING (after).
COUNT(*) counts rows; COUNT(col) skips NULLs in that column.
Español
GROUP BY crea una única fila resumen por grupo 组. HAVING filtra esos grupos — es como WHERE, pero se ejecuta después del agrupamiento.
CREATE TABLE student (id INTEGER, name TEXT, form TEXT, score INTEGER);
INSERT INTO student VALUES (1,'Mei','11A',88),(2,'Sam','11B',71),(3,'Ana','11A',95);
SELECT form, COUNT(*) AS n, ROUND(AVG(score), 2) AS avg_score
FROM student
GROUP BY form
HAVING COUNT(*) > 1;
GROUP BY recopila las filas en un único contenedor por cada valor; cada contenedor se convierte en una fila resumen
Cualquiera que sea el orden en que los escribas, SQL siempre ejecuta las cláusulas de una consulta en el mismo orden fijo:
Paso
Cláusula
1
FROM (y cualquier JOIN)
2
WHERE — filtrar filas
3
GROUP BY — formar grupos
4
HAVING — filtrar grupos
5
SELECT — calcular las columnas de salida
6
ORDER BY, luego LIMIT
Errores comunes
No puedes seleccionar una columna simple junto a una agregada a menos que esté en GROUP BY.
Filtra las filas con WHERE (antes del agrupamiento) y los grupos con HAVING (después).
COUNT(*) cuenta filas; COUNT(col) omite los valores NULL en esa columna.
5Joins · Uniones (Joins)
5.1
Claves y relaciones
English
A primary key 主键 uniquely names each row in a table. A foreign key 外键 in one table points to the primary key of another — that builds a relationship 关系 between them.
Español
Una clave primaria (primary key) nombra de forma única cada fila en una tabla. Una clave foránea (foreign key) en una tabla apunta a la clave primaria de otra; esto establece una relación entre ellas.
CREATE TABLE class (id INTEGER, name TEXT);
CREATE TABLE student (id INTEGER, name TEXT, class_id INTEGER);
INSERT INTO class VALUES (1, 'Maths'), (2, 'Art');
INSERT INTO student VALUES (1, 'Mei', 1), (2, 'Sam', 2);
SELECT * FROM student;
5.2
INNER JOIN
English
A join 连接 combines rows from two tables. INNER JOIN ... ON ... keeps rows where the keys match. A short alias 别名 (s, c) keeps the query readable.
Español
Un join combina filas de dos tablas. INNER JOIN ... ON ... conserva solo las filas donde las claves coinciden. Un alias corto (s, c) mantiene la consulta legible.
CREATE TABLE class (id INTEGER, name TEXT);
CREATE TABLE student (id INTEGER, name TEXT, class_id INTEGER);
INSERT INTO class VALUES (1, 'Maths'), (2, 'Art');
INSERT INTO student VALUES (1, 'Mei', 1), (2, 'Sam', 2);
SELECT s.name, c.name AS class
FROM student s INNER JOIN class c ON s.class_id = c.id;
El INNER JOIN empareja cada clave foránea con una clave primaria y combina las filas coincidentes.
5.3
Join con agrupación
English
Join first, then GROUP BY to summarise across the joined rows.
Español
Primero realiza el join y luego usa GROUP BY para resumir los datos a lo largo de las filas unidas.
CREATE TABLE class (id INTEGER, name TEXT);
CREATE TABLE student (id INTEGER, name TEXT, class_id INTEGER);
INSERT INTO class VALUES (1, 'Maths'), (2, 'Art');
INSERT INTO student VALUES (1, 'Mei', 1), (2, 'Sam', 2), (3, 'Ana', 1);
SELECT c.name AS class, COUNT(*) AS n
FROM student s INNER JOIN class c ON s.class_id = c.id
GROUP BY c.name;
5.4
LEFT JOIN
English
An INNER JOIN keeps only matched rows. A LEFT JOIN 左连接 keeps every row of the left (first) table; where there is no match, the right table's columns come back as NULL.
Sam has no class, but the row still appears — with class as NULL.
To find only the unmatched rows, add WHERE c.id IS NULL.
Common mistakes
A join with no ON condition pairs every row with every row (a cross join).
Match the foreign key to the primary key: ON orders.customer_id = customers.id.
An INNER JOIN drops rows that have no match on the other side; use a LEFT JOIN to keep them.
Español
Un INNER JOIN conserva únicamente las filas que tienen coincidencia. Un LEFT JOIN conserva todas las filas de la tabla izquierda (la primera); cuando no hay coincidencia, las columnas de la tabla derecha se devuelven como NULL.
CREATE TABLE class (id INTEGER, name TEXT);
CREATE TABLE student (id INTEGER, name TEXT, class_id INTEGER);
INSERT INTO class VALUES (1, 'Maths'), (2, 'Art');
INSERT INTO student VALUES (1, 'Mei', 1), (2, 'Sam', NULL);
SELECT s.name, c.name AS class
FROM student s LEFT JOIN class c ON s.class_id = c.id;
Sam no tiene clase, pero la fila sigue apareciendo — con class como NULL.
Para encontrar únicamente las filas sin coincidencia, añade WHERE c.id IS NULL.
Errores comunes
Un join sin condición ON empareja cada fila con todas las filas (un cruce de tablas o cross join).
Empareja la clave foránea con la clave primaria: ON orders.customer_id = customers.id.
Un INNER JOIN elimina las filas que no tienen coincidencia en el otro lado; utiliza un LEFT JOIN para conservalas.
6Modifying data · Modificación de datos
6.1
INSERT
English
INSERT INTO ... VALUES ... adds new rows 行. Name the columns, then give the values in the same order. (Each block below ends with a SELECT so you can see the result.)
INSERT INTO t VALUES (...), (...); adds several rows in one statement.
Español
INSERT INTO ... VALUES ... agrega nuevas filas. Nombra las columnas y luego proporciona los valores en el mismo orden. (Cada bloque de abajo termina con un SELECT para que puedas ver el resultado).
CREATE TABLE student (id INTEGER, name TEXT, score INTEGER);
INSERT INTO student (id, name, score) VALUES (1, 'Mei', 88);
INSERT INTO student VALUES (2, 'Sam', 71);
SELECT * FROM student;
INSERT INTO t VALUES (...), (...); agrega varias filas en una sola instrucción.
INSERT agrega una nueva fila a una tabla
6.2
UPDATE
English
UPDATE ... SET ... WHERE ... changes existing rows. Always add WHERE, or every row changes.
Español
UPDATE ... SET ... WHERE ... modifica filas existentes. Siempre agrega WHERE, o se cambiarán todas las filas.
CREATE TABLE student (id INTEGER, name TEXT, score INTEGER);
INSERT INTO student VALUES (1, 'Mei', 88), (2, 'Sam', 71);
UPDATE student SET score = 75 WHERE name = 'Sam';
SELECT * FROM student;
6.3
DELETE
English
DELETE FROM ... WHERE ... removes rows. Without WHERE it empties the whole table 表.
Common mistakes
UPDATE and DELETEwithout a WHERE change every row — always add the WHERE.
In INSERT, the values must line up with the column list in order and type.
Test a risky DELETE first as a SELECT with the same WHERE.
Español
DELETE FROM ... WHERE ... elimina filas. Sin WHERE, vacía toda la tabla.
CREATE TABLE student (id INTEGER, name TEXT, score INTEGER);
INSERT INTO student VALUES (1, 'Mei', 88), (2, 'Sam', 71);
DELETE FROM student WHERE score < 80;
SELECT * FROM student;
Errores comunes
UPDATE y DELETEsin un WHERE modifican cada fila — siempre agrega el WHERE.
En INSERT, los valores deben coincidir con la lista de columnas en orden y tipo.
Prueba primero un DELETE riesgoso como un SELECT con el mismo WHERE.
7Defining tables · Definición de tablas
7.1
CREATE TABLE & tipos de datos
English
CREATE TABLE defines a table's schema 表结构: the column names and their data types 数据类型. The main SQLite types are INTEGER, TEXT, and REAL (a decimal number).
Español
CREATE TABLE define el esquema de una tabla 表结构: los nombres de las columnas y sus tipos de datos 数据类型. Los principales tipos de SQLite son INTEGER, TEXT y REAL (un número decimal).
CREATE TABLE student (id INTEGER, name TEXT, score REAL);
INSERT INTO student VALUES (1, 'Mei', 88.5);
SELECT * FROM student;
CREATE TABLE nombra columnas y sus tipos
7.2
Claves y restricciones
English
A constraint 约束 is a rule on a column: PRIMARY KEY (a unique id), NOT NULL (must have a value), UNIQUE, and DEFAULT (a fallback value).
Declare a foreign key with REFERENCES — it records that the column points at another table's primary key:
The long form is FOREIGN KEY (class_id) REFERENCES class(id) on its own line.
Español
Una restricción 约束 es una regla sobre una columna: PRIMARY KEY (un ID único), NOT NULL (debe tener un valor), UNIQUE y DEFAULT (un valor por defecto).
CREATE TABLE student (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
score INTEGER DEFAULT 0
);
INSERT INTO student (id, name) VALUES (1, 'Mei');
SELECT * FROM student;
Declarar una clave foránea con REFERENCES — registra que la columna apunta a la clave primaria de otra tabla:
CREATE TABLE class (id INTEGER PRIMARY KEY, name TEXT);
CREATE TABLE student (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
class_id INTEGER REFERENCES class(id)
);
INSERT INTO class VALUES (1, 'Maths');
INSERT INTO student VALUES (1, 'Mei', 1);
SELECT s.name, c.name AS class
FROM student s INNER JOIN class c ON s.class_id = c.id;
La forma larga es FOREIGN KEY (class_id) REFERENCES class(id) en una línea separada.
7.3
ALTER TABLE
English
ALTER TABLE ... ADD COLUMN ... changes the schema of a table that already exists. A DEFAULT fills the new column in the old rows.
ALTER TABLE student RENAME TO pupil; renames the whole table.
DROP TABLE student; deletes the table completely — structure and data.
Common mistakes
Every column needs a data type (e.g. INTEGER, TEXT).
A PRIMARY KEY must be unique and cannot be NULL.
A foreign key value must exist in the table it points to.
Español
ALTER TABLE ... ADD COLUMN ... cambia el esquema de una tabla que ya existe. Un DEFAULT rellena la nueva columna en las filas antiguas.
CREATE TABLE student (id INTEGER, name TEXT);
INSERT INTO student VALUES (1, 'Mei');
ALTER TABLE student ADD COLUMN score INTEGER DEFAULT 0;
SELECT * FROM student;
ALTER TABLE student RENAME TO pupil; renombra toda la tabla.
DROP TABLE student; elimina la tabla completamente — estructura y datos.
Errores comunes
Cada columna necesita un tipo de datos (p. ej., INTEGER, TEXT).
Una PRIMARY KEY debe ser única y no puede ser NULL.
El valor de una clave foránea debe existir en la tabla a la que apunta.
8Database design · Diseño de bases de datos
8.1
Relaciones y diagramas ER
English
Tables connect through relationships 关系. One-to-many 一对多 is the most common: one class has many students. Many-to-many 多对多 needs a join table 连接表 in the middle. An entity-relationship diagram 实体关系图 (ER diagram) draws each entity 实体 as a box and each relationship as a line.
Relationship
Example
one-to-one
a person and their passport
one-to-many
a class and its students
many-to-many
students and clubs
The join table holds one row per link. Here Mei is in two clubs, and Chess has two members:
Español
Las tablas se conectan a través de relaciones. La relación uno a muchos es la más común: una clase tiene muchos estudiantes. Una relación muchos a muchos requiere una tabla intermedia en el medio. Un diagrama entidad-relación (diagrama ER) representa cada entidad como un recuadro y cada relación como una línea.
Relación
Ejemplo
uno a uno
una persona y su pasaporte
uno a muchos
una clase y sus estudiantes
muchos a muchos
estudiantes y clubes
El lado "muchos" lleva la clave foránea; un enlace muchos a muchos necesita una tabla intermedia
La tabla intermedia contiene una fila por cada enlace. Aquí Mei está en dos clubes, y Ajedrez tiene dos miembros:
CREATE TABLE student (id INTEGER PRIMARY KEY, name TEXT);
CREATE TABLE club (id INTEGER PRIMARY KEY, name TEXT);
CREATE TABLE membership (student_id INTEGER, club_id INTEGER);
INSERT INTO student VALUES (1, 'Mei'), (2, 'Sam');
INSERT INTO club VALUES (1, 'Chess'), (2, 'Art');
INSERT INTO membership VALUES (1, 1), (1, 2), (2, 1);
SELECT s.name, c.name AS club
FROM membership m
INNER JOIN student s ON m.student_id = s.id
INNER JOIN club c ON m.club_id = c.id;
8.2
Normalización
English
Normalisation 范式化 organises tables to avoid redundancy 冗余 (the same data repeated) and the update mistakes it causes. The first three normal forms 范式:
1NF: every cell holds one atomic 原子 value — no lists inside a cell.
2NF: no column depends on only part of a composite key 复合主键.
3NF: no column depends on another non-key column.
Unnormalised (bad)
Normalised (better)
student(name, club1, club2)
student(name) + membership(student, club)
Common mistakes
Split repeating groups into their own table (normalisation) instead of many similar columns.
Each table should describe ONE kind of thing.
Link tables with a foreign key that points to another table's primary key.
Español
La normalización organiza las tablas para evitar la redundancia (los mismos datos repetidos) y los errores de actualización que esta provoca. Las tres primeras formas normales:
1FN: cada celda contiene un solo valor atómico — no hay listas dentro de una celda.
2FN: ninguna columna depende solo de una parte de una clave compuesta.
3FN: ninguna columna depende de otra columna que no sea clave.
Sin normalizar (malo)
Normalizado (mejor)
student(name, club1, club2)
student(name) + membership(student, club)
Errores comunes
Dividir los grupos repetitivos en su propia tabla (normalización) en lugar de tener muchas columnas similares.
Cada tabla debe describir UN solo tipo de cosa.
Vincular las tablas mediante una clave foránea que apunte a la clave primaria de otra tabla.
Pick one and the site follows you — notes, papers, videos and practice all open on it. · Selecciona uno y el sitio te sigue — notas, documentos, videos y práctica se abren en él.
Type to search notes, lessons, code, vocabulary and past-paper questions across every subject. · Escribe para buscar notas, lecciones, código, vocabulario y preguntas de exámenes anteriores en todas las materias.