¡Esta es una revisión vieja del documento!
/* … */
CREATE DATABASE nombre
CREATE DATABASE bookstore;
CREATE TABLE nombre (columna tipo propiedades, columna tipo propiedades…)
CREATE TABLE books ( rec_id INT, title VARCHAR(50), author VARCHAR(50) );
ALTER TABLE nombre modificiación, modificación…
Las modificaciones posibles:
ADD COLUMN columna tipo propiedadesCHANGE COLUMN columna nuevo_nombre tipo propiedadesALTER TABLE books CHANGE COLUMN rec_id rec_id INT AUTO_INCREMENT PRIMARY KEY, CHANGE COLUMN author author_id INT, ADD COLUMN description BLOB;
Las enumeraciones se asignan entre parentesis un grupo de valores que aceptan, estos entre comillas simples:
ENUM ('yes', 'no')ENUM('novel','poetry','drama')
Si se le asigna un valor que no existe provoca un warning e inserta un valor en blanco. Cada valor insertado recibe un número, siendo el primero 1, el segundo 2… Y el valor en blanco un 0. Por lo que puedes hacer selects preguntando por el valor numérico o el valor dado.
Los ENUM ocupan: 1 byte si tienen menos de 255 elementos o 2 bytes si tienen menos 65535. Los SET, en cambio, ocupan mucho más (1-8 elementos: 1byte, 9-16 elementos: 2 bytes… 33-64 elementos: 8 bytes).
La sintaxis para definir una foreign key en MySql es:
[CONSTRAINT símbolo] FOREIGN KEY (nombre_columna, ...) REFERENCES nombre_tabla (nombre_columna, ...) [ON DELETE {CASCADE | SET NULL | NO ACTION | RESTRICT}] [ON UPDATE {CASCADE | SET NULL | NO ACTION | RESTRICT}]
CREATE TABLE publicaciones (isbn VARCHAR(10) PRIMARY KEY, id_editorial INT, FOREIGN KEY (id_editorial) REFERENCES editoriales(id));
Un ejemplo para añadir una foreign key tras haber creado la tabla:
ALTER TABLE venta ADD FOREIGN KEY(id_cliente) REFERENCES cliente(id_cliente);
DROP TABLE nombre
DROP TABLE books;
Opcionalmente puedes añadir IF EXISTS tras TABLE, de esa forma si la tabla no existe el comando no dará error:
DROP TABLE IF EXISTS books;
CREATE TABLE rel_autores_publicaciones (id_autor INT, isbn VARCHAR(10), PRIMARY KEY (id_autor, isbn), FOREIGN KEY (id_autor) REFERENCES autores(id), FOREIGN KEY (isbn) REFERENCES publicaciones(isbn)); CREATE TABLE diccionarios (isbn VARCHAR(10) PRIMARY KEY, id_idioma1 INT NOT NULL, id_idioma2 INT, FOREIGN KEY (isbn) REFERENCES publicaciones(idiomas), FOREIGN KEY (id_idioma1) REFERENCES idiomas (id), FOREIGN KEY (id_idioma2) REFERENCES idiomas(id));
INSERT INTO tabla (campo1, campo2…) VALUES (valorNumerico, 'valorString'…)
INSERT INTO authors (author_last, author_first, country) VALUES('Vernon','Olympia','USA');
UPDATE tabla SET campo1=valor1, campo2=valor2, … [WHERE columnaN=valorN]
UPDATE City SET Population=5000000 WHERE Name='JoanBrossa'; UPDATE City SET Population=5000000 WHERE Population<1000000;
SELECT campos FROM tablas [WHERE condicion] [ORDER BY campoOrden tipoOrden] [LIMIT límite]
tabla.campo si queremos hacer un select de campos de distintas tablas.* si queremos decir todos.campo AS nombre.tabla AS otro_nombre, luego en los campos tenemos que usar otro_nombre.campo.[En: MySQL] Expresiones Regulares: REGEXP, RLIKE o NOT REGEXP.LIMIT 3, 2, mostraría el 4º y el 5º registro.SELECT * FROM books; SELECT title, description FROM books; SELECT title AS titulo FROM books; SELECT rec_id, title, description FROM books WHERE genre = 'novel'; SELECT * FROM books ORDER BY title, pub_year LIMIT 20, 10; SELECT books.title, a.name FROM books, authors AS a; SELECT * FROM autores WHERE nombre REGEXP 'r{2}';
Imaginemos una BD donde tenemos una relación de películas\director, para sacar películas por director haremos:
SELECT title, name FROM movies m, directors d WHERE m.director = d.id;
Con JOIN sería:
SELECT title, name FROM movies m INNER JOIN directors d ON (m.director = d.id);
Los joins funcionan de la siguiente manera:
En el siguiente ejemplo se buscan todos los contactos que puede ver el trabajador 1 (los suyos y los que son públicos (visibilidad = 1)):
SELECT * FROM Contactos WHERE Contactos.id IN (SELECT Contactos.id FROM Contactos, RelContTrab WHERE RelConTrab.idCon = Contactos.id AND RelConTrab.idTrab = 1) OR Contactos.id IN (SELECT Contactos.id FROM Contactos WHERE Contactos.Visibility = 1);
También podemos pedir campos que estén o no en una lista:
SELECT * FROM tags WHERE id NOT IN (SELECT id FROM Elements); SELECT * FROM tags WHERE id IN (3, 4, 5);
SELECT COUNT(*) FROM users;
SELECT ciudad.nombre, SUM(pueblo.hab) FROM pueblo, ciudad WHERE (pueblo.id_ciudad = ciudad.id) GROUP BY (ciudad.nombre);
Teniendo dos tablas:
CREATE TABLE b (ca INT, cb INT); CREATE TABLE c (xa INT, xb INT);
Insertamos en la tabla b unos datos cb con un identificador ca (que puede estar repetido), ahora queremos insertar en la tabla c la suma de los valores cb con un mismo identificador:
INSERT INTO c (xa, xb) SELECT ca, SUM(cb) FROM b GROUP BY ca;