Herramientas de usuario

Herramientas del sitio


db:sql

¡Esta es una revisión vieja del documento!


SQL

  • Comentarios, como en C: /* … */

Edición de bases de datos

Crear

CREATE DATABASE nombre

CREATE DATABASE bookstore;

Edición de tablas

Crear

CREATE TABLE nombre (columna tipo propiedades, columna tipo propiedades…)

CREATE TABLE books (
  rec_id INT, 
  title VARCHAR(50),
  author VARCHAR(50)
);

Modificar

ALTER TABLE nombre modificiación, modificación…
Las modificaciones posibles:

  • ADD COLUMN columna tipo propiedades
  • CHANGE COLUMN columna nuevo_nombre tipo propiedades
ALTER TABLE books
  CHANGE COLUMN rec_id rec_id INT AUTO_INCREMENT PRIMARY KEY,
  CHANGE COLUMN author author_id INT,
  ADD COLUMN description BLOB;

Tipos de datos

  • Enteros: BIGINT → 8bytes, INT → 4bytes, MEDIUMINT → 3bytes, SMALLINT → 2bytes, TINYINT → 1byte
  • Reales: DECIMAL[(precisión)] → precisión + 2bytes, = DEC, DOUBLE[(tamaño de muestra, precisión)] → 8bytes, FLOAT → 4bytes
  • Texto: VARCHAR(tamaño), LONGTEXT, TEXT, CHAR, TINYTEXT,
  • Binarios: BLOB = TEXT BINARY, LONG BLOB = LONGTEXT BINARY
  • Tiempo: DATE → yyyy-mm-dd (3bytes), DATETIME → yyyy-mm-dd hh:mm:ss (8bytes), TIME → hh:mm:ss (3bytes), TIMESTAMP → yyyymmddhhmmss (4bytes), YEAR → yyyy (1byte)
  • Enumeraciones: ENUM, SET

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).

Propiedades

  • AUTO_INCREMENT
  • PRIMARY KEY
  • NOT NULL
  • UNSIGNED (numéricos)
  • ZERO FILL (numéricos)
  • BINARY (texto)

Las foreign keys

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);

Eliminar

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;

Ejemplos

  • Creación de una tabla con varias primary keys y varias foreign keys:
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));

Edición de datos

Insertar

INSERT INTO tabla (campo1, campo2…) VALUES (valorNumerico, 'valorString'…)

INSERT INTO authors (author_last, author_first, country) VALUES('Vernon','Olympia','USA');

Modificar

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;

Eliminar

Consulta de datos

Selects

SELECT campos FROM tablas [WHERE condicion] [ORDER BY campoOrden tipoOrden] [LIMIT límite]

  • Los campos pueden ser expresados como:
    • Nombres de campos de una tabla separados por comas.
    • tabla.campo si queremos hacer un select de campos de distintas tablas.
    • Usaremos * si queremos decir todos.
    • Si queremos que un campo, cuando se muestre, su cabecera sea distinta a la que tiene realmente haremos: campo AS nombre.
  • Las tablas…
    • Si indicamos que se muestren campos de varias tablas, todas estas tablas deben de aparecer aquí.
    • Si queremos usar un alias para los nombres de tablas para que así al elegir los campos sea más sencillo usaremos tabla AS otro_nombre, luego en los campos tenemos que usar otro_nombre.campo.
  • Las condiciones…
    • Las separaremos por AND (&&), OR (||), NOT (!), XOR.
    • Realizaremos las comprobaciones con:
      • Operadores: =, !=, <>, ⇐, >=, <, >
      • valor BETWEEN valor1 AND valor2
      • valor IN (valor1, valor2…) o con NOT IN
      • valor1 LIKE valor2 o con NOT LIKE
      • [En: MySQL] Expresiones Regulares: REGEXP, RLIKE o NOT REGEXP.
  • Para la ordenación de campos…
    • Se elige el campo por el cual se ordenará la select.
    • El tipoOrden pueden ser: ASC, DESC, si no se indica tipoOrden este será ASC (ascendente).
    • Puedes indicar varias ordenaciones separando estas por comas.
  • El límite es un número que indica el máximo de elementos que han de mostrarse.
    • Podemos indicar dos números, el primero los registros anteriores a los mostrados y el segundo cuantos mostraremos. Por ejemplo, LIMIT 3, 2, mostraría el 4º y el 5º registro.
  • Grupos…
    • Utilizando la clausula GROUP BY nos mostrará los resultados agrupados por el campo indicado tras esta.

Ejemplos

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}';

Selects avanzados

joins

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:

  • Teniendo 2 tablas (T1 y T2) con unos campos relacionados vamos a ver lo que devolverían los distintos joins (la parte azul de las tablas).

  • INNER JOIN

  • OUTER JOIN

  • LEFT JOIN

  • LEFT OUTER JOIN

Selects anidados

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);

Funciones

  • count devuelve el número de registros de una serie de campos en una tabla:
SELECT COUNT(*) FROM users;
  • sum devuelve la suma de los valores de un campo numérico en una consulta:
SELECT ciudad.nombre, SUM(pueblo.hab) FROM pueblo, ciudad WHERE (pueblo.id_ciudad = ciudad.id) GROUP BY (ciudad.nombre);

Notas

Insertar los datos de un select

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;
db/sql.1278775507.txt.gz · Última modificación: 2020/05/09 09:24 (editor externo)