prefacio
那么这里博主先安利一些干货满满的专栏了!
首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。
高质量博客汇总https://blog.csdn.net/yu_cblog/category_12379430.html?spm=1001.2014.3001.5482
contenido de diseño
Diseñe una base de datos simple para una empresa de juegos. Los requisitos son los siguientes: los jugadores pueden iniciar sesión en una variedad de juegos operados por la empresa, iniciar sesión en el juego para jugar o recargar el juego. El juego a menudo lanzará algunas actividades y los jugadores pueden participar en ciertas actividades.
ilustrar:
- Los tipos de juegos incluyen: gratuitos y no gratuitos. Pagar para jugar juegos no gratuitos
- Un jugador no puede participar, o participar en hasta 10 actividades
- Un evento puede tener cualquier número de jugadores participando
Diseño Conceptual (Diagrama ER)
Requisitos del tema:
Dibuje un diagrama de modelo ER completo.
Indicar la base de mapeo (One to one, One to many, Many to many), el tipo de participación (parcial y total), y la clave primaria. El resultado se muestra en la figura 1. Donde el guión bajo representa la clave principal de la tabla.
esquema relacional
Requisitos del tema: convertir el diagrama ER en un esquema relacional y marcar la clave principal.
Como se muestra, el esquema de relación se muestra en la Fig.2.
La clave principal de todas las tablas está subrayada.
codigo SQL
Restricciones relacionadas con la creación de tablas Sentencias SQL y esquemas relacionales
Crear una tabla de entidades de juego
CREATE TABLE Games ( GameID Counter PRIMARY KEY, GameName varchar(255) NOT NULL, Cost money default 0, GameType varchar(10) default 免费 NOT NULL );
restricciones relacionadas
GameID: ID del juego (contador)
GameName: nombre del juego (una cadena con una longitud máxima de 255)
Costo: costo del juego (el valor predeterminado es 0 tipo de moneda)
GameType: tipo de juego (el valor predeterminado es "gratis", una cadena de longitud 10, bajo la restricción no nula, y la restricción es que el valor solo puede ser uno de "pagado" o "gratis")
Establezca la GamesRule
restricción con nombre de la mesa de juego, el tipo de juego de restricción solo puede ser 'gratis' o 'pagado'
ALTER TABLE Games ADD CONSTRAINT GamesRule CHECK (GameType IN ('Gratis', 'Pagado'));
Crear tabla de actividades
CREAR TABLA Actividades ( Contador de ID de actividad CLAVE PRINCIPAL, Nombre de actividad varchar (255) NO NULL );
restricciones relacionadas
ActivityID: ID de actividad (contador)
ActivityName: nombre de la actividad (una cadena con una longitud máxima de 255, sujeta a una restricción no nula)
Crear tabla de entidad de jugador
CREATE TABLE Players ( PlayerID Counter PRIMARY KEY, PlayerName varchar(255) NOT NULL, PlayerPass varchar(255) NOT NULL );
restricciones relacionadas
PlayerID: ID del jugador (contador)
PlayerName: nombre del jugador (una cadena con una longitud máxima de 255, sujeta a la restricción no nula)
PlayerPass: contraseña del jugador (una cadena con una longitud máxima de 255, sujeta a la restricción no nula)
Crear una tabla de relaciones de juego de jugadores (tabla de inicio de sesión)
CREAR TABLA Iniciar sesión ( PlayerID INT, GameID INT, ParticipateActivity BIT DEFAULT 0, Balance MONEY NOT NULL DEFAULT 0, LoginTime DATETIME DEFAULT GETDATE(), FOREIGN KEY (PlayerID) REFERENCES Players(PlayerID), FOREIGN KEY (GameID) REFERENCES Games(GameID) );
restricciones relacionadas
PlayerID: ID del jugador (entero)
GameID: ID del juego (entero)
ParticipateActivity: si participar en la actividad (el valor predeterminado es el tipo de datos de 0 bits)
Saldo de dinero: saldo (bajo la restricción no vacía, el valor predeterminado es 0 tipo de moneda)
LoginTime: última hora de inicio de sesión (tipo DATETIME)
Restricciones de clave externa: la clave externa de PlayerID se refiere a Players (PlayerID), la clave externa de GameID se refiere a Games (GameID)
Crear una tabla de relación de actividad de juego
CREATE TABLE GameActivities ( GameID int, ActivityID int, FOREIGN KEY (GameID) REFERENCES Games(GameID), FOREIGN KEY (ActivityID) REFERENCES Activities(ActivityID) );
restricciones relacionadas
GameID: ID del juego (entero)
ActivityID: ID de actividad (entero)
Restricción de clave externa: la clave externa GameID se refiere a Juegos (GameID), la clave externa de ActivityID se refiere a Actividades (ActivityID)
Crear una tabla de relación de actividad de jugador
CREATE TABLE PlayerActivities ( PlayerID int, ActivityID int, FOREIGN KEY (PlayerID) REFERENCES Players(PlayerID), FOREIGN KEY (ActivityID) REFERENCES Activities(ActivityID) );
restricciones relacionadas
PlayerID: ID del jugador (entero)
ActivityID: ID de actividad (entero)
Restricción de clave externa: la clave externa PlayerID se refiere a los jugadores (PlayerID), la clave externa de ActivityID se refiere a las actividades (ActivityID)
crear disparador
Cree un activador para verificar si la cantidad de eventos en los que ha participado el jugador ha alcanzado el límite de 10
CREAR DISPARADOR LimitPlayerActivities ANTES DE INSERTAR EN Iniciar sesión PARA CADA FILA COMENZAR DECLARAR total_activities INT; -- 计算 SELECCIONE COUNT(*) INTO total_activities FROM Iniciar sesión WHERE PlayerID = NEW.PlayerID; IF total_activities >= 10 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Un jugador puede participar en un máximo de 10 actividades.'; TERMINARA SI; FIN;
Preguntar
Encuentre la declaración sql de todos los jugadores que participaron en todas las actividades lanzadas por el juego A
SELECCIONE DISTINTOS Players.PlayerID, Players.PlayerName FROM Players INNER JOIN Iniciar sesión ON Players.PlayerID = Login.PlayerID INNER JOIN GameActivities ON Login.GameID = GameActivities.GameID INNER JOIN Actividades ON GameActivities.ActivityID = Activities.ActivityID INNER JOIN Juegos ON GameActivities. GameID = Juegos.GameID WHERE Juegos.GameName = 'A';
Descubra la declaración sql del juego que lanzó más de 3 veces de actividades
SELECCIONE G.GameID, G.GameName, COUNT(GA.ActivityID) COMO ActivityCount DESDE Juegos G ÚNASE GameActivities GA EN G.GameID = GA.GameID GRUPO POR G.GameID, G.GameName CON COUNT(GA.ActivityID) > 3;
Álgebra relacional para encontrar todas las identificaciones de jugadores que recargan el juego A más alto que cierto jugador
La fórmula de este álgebra relacional describe una serie de operaciones, y el significado y propósito de cada paso es el siguiente:
-
Login ⨝ Players
Este paso utiliza el operador ⨝, que representa una operación de conexión, conectando las relaciones "Iniciar sesión" y "Jugadores". Una operación de combinación combina tuplas que satisfacen la condición de combinación en función de las propiedades comunes entre dos relaciones. El propósito de este paso es conectar los datos en la relación entre "Iniciar sesión" y "Jugadores" para operaciones posteriores. -
ρ PlayerID/PlayerID (Login ⨝ Players)
Este paso utiliza el operador ρ, que cambia el nombre de la relación. En esta fórmula, cambiamos el nombre del resultado de "Iniciar sesión ⨝ Jugadores" a "PlayerID", es decir, cambiamos el nombre del campo PlayerID en el resultado a PlayerID. El propósito de este paso es expresar mejor el siguiente paso. -
σ GameName='A' ⨝ Balance > Amount
Este paso utiliza el operador σ, y su función es realizar una operación de selección sobre la relación, es decir, filtrar tuplas calificadas según las condiciones dadas. En esta fórmula, seleccionamos la tupla con GameName 'A' y Balance mayor que Amount. El propósito de este paso es filtrar los datos que cumplen los requisitos según condiciones específicas. -
π PlayerID
Este paso utiliza el operador π y su función es realizar una operación de proyección sobre la relación, es decir, solo se conserva la columna de atributo especificada. En esta fórmula, solo mantenemos la columna de atributos PlayerID, mientras que otras columnas de atributos están excluidas. El propósito de este paso es mantener solo el atributo PlayerID de los resultados filtrados en el paso anterior, para obtener el resultado final.
En resumen, el significado de la fórmula del álgebra relacional es: conecte (⨝) todas las tuplas coincidentes de las relaciones "Iniciar sesión" y "Jugadores", y luego seleccione (σ) GameName es 'A' y Balance es mayor que Amount según la condición, y finalmente mantener solo la columna de atributo (π) PlayerID. El objetivo de esta operación es encontrar todos los ID de jugadores cuya recarga sea superior a la de un determinado jugador.
Diseñe varios procedimientos y funciones prácticos de SQL
Cuente la cantidad de personas que inician sesión (juegan juegos pagos) para un juego determinado (función)
CREAR PROCEDIMIENTO GetLoginCountByGameName(IN gameName VARCHAR(255), OUT loginCount INT) COMENZAR SELECCIONAR COUNT(DISTINCT PlayerID) INTO loginCount DESDE Iniciar sesión INNER JOIN Juegos ON Login.GameID = Games.GameID WHERE Games.GameName = gameName; FIN; -- 调用 CALL GetLoginCountByGameName('A', @loginCount); SELECCIONE @loginCount;
Cuente la cantidad total pagada por todos los jugadores en el día para un juego determinado (proceso)
En primer lugar, necesitamos crear un procedimiento almacenado. El parámetro de entrada del procedimiento almacenado es 1 que representa el nombre del juego, y el resultado de salida es 1 que representa la cantidad total, y la función de agregación SUM se usará para calcular la cantidad total. Necesitamos combinar la tabla de juego del jugador y la tabla de juego Hacer una conexión interna, la condición de conexión interna es que las ID del juego sean iguales y agregar una where
cláusula, para que podamos obtener todos los registros de los jugadores y sus costos de juego correspondientes que han jugado el juego especificado por los parámetros de entrada.En este momento, la suma de los costos es el final.Se obtiene el resultado total, podemos seleccionar para generar el resultado total. Finalmente, probamos llamando al procedimiento almacenado CalculateTotalPaymentsByGameName
y encontramos que se obtuvo el valor correcto. El código SQL es el siguiente.
CREAR PROCEDIMIENTO CalculateTotalPaymentsByGameName(IN gameName VARCHAR(255), OUT totalPayments DECIMAL(10, 2)) BEGIN SELECT SUM(Games.Cost) INTO totalPayments FROM Games INNER JOIN Iniciar sesión ON Login.GameID = Games.GameID WHERE Games.GameName = gameName; FIN; CALL CalculateTotalPaymentsByGameName('A', @totalPayments); SELECCIONE @pagostotales;
Diseñe un activador SQL práctico
Al eliminar un jugador, se eliminará junto con la información relacionada con el jugador (todos los juegos y actividades)
DELIMITADOR // CREAR DISPARADOR trg_DeletePlayer ANTES DE ELIMINAR EN Jugadores PARA CADA FILA COMENZAR -- eliminar el registro de inicio de sesión relacionado con el jugador ELIMINAR DESDE Iniciar sesión WHERE PlayerID = OLD.PlayerID; -- eliminar el registro de PlayerActivities relacionado con el jugador ELIMINAR DE PlayerActivities WHERE PlayerID = OLD.IDJugador; FIN // DELIMITADOR;