tutorial de mysql - tierravirtual.cl de mysql.pdf · $ mysql -hhost.yourdomain.com -uyourname...

40
Tutorial de MySQL M. en C. Erika Vilches

Upload: vanquynh

Post on 13-Feb-2019

250 views

Category:

Documents


0 download

TRANSCRIPT

Tutorial de MySQLM. en C. Erika Vilches

Presentación y BD

• Bajar esta presentación:www.erika-vilches.com/mysql.pdf

• Bajar una base de datos muestra: www.erika-vilches.com/db.sql

• Cargar base de datos: $ wget www.erika-vilches.com/db.sql$ $ mysql --user=yourname --password=yourpass < db.sql

Iniciando el cliente de Línea de Comandos

$ mysqlWelcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 2084 to server version: 4.1.12-standard-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>

Iniciando el cliente (conexión anónima):

Si el cliente no permite conexiones anónimas:$ mysqlERROR 1045 (28000): Access denied for user 'evilches'@'localhost'(using password: NO)

$ mysqlERROR 2002 (HY000): Can't connect to local MySQL server throughsocket '/var/lib/mysql/mysql.sock' (2)

Si el servidor MySQL no esta corriendo:

Errores comunes:

Conexión con usuario y password:

$ mysql --user=yourname --password=yourpass

Password visible en la pantalla en texto plano:

$ mysql --user=yourname --passwordEnter password:

Password no visible en la pantalla. No se despliega mientras se escribe:

ERROR 1045 (28000): Access denied for user 'yourname'@'localhost'(using password: YES)

En caso de error:

$ mysql --host=host.yourdomain.com --user=yourname --password

Para conectarse a un servidor remoto:

$ mysql --host=IP --user=yourname --password

$ mysql --host host.yourdomain.com --user yourname --password

Puerto default: 3306. Si el servidor utiliza un puerto distinto, especificarlo usando o --port= -P

Si se desea utilizar una base de datos en especifico, utilizar o , o simplemente especificando

el nombre de la base de datos al final:--database -D

Abreviadamente:

$ mysql -h host.yourdomain.com -u yourname -p

$ mysql -hhost.yourdomain.com -uyourname -ppaswword

$ mysql -h host.yourdomain.com -u yourname -p password

Incorrecto (trata al password como nombre de la base):

$ mysql --host=host.yourdomain.com --user=yourname --password dbname

Ejecutando comandos SQL

Seleccionando una base de datos a utilizar:

mysql> show databases;+--------------------+| Database |+--------------------+| mysql || test || yourdb |+--------------------+3 rows in set (0.00 sec)

Ver las bases de datos disponibles:

Seleccionar una base de datos:mysql> \u yourdbDatabase changed

mysql> use yourdbDatabase changedo

Si la base no existe:mysql> \u wrongdbERROR 1049 (42000): Unknown database 'wrongdb'

\comando NO es SQL, es comando interno de

MySQL

Mostrando el status de la conexión:

mysql> \s- - - - - - - C:\Program Files\MySQL\MySQL Server 4.1\bin\mysql.exe Ver 14.7 Distrib 4.1.14, for Win32 (ia32)Connection id: 94Current database: mysqlin10Current user: root@localhostSSL: Not in useUsing delimiter: ;Server version: 4.1.14-ntProtocol version: 10Connection: localhost via TCP/IPServer characterset: latin1Db characterset: latin1Client characterset: latin1Conn. characterset: latin1TCP port: 3306Uptime: 35 days 5 hours 34 min 51 sec

Threads: 1 Questions: 542843 Slow queries: 18 Opens: 546Flush tables: 1 Open tables: 0 Queries per second avg: 0.178- - - - - - - -

Para salir del cliente MySQL:

\q quit exit

Delimitación de comandos usando “;” :mysql> SHOW DATABASES ->

mysql> SELECT first_name, last_name -> FROM customer_contacts -> WHERE customer_code = 'PRESINC' -> ORDER BY last_name;+------------+-----------+| first_name | last_name |+------------+-----------+| Abraham | Lincoln || Richard | Nixon || Franklin | Roosevelt || Theodore | Roosevelt |+------------+-----------+4 rows in set (0.00 sec)

mysql> show databases;+--------------------+| Database |+--------------------+| mysql || test || yourdb |+--------------------+3 rows in set (0.00 sec)

Otra forma de delimitar un comando “\g”:mysql> show databases \g+--------------------+| Database |+--------------------+| mysql || test || yourdb |+--------------------+3 rows in set (0.00 sec)

Formato de salida -> Vertical:mysql> SELECT * FROM products -> \G*************************** 1. row *************************** code: MINI name: Small productweight: 1.50 price: 5.99*************************** 2. row *************************** code: MIDI name: Medium productweight: 4.50 price: 9.99*************************** 3. row *************************** code: MAXI name: Large productweight: 8.00 price: 15.993 rows in set (0.02 sec)

Cuando un query no regresa nada:mysql> SELECT * -> FROM emptytable;Empty set (0.00 sec)

Producido con o con el switch . Tambien existe el switch y (switchs usados al iniciar

el cliente).

\G --vertical

--html --xml

Comando SELECT

• Utilidad: Obtener registros de información

• Se debe especificar de qué tabla con FROM

Regresando columnas individuales:mysql> SELECT name -> FROM customers;+-------------------------+| name |+-------------------------+| Presidents Incorporated || Science Corporation || Musicians of America |+-------------------------+3 rows in set (0.02 sec)

Devolverá todos los registros de la tabla a menos que se le indique lo contrario

Regresando columnas múltiples:

mysql> SELECT name, price, weight -> FROM products;+----------------+-------+---------+| name | price | weight |+----------------+-------+---------+| Small product | 5.99 | 1.50 || Medium product | 9.99 | 4.50 || Large product | 15.99 | 8.00 |+----------------+-------+---------+3 rows in set (0.00 sec)

Regresando todas las columnas:

mysql> SELECT * -> FROM products;+------+----------------+--------+-------+| code | name | weight | price |+------+----------------+--------+-------+| MINI | Small product | 1.50 | 5.99 || MIDI | Medium product | 4.50 | 9.99 || MAXI | Large product | 8.00 | 15.99 |+------+----------------+--------+-------+3 rows in set (0.00 sec)

Conociendo la definición de una tabla:mysql> DESCRIBE products;+--------+--------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+--------+--------------+------+-----+---------+-------+| code | varchar(10) | | | | || name | varchar(40) | | | | || weight | decimal(6,2) | | | 0.00 | || price | decimal(6,2) | | | 0.00 | |+--------+--------------+------+-----+---------+-------+4 rows in set (0.00 sec)

Si la tabla no existe:mysql> SELECT * -> FROM product;ERROR 1146 (42S02): Table sampdb.product' doesn't exist

Si la columna no existe:mysql> SELECT name -> FROM customer_contacts;ERROR 1054 (42S22): Unknown column 'name' in 'field list'

Errores de sintaxis:

mysql> SELECT first_name, last name, -> FROM customer_contacts;ERROR 1064 (42000): You have an error in your SQL syntax; checkthe manual that corresponds to your MySQL server version forthe right syntax to use near 'FROM customer_contacts' at line 2

mysql> SELECT name -> FORM products;ERROR 1064 (42000): You have an error in your SQL syntax; checkthe manual that corresponds to your MySQL server version forthe right syntax to use near 'products' at line 2

Devolviendo la lista de bases de datos:mysql> SHOW DATABASES;+-------------------+| Database |+-------------------+| mysqlin10 || mydb |+-------------------+2 rows in set (0.00 sec)

Devolviendo la lista de tablas en la base de datos en uso:

mysql> SHOW TABLES;+---------------------+| Tables_in_mysqlin10 |+---------------------+| customer_contacts || customers || order_lines || orders || products |+---------------------+5 rows in set (0.00 sec)

mysql> SHOW TABLES FROM sampdb;+---------------------+| Tables_in_sambdb |+---------------------+| customer_contacts || customers || order_lines || orders || products |+---------------------+5 rows in set (0.00 sec)

Devolviendo la lista de tablas en otra base de datos distinta a la que esta en uso:

mysql> SHOW COLUMNS FROM products;+--------+--------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+--------+--------------+------+-----+---------+-------+| code | varchar(10) | | | | || name | varchar(40) | | | | || weight | decimal(6,2) | | | 0.00 | || price | decimal(6,2) | | | 0.00 | |+--------+--------------+------+-----+---------+-------+4 rows in set (0.00 sec)

Devolver la estructura de una tabla:

Shotcut: DESCRIBE table

mysql> DESCRIBE products;+--------+--------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+--------+--------------+------+-----+---------+-------+| code | varchar(10) | | | | || name | varchar(40) | | | | || weight | decimal(6,2) | | | 0.00 | || price | decimal(6,2) | | | 0.00 | |+--------+--------------+------+-----+---------+-------+4 rows in set (0.00 sec)

Cláusula WHERE

• Utilidad: Se añade al comando SELECT para filtrar los resultados basándose en una condición (solo los registros que la cumplan serán devueltos).

mysql> SELECT * -> FROM products -> WHERE code(=)'MINI';+------+----------------+--------+-------+| code | name | weight | price |+------+----------------+--------+-------+| MIDI | Medium product | 4.50 | 9.99 || MAXI | Large product | 8.00 | 15.99 |+------+----------------+--------+-------+2 rows in set (0.02 sec)s

Filtrado sobre un valor exacto:

mysql> SELECT id, first_name, last_name -> FROM customer_contacts -> WHERE customer_code = 'SCICORP';+----+------------+-----------+| id | first_name | last_name |+----+------------+-----------+| 4 | Albert | Einstein || 5 | Charles | Darwin || 6 | Marie | Curie || 7 | Benjamin | Franklin |+----+------------+-----------+4 rows in set (0.03 sec)

mysql> SELECT * -> FROM products -> WHERE code = 'MIDI';+------+----------------+--------+-------+| code | name | weight | price |+------+----------------+--------+-------+| MIDI | Medium product | 4.50 | 9.99 |+------+----------------+--------+-------+1 row in set (0.00 sec)

Filtrado sobre un rango de valores:

mysql> SELECT * -> FROM products -> WHERE price <= 9.99;+------+----------------+--------+-------+| code | name | weight | price |+------+----------------+--------+-------+| MINI | Small product | 1.50 | 5.99 || MIDI | Medium product | 4.50 | 9.99 |+------+----------------+--------+-------+2 rows in set (0.00 sec)

mysql> SELECT last_name -> FROM customer_contacts -> WHERE last_name > 'G';+-----------+| last_name |+-----------+| Lincoln || Nixon || Roosevelt || Gershwin || Lennon |+-----------+5 rows in set (0.00 sec)

“Gershwin” es mayor que “G”, funciona igual que en un diccionario

(iría después).

Uso de comillas en valores no numéricos:

mysql> SELECT last_name -> FROM customer_contacts -> WHERE first_name = Benjamin;ERROR 1054 (42S22): Unknown column 'Benjamin' in 'where clause'

mysql> SELECT last_name -> FROM customer_contacts -> WHERE first_name = 'Benjamin';+-----------+| last_name |+-----------+| Franklin || Britten |+-----------+2 rows in set (0.00 sec)

Incorrecto:

Correcto:

mysql> SELECT last_name -> FROM customer_contacts -> WHERE 'Benjamin' = first_name;+-----------+| last_name |+-----------+| Franklin || Britten |+-----------+2 rows in set (0.00 sec)

Funciona pero esta fuera de la convenciónWHERE column = ‘value’

mysql> SELECT first_name, last_name -> FROM customer_contacts -> WHERE first_name = last_name;Empty set (0.00 sec)

Peculiar comparación de columnas de la misma tabla:

Cláusula ORDER BY

• Utilidad: Especificar el ordenamiento del resultado de un query.

mysql> SELECT * -> FROM products -> ORDER BY price;+------+----------------+--------+-------+| code | name | weight | price |+------+----------------+--------+-------+| MINI | Small product | 1.50 | 5.99 || MIDI | Medium product | 4.50 | 9.99 || MAXI | Large product | 8.00 | 15.99 |+------+----------------+--------+-------+3 rows in set (0.00 sec)

mysql> SELECT first_name, last_name -> FROM customer_contacts -> WHERE customer_code = 'SCICORP' -> ORDER BY last_name; +------------+-----------+| first_name | last_name |+------------+-----------+| Marie | Curie || Charles | Darwin || Albert | Einstein || Benjamin | Franklin |+------------+-----------+4 rows in set (0.00 sec)

Ordenando sobre una sola columna:

Ordenando sobre múltiples columnas:mysql> SELECT order_date, customer_code -> FROM orders -> ORDER BY order_date, customer_code;+------------+---------------+| order_date | customer_code |+------------+---------------+| 2006-01-23 | PRESINC || 2006-01-23 | SCICORP || 2006-01-26 | PRESINC || 2006-02-01 | MUSGRP || 2006-02-02 | MUSGRP || 2006-02-02 | SCICORP || 2006-02-05 | SCICORP |+------------+---------------+7 rows in set (0.00 sec)

Especificando el orden:mysql> SELECT * -> FROM products -> ORDER BY weight DESC;+------+----------------+--------+-------+| code | name | weight | price |+------+----------------+--------+-------+| MAXI | Large product | 8.00 | 15.99 || MIDI | Medium product | 4.50 | 9.99 || MINI | Small product | 1.50 | 5.99 |+------+----------------+--------+-------+3 rows in set (0.00 sec)

Opcional: ASC

Combinando cláusulas WHERE

Operador AND:

mysql> SELECT * FROM orders -> WHERE customer_code = 'Scicorp' -> AND order_date >= '2006-02-01';+----+---------------+------------+| id | customer_code | order_date |+----+---------------+------------+| 4 | Scicorp | 2006-02-02 || 5 | SCICORP | 2006-02-05 |+----+---------------+------------+2 rows in set (0.00 sec)

mysql> SELECT * FROM orders -> WHERE customer_code = 'Scicorp' -> OR order_date >= '2006-02-01';+----+---------------+------------+| id | customer_code | order_date |+----+---------------+------------+| 3 | SCICORP | 2006-01-23 || 4 | SCICORP | 2006-02-02 || 5 | SCICORP | 2006-02-05 || 6 | MUSGRP | 2006-02-01 || 7 | MUSGRP | 2006-02-02 |+----+---------------+------------+5 rows in set (0.00 sec)

Operador OR:

Buscar un mismo valor en dos columnas:

mysql> SELECT first_name, last_name -> FROM customer_contacts -> WHERE first_name = 'Franklin' -> OR last_name = 'Franklin';+------------+-----------+| first_name | last_name |+------------+-----------+| Franklin | Roosevelt || Benjamin | Franklin |+------------+-----------+2 rows in set (0.00 sec)

Buscar dos valores en la misma columna:

mysql> SELECT first_name, last_name -> FROM customer_contacts -> WHERE first_name = 'Benjamin' -> OR first_name = 'Charles';+------------+-----------+| first_name | last_name |+------------+-----------+| Charles | Darwin || Benjamin | Franklin || Benjamin | Britten |+------------+-----------+3 rows in set (0.00 sec)

mysql> SELECT first_name, last_name -> FROM customer_contacts -> WHERE first_name IN ('Benjamin', 'Charles');+------------+-----------+| first_name | last_name |+------------+-----------+| Charles | Darwin || Benjamin | Franklin || Benjamin | Britten |+------------+-----------+3 rows in set (0.00 sec)

o

Buscar en un rango de valores (inclusive):mysql> SELECT * -> FROM orders -> WHERE order_date BETWEEN '2006-01-24' AND '2006-01-30';+----+---------------+------------+| id | customer_code | order_date |+----+---------------+------------+| 2 | PRESINC | 2006-01-26 || 3 | SCICORP | 2006-01-23 |+----+---------------+------------+2 rows in set (0.00 sec)

Negando una condición:mysql> SELECT first_name, last_name FROM customer_contacts -> WHERE customer_code = 'PRESINC' -> AND first_name NOT IN ('Abraham', 'Theodore');+------------+-----------+| first_name | last_name |+------------+-----------+| Richard | Nixon || Franklin | Roosevelt |+------------+-----------+2 rows in set (0.00 sec)

mysql> SELECT * FROM orders -> WHERE order_date NOT BETWEEN '2006-01-26' AND '2006-02-03';+----+---------------+------------+| id | customer_code | order_date |+----+---------------+------------+ | 1 | PRESINC | 2006-01-23 || 3 | SCICORP | 2006-01-23 || 5 | SCICORP | 2006-02-05 |+----+---------------+------------+3 rows in set (0.00 sec)

Precedencia de operadores: AND > OR > NOT

mysql> SELECT customer_code, first_name, last_name -> FROM customer_contacts -> WHERE customer_code = 'SCICORP' -> AND first_name = 'Albert' -> OR first_name = 'Benjamin';+---------------+------------+-----------+| customer_code | first_name | last_name |+---------------+------------+-----------+| SCICORP | Albert | Einstein || SCICORP | Benjamin | Franklin || MUSGRP | Benjamin | Britten |+---------------+------------+-----------+3 rows in set (0.00 sec)

Cambiando las precedencias:mysql> SELECT customer_code, first_name, last_name -> FROM customer_contacts -> WHERE customer_code = 'SCICORP' -> AND (first_name = 'Albert' -> OR first_name = 'Benjamin');+---------------+------------+-----------+| customer_code | first_name | last_name |+---------------+------------+-----------+| SCICORP | Albert | Einstein || SCICORP | Benjamin | Franklin |+---------------+------------+-----------+2 rows in set (0.00 sec)

Limitando el numero de registros de respuesta:mysql> SELECT first_name, last_name -> FROM customer_contacts -> ORDER BY last_name -> LIMIT 3;+------------+-----------+| first_name | last_name |+------------+-----------+| Benjamin | Britten || Marie | Curie || Charles | Darwin |+------------+-----------+3 rows in set (0.00 sec)

Devolviendo el valor más alto solamente:mysql> SELECT * -> FROM products -> ORDER BY price DESC -> LIMIT 1;+------+---------------+--------+-------+| code | name | weight | price |+------+---------------+--------+-------+| MAXI | Large product | 8.00 | 15.99 |+------+---------------+--------+-------+1 row in set (0.00 sec)

Saltándose registros: (Offset)

mysql> SELECT email -> FROM customer_contacts -> ORDER BY email -> LIMIT 3;+--------------------------+| email |+--------------------------+| [email protected] || [email protected] || [email protected] |+--------------------------+3 rows in set (0.00 sec)

mysql> SELECT email -> FROM customer_contacts -> ORDER BY email -> LIMIT 3,3;+--------------------------+| email |+--------------------------+| [email protected] || [email protected] || [email protected] |+--------------------------+3 rows in set (0.00 sec)

Solo los primeros 3: (equivalente a LIMIT 0,3)

Solo 3, saltándose los primeros 3:

Aún faltan muchos comandos para generar consultas por ver... pero de momento es

mas importante que conozcan como crear una base de datos... (proyecto de su

profesor)

Manejando una Base de Datos

mysql> CREATE DATABASE newdb;Query OK, 1 row affected (0.02 sec)

Si la base de datos ya existe:mysql> CREATE DATABASE newdb;ERROR 1007 (HY000): Can't create database 'newdb';database exists

Creando la base:

Prevención:mysql> CREATE DATABASE IF NOT EXISTS newdb;Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> SHOW WARNINGS;+-------+------+--------------------------------------------------+| Level | Code | Message |+-------+------+--------------------------------------------------+| Note | 1007 | Can't create database 'newdb'; database exists |+-------+------+--------------------------------------------------+1 row in set (0.00 sec)

Cambiando las características de una base existente:mysql> ALTER DATABASE greekdb -> CHARACTER SET ascii;Query OK, 1 row affected (0.00 sec)

Eliminando una base:mysql> DROP DATABASE greekdb;Query OK, 0 rows affected (0.00 sec)

Creando una tabla:CREATE TABLE products ( product_code VARCHAR(10) PRIMARY KEY, name VARCHAR(40) NOT NULL UNIQUE, weight DECIMAL(6,2) NOT NULL, price DECIMAL(6,2) NOT NULL);

Especificando valores default:

mysql> CREATE TABLE people ( -> name VARCHAR(40), -> sex VARCHAR(6) DEFAULT 'Female' -> );Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO people (name) -> VALUES ('Jane Doe');Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM people;+----------+--------+| name | sex |+----------+--------+| Jane Doe | Female |+----------+--------+1 row in set (0.00 sec)

Autoincrementando columnas:CREATE TABLE orders ( order_id INT PRIMARY KEY AUTO_INCREMENT, customer_code VARCHAR(10) NOT NULL, order_date DATE NOT NULL);

mysql> INSERT INTO orders (customer_code, order_date) -> VALUES ('SCICORP','2006-03-20');Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM orders -> ORDER BY order_id DESC -> LIMIT 2;+----------+---------------+------------+| order_id | customer_code | order_date |+----------+---------------+------------+| 8 | SCICORP | 2006-03-20 || 7 | MUSGRP | 2006-02-02 |+----------+---------------+------------+2 rows in set (0.00 sec)

Cambiando la definición de una tabla:

mysql> ALTER TABLE customer_contacts -> ADD fax VARCHAR(12);Query OK, 11 rows affected (0.00 sec)Records: 11 Duplicates: 0 Warnings: 0

Añadiendo una columna:

mysql> ALTER TABLE customer_contacts -> CHANGE fax fax TEXT;Query OK, 11 rows affected (0.01 sec)Records: 11 Duplicates: 0 Warnings: 0

Cambiando el tipo de la columna sin cambiar el nombre:

Eliminando una columna:

mysql> ALTER TABLE customer_contacts -> DROP fax;Query OK, 11 rows affected (0.00 sec)Records: 11 Duplicates: 0 Warnings: 0

Eliminando una tabla:

mysql> DROP TABLE people;Query OK, 0 rows affected (0.00 sec)

Otra cosa útil para su proyecto... el manejo de usuarios

Manejo de UsuariosCreando un usuario, que se conectara solamente desde localhost:

mysql> CREATE USER evilches@localhost IDENTIFIED BY 'mypass';Query OK, 0 rows affected (0.02 sec)

Asignando o cambiando un password:mysql> SET PASSWORD FOR evilches@localhost = PASSWORD('newpass');Query OK, 0 rows affected (0.00 sec)

Error (omitir la función password):mysql> SET PASSWORD FOR evilches@localhost = 'newpass';ERROR 1372 (HY000): Password hash should be a 41-digithexadecimal number

mysql> SET PASSWORD = PASSWORD('newpass');Query OK, 0 rows affected (0.00 sec)

Cambiar password del usuario loggeado:

Dando privilegios:

mysql> GRANT SELECT, INSERT -> ON mysql10.products -> TO evilches@localhost;Query OK, 0 rows affected (0.00 sec)

Privilegio select e insert para usuario evilches, en localhost, en la tabla products, de la base mysql10:

Al conectarse como el usuario evilches, a la base mysql10: mysql> show tables;

+-------------------+| Tables_in_mysql10 |+-------------------+| products |+-------------------+1 row in set (0.00 sec)

Permite hacer consultas sobre la tabla, insertar registros, pero no le permite usar DELETE

mysql> INSERT INTO products -> (product_code, name, weight, price) -> VALUES -> ('MYPROD', 'My new product', 1.00, 1.99);Query OK, 1 row affected (0.03 sec)

mysql> DELETE FROM products;ERROR 1142 (42000): DELETE command denied to user 'evilches'@'localhost' for table 'products'

Revocando privilegios:

mysql> REVOKE INSERT -> ON mysql10.products -> FROM evilches@localhost;Query OK, 0 rows affected (1.25 sec)

Revocando el privilegio INSERT (el privilegio SELECT asignado no se ve afectado):

Muchas gracias por su atención.

Dudas: [email protected]