
SQLite es una biblioteca de C que implementa un motor de base de datos SQL.
SQLite es un proyecto de código abierto.
No se requiere de ninguna biblioteca externa para compilar esta extensión desde PHP.
La extensión SQLite3 está activada por defecto desde PHP 5.3.0.
Podemos conectarnos con SQLite por medio de una extesión o por medio de PDO.
Podemos verificar cuál de los métodos está instalada por medio de la funció extension_loaded().
Podemos activar o desactivar cualquiera de ellas dentro de php.ini.
Una clase que se usa como interfaz de bases de datos SQLite 3.
Existe una clase que se llama SQLite3.
No hay necesidad de “conectarse”, sino que se crea una clase para la base de datos, “extendiéndose” de la clase SQLite3.
El lenguage SQL lo podemos dividir en tres grandes secciones principales:
DDL - Data Definition Language: create, alter y drop
DML - Data Manipulation Language: Insert, delete, update
DQL - Data Query Language: Select
Una forma de delimitar un string es mediante la sintaxis heredoc: <<<. Después de este operador, se deberá proporcionar un identificador y justo después una nueva línea. A continuación va el propio string, y para cerrar la notación se pone el mismo identificador.
El identificador de cierre debe empezar en la primera columna de la nueva línea. Asimismo, el identificador debe seguir las mismas reglas de nomenclatura de las etiquetas en PHP: debe contener solo caracteres alfanuméricos y guiones bajos y debe empezar con un carácter alfabético o un guión bajo.
Una herramienta muy poderosa para convertir a nuestra computadora en un servidor web es MAMP. Su forma de instalar es muy fácil.
MAMP es una poderosa herramienta para convertir nuestra computadora en un servidor web local.
Por omisión PHP envía errores a pantalla con archivo, número de línea y mensaje.
En algunas instalaciones, por ejemplo en MAMP, los errores pueden estar deshabilitados.
Podemos habilitarlos con:
ini_set('display_errors', 1);
error_reporting(E_ALL);
XAMPP es un entorno de desarrollo web gratuito y de código abierto que permite a los usuarios crear y probar sitios web en sus propias computadoras. Es una distribución de Apache que incluye MariaDB (anteriormente MySQL), PHP, y Perl. XAMPP es multiplataforma, lo que significa que se puede usar en Windows, macOS y Linux.
Entrar a packagecontrol.io
Abrir la consola (view > show console).
Copiar el código en la consola y ejecutarlo.
Cerrar y abrir sublime text.
[Ctrl]-[shift]-[p] o tools > command palette
Escribimos
Install packages > sublime lint > detecta problemas de sintaxis.
Install packages > phpcs
Los archivos del curso
Apuntes de la sección 1: Introducción a SQLite
Clase
Descripción
NULL
NULL es considerado un valor vacío.
INTEGER
El valor entero con signo entre 1 y 8 bytes dependiendo de la magnitud del valor.
REAL
El valor es de punto flotante, se almacena como un número de coma flotante de 8 bytes IEEE.
TEXT
El valor es una cadena de texto, utilizando la codificación de la base de datos ( UTF- 8, UTF - 16BE o UTF - 16LE)
BLOB
Permite almacenar objetos en formato BLOB (Binary Large Objects) como imágenes, archivos de sonido y otros objetos multimedia; a veces se almacenan como BLOB código de binarios.
SQLite tipo de afinidad o Affinity Type:
En SQLite contiene un concepto llamado “afinidad” o “affinity”. Cada columna puede seguir almacenando en su tipo de columna, pero puede ser representado con diferente “máscara”, con lo cual lo hace “a fin” con otras bases de datos.
Cada columna en SQLite 3 tiene una clase y una afinidad:
CREATE TABLE database_name.table_name(
column1 datatype,
column2 datatype,
column3 datatype,
.....
columnN datatype,
);
Versión 3.3+
create table if not exists tabla(col1 typ1, ..., colN typN)
En SQLite, con la sentencia DROP TABLE se elimina una tabla con su definición, datos asociados, índices, triggers, constrains y permisos.
Cuando una tabla es eliminada, no hay forma de recuperarla. Se borra en forma definitiva.
Sintaxis:
DROP TABLE basededatos.tabla;
En versión 3.3. y más:
drop table if exists TableName
Modifica la columna de la tabla. Ejemplos de comandos “constraints”:
NOT NULL
PRIMARY KEY
UNIQUE
AUTOINCREMENT
DEFAULT
CURRENT_TIME
CURRENT_DATE
CURRENT_TIMESTAMP
Podemos escribir “constraints” a nivel tabla.
Por lo general involucra a más de una columna, pero puede involucrar sólo una sin problema.
Generalmente utilizamos los constraint PRIMARY KEY, UNIQUE y CHECK a nivel tabla cuando involucran a más de una columna
Podemos crear tabla desde un query o la sentencia select.
CREATE [TEMP] TABLE nombreTabla AS SELECT query;
El query sólo se ejecuta una vez, cuando se crea la tabla.
Las tablas temporales solo existen cuando la base de datos esté abierta. Cuando se cierra, desaparecen.
Las tablas temporales sólo pueden ser accesadas por la conexión con la que fueron creadas
En SQLite la sentencia ALTER TABLE solo puede añadir columnas y renombrar la tabla.
No podemos eliminar columnas con esta sentencia.
Las nuevas columnas siempre se añaden al final de la tabla.
Si necesitas hacer muchas modificaciones, es mejor hacer una tabla nueva y copiar los datos con un SELECT.
Siempre es importante declarar una o varias columnas como Primary Key, que es el índice principal de la tabla.
Sólo podemos tener un índice principal por tabla.
Las llaves en un índice principal deben ser únicas, es decir, no repetirse.
El constraint “UNIQUE” queda implicito en “PRIMARY KEY”
Las vistas o views proporcionan una manera de empaquetar consultas en un objeto predefinido.
Una vez creadas, las vistas actúan de como tablas de sólo lectura.
Al igual que las tablas, las vistas pueden ser temporales.
La sintaxis básica del comando CREATE VIEW es:
CREATE [TEMP] VIEW nombreVista AS SELECT query
Los índices son una manera rápida de encontrar información en la tabla.
La sintaxis para crear un índice, una vez que la tabla ha sido creada es:
CREATE [UNIQUE] INDEX nombre_index ON nombre_tabla ( columna1 [, ...] );
Ni UNIQUE ni PRIMARY KEY implican que no se acepten valores nulos
En esta clase encontrarás los apuntes del capítulo en los recursos (archivo PDF).
La sentencia INSERT INTO nos sirve para insertar datos en una tabla de una base de datos.
SQLite cuenta con dos sintaxis:
1)
INSERT INTO tabla(column1, column2, column3,...columnN)]
VALUES (value1, value2, value3,...valueN);
2)
INSERT INTO tabla VALUES (value1,value2,value3,...valueN);
La segunda sintaxis de la sentencia INSERT no es necesario especificar las columnas, pero debe escribirse los valores para cada una de las columnas en el orden en que fueron creadas en la tabla.
Si una columna tiene el constraint de “AUTOINCREMENT”, debes de enviar un valor de NULL para que se autoincremente.
Puedes poblar una tabla desde otra, siempre y cuando las columnas de ambas coincidan en la tabla que añade los registros.
INSERT INTO tabla1[(column1, column2, ... columnN)]
SELECT column1, column2, ...columnN
FROM tabla2
[WHERE condition];
Se verá un ejemplo cuando se vea la sentencia SELECT
Con la sentencia UPDATE podemos modificar cualquiera de las columnas de cualquier registro o conjunto de registros (incluso de toda la tabla).
Su sintaxis es:
UPDATE nombre_tabla SET columna1=valor1 [, ...] WHERE expresión
Si se omite la sentencia WHERE, se modificarán las columnas de TODA la tabla.
Con la sentencia DELETE podemos borrar uno o todos los registros de una tabla.
Sintax:
DELETE FROM nombre_tabla
WHERE [condición];
Los registros son borrados en forma definitiva.
En este video manejaremos la sentencia SELECT para vaciar los datos de una tabla.
En este video crearemos el formato para la captura de los datos de nuestra tabla del curso.
En este video insertaremos los datos y realizaremos una validación previa.
En este video crearemos la estructura básica de los archivos para nuestro ABC y conectaremos los diferentes archivos.
Vaciaremos los datos de la tabla en el formato para la modificación de los mismos.
Una vez modificados los datos por el usuario, los validaremos y los almacenaremos en la tabla.
Haremos una página previa a borrar el archivo, donde el usuario podrá decidir si borra el mismo o no lo hace.
Anexo encontrarás los apuntes de la sección.
Con la sentencia SELECT podemos extraer la información de una tabla.
Sintaxis:
SELECT column1, column2, columnN FROM nombre_tabla;
Para extraer todas las columnas, utilizamos en asterisco.
SELECT * FROM nombre_tabla;
Por medio de la cláusula WHERE podemos seleccionar por medio de una expresión. La cláusula WHERE es la misma para las sentencias SELECT, UPDATE y DELETE.
Usamos operadores dentro de esa expresión:
Operadores matemáticos
Operadores de comparación
Operadores lógicos
Operadores de desplazamientos de bits
Con la cláusula DISTINCT eliminamos los registros duplicados de una selección.
Sintaxis:
SELECT DISTINCT column1, column2,.....columnN
FROM nombre_tabla
WHERE [condición]
Suponga que la variable “a” tiene un valor de 5 y la variable “b”, un valor de 10.
Ejemplo:
== Verifica si dos valores son iguales o no. (a == b) Regresaría falso.
= Verifica si dos valores son iguales o no. (a = b) Regresaría falso.
+ Suma valores de columnas o constantes
- Resta valores entre columnas o constantes
* Multiplicación entre columnas o constantes
/ División entre columnas o constantes
% Módulo entre columnas o constante
AND Es verdadera si todas las expresiones son verdaderas.
BETWEEN Regresan los registros que se encuentran ENTRE dos valores.
EXISTS Busca los renglones dentro de un subquery.
IN Regresa los renglones si existe en una lista.
OR Regresa verdadero si una de las condiciones .
IS NULL Regresa si la columna es nula.
IS Funciona como el operador igual a (=)
IS NOT Funciona como el operador diferente a (!=)
|| Concatena dos cadenas..
UNIQUE Regresa los valores que no estén duplicados.
El operador GLOB es muy similar a LIKE, pero se apega más a UNIX o LINUX.
Es sensible a mayúsculas y minúsculas, utiliza como comodines “*” para una serie de carcateres o cero y “?” para un sólo caracter.
Por medio de la cláusula ORDER BY nos permite ordenar la extracción de datos en forma ascendente o descendente.
Sintaxis:
SELECT lista_columnas
FROM nombre_tablas
[WHERE condición]
[ORDER BY columna1, columna2, .. columnaN] [ASC | DESC];
Por medio de la cláusula ORDER BY nos permite ordenar la extracción de datos en forma ascendente o descendente.
Sintaxis:
SELECT lista_columnas
FROM nombre_tablas
[WHERE condición]
[ORDER BY columna1, columna2, .. columnaN] [ASC | DESC];
La cláusula LIMIT nos permite limitar el número de registros extraídos de una tabla.
Sintaxis:
SELECT columna1, columna2, columnaN
FROM tablas
LIMIT [num_renglones]
La cláusula LIMIT nos permite limitar el número de registros extraídos de una tabla.
Sintaxis:
SELECT columna1, columna2, columnaN
FROM tablas
LIMIT [num_renglones]
La cláusula LIMIT nos permite limitar el número de registros extraídos de una tabla.
Sintaxis:
SELECT columna1, columna2, columnaN
FROM tablas
LIMIT [num_renglones]
La cláusula GROUP BY, dentro de SELECT, nos sirve para agrupar los registros idénticos.
La cláusula GROUP BY sigue a la cláusula WHERE y precede a ORDER BY (si se utiliza).
Puede utilizar más de una columna en GROUP BY.
Todas las columnas utilizadas en el GROUP BY deben estar incluidas en la lista de columnas del SELECT.
Sintaxis:
SELECT column-list
FROM table_name
WHERE [ conditions ]
GROUP BY column1, column2....columnN
ORDER BY column1, column2....columnN
La cláusula HAVING permite filtrar los resultados obtenidos por medio de GROUP BY .
La cláusula HAVING afecta a las columnas que son usuadas en GROUP BY, no afecta a las columnas utilizadas en el SELECT.
La cláusula HAVING debe seguir la cláusula GROUP BY en una consulta y también preceder a la cláusula ORDER BY (si se utiliza)
En esta clase encontrarás los apuntes de la sección en los recursos descargables en formato PDF.
COUNT(*)
MAX(*)
MIN(*)
AVG(*)
SUM(*)
RANDOM(*)
ABS(*)
UPPER(*) y LOWER(*)
LENGTH(*)
SUBSTR()
Por medio del ALIAS podemos renombrar temporalmente con ALIAS.
Las tablas y columnas sólo son renombradas dentro de la sentencia SQL.
Terminando la sentencia, se pierden los valores de ALIAS.
Las columnas se renombran únicamente durante el query.
La función COUNT() cuenta los registros extraídos en el SELECT.
Para extraer su valor es mejor utilizar un alias.
Las funciones MAX() y MIN() extraen el valor máximo y mínimo de un criterio en una tabla o conjuntos de tablas.
La función de agregado AVG() nos permite obtener el promedio de la columna de los registros extraídos en una sentencia SELECT.
La función SUM(*) realiza la suma de las columnas que cumplan los criterios de extracción en un query o SELECT.
La función random() regresa un número pseudo-aleatorio entero entre -9223372036854775808 y +9223372036854775807.
Las funciones UPPER() y LOWER() modifica una cadena a mayúsculas o minúsculas, respectivamente
La función length() regresa el número de caracteres de una cadena.
En esta clase encontrarás los apuntes del capítulo en los recursos (archivo PDF).
1) Etapa del diseño conceptual
2) Etapa del diseño lógico
3) Etapa del diseño físico
El modelo más usado en esta etapa es el de Entidad-Relación o ER.
En este modelo tendremos las entidades (donde se almacenan de manera lógica la información) y la relación entre las diversas entidades.
Los cimientos del modelo ER se le atribuyen al Dr. Peter Chen en 1976.
Una “entidad” es una parte diferenciada del mundo físico, la cual posee información que necesitamos para nuestro sistema.
Ejemplo de entidades:
Sistema comercio electrónico: artículos, clientes, pedidos, facturas.
Sistema escolar: alumnos, profesores, materias, salones.
Sistema de almacén: artículos, facturas, entradas, salidas, clientes, proveedores.
Biblioteca: libros, autores, editoriales, lectores.
Sistema contable: cuentas, movimientos, usuarios, préstamos, ingresos.
Sistema médico: Pacientes, doctores, medicinas, recetas, facturas.
Los atributos son partes de la información (o propiedades) de la entidad.
Hay propiedades que entran al modelo (nos interesan) y hay propiedades o atributos que no nos interesan.
Por ejemplo de una entidad alumno:
Matrícula
Nombre
Edad
Género
Grado
Salón
Un atributo o propiedad lo consideraremos como “llave” si es diferente para cada elementos de la entidad.
Un atributo candidatos a ser llave en una entidad “alumno” será la matrícula, puesto son diferentes para cada alumno y no se repiten.
El atributo “nombre” no es candidato, ya que suelen duplicarse, incluso nombre y apellido.
Para la entidad “paciente” será un “atributo candidato” a ser llave su número de seguridad social.
En el modelo ER, una relación entre entidades se representa por medio de un rombo.
En algunas versiones del modelo ER sólo se representa con una línea entre las entidades.
En el modelo ER, una relación entre entidades se representa por medio de un rombo.
En algunas versiones del modelo ER sólo se representa con una línea entre las entidades.
Las relaciones uno a uno (1:1) tiene una permanencia fuerte, por ejemplo, una mascota sólo tiene un dueño, y un dueño sólo tiene una mascota.
Una computadora sólo tiene un usuario, y un usuario sólo tiene una computadora.
Son raras este tipo de relaciones: por lo general una persona puede tener muchas mascotas, y un usuario puede tener más de una computadora.
Las relaciones uno a muchos (1:N) son más comunes. A un elemento de la entidad “A” tiene muchos elementos de la entidad “B”.
Por ejemplo:
Un dueño tiene muchas mascotas.
Una escuela tiene muchos alumnos.
Un jefe tiene muchos subalternos.
Un doctor tiene muchos pacientes.
Las relaciones muchos a muchos (M:N) son más complejas. A un elemento de la entidad “A” tiene muchos elementos de la entidad “B”, pero un elemento de la entidad “B” tiene muchos elementos de la entidad “A”.
Por ejemplo:
Un estudiante tiene muchas materias y una materia tiene muchos estudiantes inscritos.
Una estudiante tiene muchos salones y un salón tiene muchos alumnos.
Una entrada de almacén tiene muchos artículos y un artículo tiene muchas entradas de almacén.
Una “llave foránea” es un campo en la tabla que relaciona a la llave primaria de otra tabla.
En esta clase encontrarás los apuntes del capítulo en los recursos (archivo PDF).
1. Se transforman en tablas todos los tipos de entidades y relaciones que aparecen en el diagrama E/R.
2. Se seleccionan las llaves primarias para cada una de las tablas de nuestro esquema lógico.
3. Fusión de tablas: Se combinan aquellas tablas que
compartan su llave primaria.
4. Normalización: Se normaliza el esquema resultante
(al menos, hasta BCNF).
5. Se definen todas las restricciones de integridad que sean aplicables al esquema obtenido.
A cada uno de los atributos les asignamos un tipo de dato.
Cuando tenemos una relación 1:1 podemos seleccionar cualquiera de las llaves primarias y convertirlas en llaves foráneas de la segunda tabla.
Cuando tenemos una relación de uno a muchos, por ejemplo, un maestro tiene muchas asignaturas, pero una asignatura tiene sólo un maestro
Cuando tenemos una relación muchos a muchos (M:N) generalmente necesitamos una tabla intermedia que contiene la dupla de las llaves primarias de ambas tablas.
No se pueden duplicar estas duplas ni estar vacías.
No es necesario añadir llaves foráneas en ambas tablas principales.
Una tabla está en Primera Forma Normal si:
Todos los atributos son atómicos. Un atributo es atómico si los elementos del dominio son simples e indivisibles.
La tabla contiene una clave primaria única.
La clave primaria no contiene atributos nulos.
No debe existir variación en el número de columnas.
Los Campos que no conforman la “llave principal” deben identificarse por la llave (Dependencia Funcional).
Dependencia Funcional. Una relación está en 2FN si está en 1FN y si los atributos que no forman parte de ninguna “llave” (no primos) dependen de forma completa de la llave principal.
Es decir que no existen “dependencias parciales”.
Todos los atributos que no son “llave principal” deben depender únicamente de la llave principal.
Ningún atributo “no primo” depende transitivamente de
ninguna clave candidata.
Para obtener una relación en 3NF:
Se eliminan las dependencias transitivas problemáticas
trasladándolas a una nueva relación (tabla).
BCNF: Forma Normal de Boyce y Codd
Todo determinante es una clave candidata.
Toda relación en BCNF está en 3NF.
En esta clase encontrarás los apuntes del capítulo en los recursos (archivo PDF).
El diseño físico de la base de datos optimiza el rendimiento a la vez que asegura la integridad de los datos al evitar repeticiones innecesarias de datos.
Durante el diseño físico, se transforman las entidades en tablas, las instancias en filas y los atributos en columnas.
Cómo convertir entidades en tablas físicas
Qué atributos utilizar para las columnas de las tablas físicas
Qué columnas de las tablas deben definirse como llaves primarias
Qué índices deben definirse en las tablas
Qué vistas deben definirse en las tablas
Cómo desnormalizar las tablas (si es necesario)
Cómo resolver relaciones de muchos a muchos
Cómo convertir entidades en tablas físicas
Qué atributos utilizar para las columnas de las tablas físicas
Qué columnas de las tablas deben definirse como llaves primarias
Qué índices deben definirse en las tablas
Qué vistas deben definirse en las tablas
Cómo desnormalizar las tablas (si es necesario)
Cómo resolver relaciones de muchos a muchos
Una manera tradicional de “armar las llaves” es por medio del alias.
A cada columna le corresponde el alias de su tabla para evitar “choque de nomenclaturas”.
Tenemos que relacionar la llave primaria con las llave foránea.
Opcionalmente podemos añadir un alias a la columna.
Por medio de la cláusula JOIN podemos unir dos o más tablas por medio de campos comunes.
Los tipos de JOINS con los que contamos en SQLite son:
CROSS JOIN
INNER JOIN
OUTER JOIN
(SQLite no cuenta con RIGHT y FULL, sólo con LEFT)
A CROSS JOIN empata cada fila de la primera tabla con cada fila de la segunda tabla.
Si las tablas de entrada tienen “x” y columnas “y”, respectivamente , la tabla resultante tendrá “x * y” columnas, un producto cartesiano.
Debido a que CROSS JOIN genera resultados muy grandes. Debe tener cuidado de utilizar sólo cuando sea apropiado.
Un INNER JOIN da como resultado la combinación de valores de las columnas de dos tablas (Tabla1 y Tabla2 ) con base en la “expresión de unión”.
La consulta compara cada fila de la “Tabla 1” con cada fila de la “Tabla 2” para encontrar todos los pares de filas que satisfacen la “expresión de unión”.
OUTER JOIN es una extensión de INNER JOIN .
Aunque el SQL estándar define tres tipos de combinaciones externas : LEFT, RIGHT y FULL, SQLite sólo admite el LEFT OUTER JOIN .
OUTER JOIN tienen una condición que es idéntica a la LEFT JOIN, expresada mediante una palabra clave como ON, USING o NATURAL.
Una vez que la primera operación JOIN es calculada, una operación OUTER JOIN concatenará los registros faltantes de ambas tablas, llenando los campos faltantes con valores nulos (NULL) en caso de que sea necesario.
Por medio de dos sentencias JOIN podemos unir tablas con relación “muchos a muchos”, las cuales cuentan con una tabla intermedia.
Por lo general necesitaremos una función de agregado como “GROUP_CONCAT()” porque vamos a recibir un columna con más de un resultados.
En esta clase encontrarás los apuntes del capítulo en los recursos (archivo PDF).
Herramientas para encontrar colores armónicos
Páginas para descargar fuentes e íconos
Crear gradientes de forma sencilla por medio de dos herramientas
Herramientas para las Cajas flexibles
Herramientas para objetos SVG y Curvas Bezier Cuadráticas
Herramienta para diseños display: grid;
Con este video terminamos el curso de PHP y SQLite. Hasta pronto.
En esta clase puede encontrar los archivos del curso.
SQLite tiene actualmente muchos seguidores gracias a que cumple cabalmente con su lema: es una base de datos ligera, rápida y confiable (las tres cosas). SQLite se integra con muchos lenguajes, pero es verdaderamente potente cuando juntamos a esta base de datos con PHP, el lenguaje de servidor más utilizado en Internet en el mundo.
En este curso ya debes tener los conocimientos básicos de PHP, pues no explicaremos lo que son las variables, las estructuras condicionales o los ciclos. Es deseable que tengas conocimientos en el manejo de las bases de datos, pero no es necesario, ya que explicaremos los tres pasos fundamentales en el diseño de una base de datos: el diseño conceptual, el diseño lógico y el diseño físico, lo cual le ayudará a diseñar cualquier base de datos, independientemente de la plataforma de su elección.
Este curso está dirigido a desarrolladores web con experiencia en PHP deseosos de una base de datos ligera, potente y segura. Dentro del curso abordaremos los tres `principales temas de cualquier lenguaje SQL estándar: El lenguaje de definición de datos o "Data Definition language" (DDL) donde analizaremos la construcción de tablas y los tipos de columnas. Posteriormente revisaremos el lenguaje de manipulación de datos o Data Manipultation Language (DML) donde realizaremos un sistema de altas, bajas y cambios (ABC) o CRUD, por sus siglas en inglés, donde insertaremos, modificaremos y borraremos información de una sencilla tabla.
En la siguiente unidad estudiaremos el lenguaje de selección de datos o Data Query Language (DQL) donde veremos la enorme potencia de la sentencia SELECT y aprovecharemos para revisar las funciones de agregación.
En las siguientes secciones abordaremos temas que son generales a las bases de datos, sobre todo al diseño de las bases de datos, sin importar la plataforma: el diseño conceptual y el diseño lógico, donde obtendremos un modelo entidad-relación de la primera fase y un modelo de tablas de la segunda.
Por último implantaremos nuestros modelos en una base de datos real, lo cual lo conoceremos como "diseño físico", así como las formas normales de nuestra información. También aprenderemos a "unir" diferentes tablas por medio de la sentencia JOIN o por medio de los alias.