Tutoriel MySQL - Bases

Tutoriel MySQL - Bases

Présentation de MySQL

Insérer la description de l'image ici

Base de données relationnelle

  • Concept : Une base de données basée sur un modèle relationnel et composée de multiples tables bidimensionnelles interconnectées.
  • Caractéristiques
    • Utilisez des tableaux pour stocker les données dans un format unifié pour une maintenance facile.
    • Utilisez le langage SQL pour fonctionner, des normes unifiées et faciles à utiliser.

modèle de données

Client → SGBD → Base de données (multiple) → Table (multiple)

SQL

Syntaxe générale SQL

  • Les instructions SQL peuvent être écrites sur une seule ligne ou sur plusieurs lignes et se terminer par un point-virgule.
  • Les instructions SQL peuvent utiliser des espaces/indentations pour améliorer la lisibilité de l'instruction.
  • Les instructions SQL de la base de données MySQL ne sont pas sensibles à la casse et il est recommandé d'utiliser des lettres majuscules pour les mots-clés.
  • Commentaire
    • Commentaires sur une seule ligne : – ou #
    • Commentaires sur plusieurs lignes : /* */

Types de données SQL

Insérer la description de l'image ici

Classement SQL

DDL

langage de définition de données, utilisé pourDéfinir des objets de base de données(base de données, table, champ).

  • Renseigner

    • Interroger toutes les bases de données

      SHOW DATABASES;
      
    • Interroger la base de données actuelle

      SELECT DATABASE();
      
  • créer

    CREATE DATABASE 数据库名;
    
  • supprimer

    DROP DATABASE 数据库名;
    
  • utiliser

    USE 数据库名;
    
  • Interroger toutes les tables de la base de données actuelle

    SHOW TABLES;
    
  • Structure de la table de requête

    DESC 表名;
    
  • Interroger l'instruction de création de table de la table spécifiée

    SHOW CREATE TABLE 表名;
    
  • Créer un tableau

    CREATE TABLE TB_USER(
        ID INT COMMENT '编号',
        NAME VARCHAR(50) COMMENT '姓名',
        AGE INT COMMENT '年龄',
        GENDER VARCHAR(1) COMMENT '性别'
    ) COMMENT '用户表'; 
    
  • Modifier le tableau

    • Ajouter le champ

      ALTER TABLE 表名 ADD 字段名 类型(长度)[COMMENT 注释][约束];
      #ALTER TABLE EMP ADD NICKNAME VARCHAR(20) COMMENT '昵称';
      
    • Modifier le type de données

      ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);
      
    • Modifier les noms de champs et les types de champs

      ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度)[COMMENT 注释][约束];
      #ALTER TABLE EMP CHANGE NICKNAME USERNAME VARCHAR(30) COMMENT '昵称';
      
    • Supprimer le champ

      ALTER TABLE 表名 DROP 字段名;
      #ALTER TABLE EMP DROP USERNAME;
      
    • Modifier le nom de la table

      ALTER TABLE 表名 RENAME TO 新表名;
      #ALTER TABLE EMP RENAME TO EMPLOYEE;
      
    • Supprimer le tableau

      • Supprimer le tableau

        DROP TABLE[IF EXISTS] 表名;
        #IF EXISTS意思是存在的时候执行,否则什么也不做。
        
      • Supprimez la table spécifiée et recréez-la

        TRUNCATE TABLE 表名;
        

      Lorsqu'un tableau est supprimé, toutes les données du tableau seront également supprimées .

DML

langage de manipulation de données, utilisé pourAjouter, supprimer et modifier des données dans les tables de base de données

  • ajout de données

    • Ajouter des données au champ spécifié

       INSERT INTO 表名(字段名1,字段名2,...)VALUES(1,2,...);
      
    • Ajouter des données à tous les champs

       INSERT INTO 表名 VALUES(1,2,...);
      
    • Ajouter des données par lots

      # 指定字段
      INSERT INTO 表名(字段名1,字段名2,...)VALUES(1,2,...),(1,2,...)(1,2,...);
      # 全部字段
       INSERT INTO 表名 VALUES(1,2,...),(1,2,...)(1,2,...);
      
  • changer les données

    UPDATE 表名 SET 字段名1=1,字段名2=2,...[WHERE 条件];
    # 如果没有条件限制,则会修改整张表的所有数据。
    
    #修改id为1的数据,将name改为myname
    UPDATE EMPLOYEE SET NAME = "MYNAME" WHERE ID = 1;
    #修改id为1的数据,将name改为youname,gender改为女
    UPDATE EMPLOYEE SET NAME = "YOUNAME",GENDER="女" WHERE ID = 1;
    #将所有员工的入职日期修改为2008-01-01
    UPDATE EMPLOYEE SET ENTRYDATE = "2008-01-01";
    
  • Suprimmer les données

    DELETE FROM 表名[WHERE 条件];
    #DELETE不能删除某一个字段的值(用UPDATE)
    
    #删除gender为女的数据
    DELETE FROM EMPLOYEE WHERE GENDER="女";
    #删除所有员工
    DELETE FROM EMPOLYEE;
    

DQL

langage de requête de données, utilisé pourInterroger les enregistrements de la table dans la base de données

Le mot clé de la requête est SELECT

#DQL的编写顺序
SELECT
	字段列表
FROM
	表名列表
WHERE
	条件列表
GROUP BY
	分组字段列表
HAVING
	分组后条件列表
ORDER BY
	排序字段列表
LIMIT
	分页参数
Requête de base
  • Interroger plusieurs champs

    SELECT 字段1,字段2,字段3...FROM 表名;
    SELECT * FROM 表名;
    
  • Définir un alias

    SELECT 字段1[AS 别名1],字段2[AS 别名2]...FROM 表名;
    
  • Supprimer les enregistrements en double

    SELECT DISTINCT 字段列表 FROM 表名;
    
#从emp表中查询指定字段name,workno,age并返回
SELECT NAME,WORKNO,AGE FORM EMP;
#从emp表中查询所有字段并返回
SELECT * FROM EMP;
#从emp表中查询所有员工的工作地址,起别名
SELECT WORKADDRESS AS '工作地址' FROM EMP;
SELECT WORKADDRESS '工作地址' FROM emp;
#查询公司员工的工作地址(不能重复)
SELECT DISTINCT WORKADDRESS '工作地址' FROM EMP;
Requête conditionnelle
SELECT 字段列表 FROM 表名 WHERE 条件列表;

Insérer la description de l'image ici

#查询年龄等于88的员工
SELECT * FROM EMP WHERE AGE = 88;
#查询年龄小于20的员工信息
SELECT * FROM EMP WHERE AGE < 20;
#查询没有身份证号的员工信息
SELECT * FROM EMP WHERE IDCARD IS NULL;
#查询有身份证号的员工信息
SELECT * FROM EMP WHERE IDCARD IS NOT NULL;
#查询年龄不等于88的员工
SELECT * FROM EMP WHERE AGE != 88;
SELECT * FROM EMP WHERE AGE <> 88;
#查询年龄在15岁到20岁之间的员工信息
SELECT * FROM EMP WHERE AGE >= 15 && AGE<= 20;
SELECT * FROM EMP WHERE AGE >= 15 AND AGE<= 20;
SELECT * FROM EMP WHERE AGE BETWEEN 15 AND 20;
#查询性别为女且年龄小于25岁的员工信息
SELECT * FROM EMP WHERE GENDER = '女' AND AGE <=25;
#查询年龄等于18或20或40的员工信息
SELECT * FROM EMP WHERE AGE = 18 OR AGE = 20 OR AGE = 40;
SELECT * FROM EMP WHERE AGE IN(18,20,40);
#查询姓名为两个字的员工信息
SELECT * FROM EMP WHERE NAME LIKE '__';
#查询身份证号最后一位为x的员工信息
SELECT * FROM EMP WHERE IDCARD LIKE %X;
fonction d'agrégation

Prenez une colonne de données dans son ensemble et effectuez des calculs verticaux.

Insérer la description de l'image ici

SELECT 聚合函数(字段列表) FROM 表名
#统计该企业员工数量
SELECT COUNT(*) FROM EMP;
SELECT COUNT(ID) FROM EMP;
#统计该企业员工的平均年龄
SELECT AVG(AGE) FROM EMP;
#统计该企业员工的最大年龄
SELECT MAX(AGE) FROM EMP;
#统计该企业员工的最小年龄
SELECT MIN(AGE) FROM EMP;
#统计西安地区员工的年龄之和
SELECT SUM(AGE) FROM EMP WHERE WORKADDRESS = '西安';
Requête de groupe
SELECT 字段列表 FROM [WHERE 条件] GROUP BY 分组字段名 [HAVING 分组后过滤条件];

La différence entre où et avoir

  • Le timing d'exécution est différent : où est le filtrage avant le regroupement, si la condition Where n'est pas remplie, le regroupement ne participera pas ; et have est le filtrage des résultats après le regroupement .
  • Les conditions de jugement sont différentes : où ne peut pas juger la fonction agrégée, mais ayant le peut .
#根据性别分组,统计男性员工和女性员工的数量
SELECT GENDER,COUNT(*) FROM GROUP BY GENDER;
#根据性别进行分组,统计男性员工和女性员工的平均年龄
SELECT GENDER,AVG(AGE) FROM EMP GROUP BY GENDER;
#查询年龄小于45的员工,并根据工作地址分组,获取员工数量大于等于3的工作地址
SELECT COUNT(*) FROM EMP WHERE AGE <45 GROP BY WORKADDRESS HAVING COUNT(*) >= 3;

Ordre d'exécution : où>fonction d'agrégation>avoir

Après le regroupement, les champs de requête sont généralement des fonctions d'agrégation et des champs de regroupement, et interroger d'autres champs n'a aucune signification.

trier la requête
SELECT 字段列表 FEOM 表名 ORDER BY 字段1 排序方式1,字段2 排序方式2;

Si vous triez sur plusieurs champs, le deuxième champ sera trié uniquement si la valeur d'un champ est la même.

Trier par:

  • ASC : Ascendant (par défaut)
  • DESC : ordre décroissant
#根据年龄对公司员工进行升序排序
SELECT AGE FROM EMP ORDER BY AGE ASC;
#根据入职时间,对员工进行排序
SELECT * FROM EMP ORDER BY ENTRYDATE DESC;
#根据年龄对公司的员工进行升序排序,年龄相同,再按照入职时间进行降序排序
SELECT * FROM EMP ORDER BY AGE ASC,ENTRYDATE DESC;
Requête de pagination
SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询记录数;
  • L'index de départ commence à 0,Index de départ = (numéro de page de requête - 1) * nombre d'enregistrements affichés sur chaque page
  • La requête de pagination est un dialecte de base de données, et différentes bases de données ont des implémentations différentes. Dans MySQL, c'est LIMIT.
  • Si vous interrogez la première page de données, l'index de départ peut être omis., directement abrégé en limite 10.
#查询第1页员工数据,每页展示10条记录
SELECT * FROM EMP LIMIT 0,10;
#查询第2页员工数据,每页展示10条记录
SELECT * FROM EMP LIMIT 10,10;
Formation de cas
  1. Interrogez les informations des salariées âgées de 20, 21, 22 et 23 ans.
  2. Recherchez des employés dont le sexe est masculin, dont l'âge est compris entre 20 et 40 ans (inclus) et dont le nom est composé de trois caractères.
  3. Comptez le nombre d'employés hommes et femmes dans le tableau des employés qui ont moins de 60 ans.
  4. Recherchez les noms et âges de tous les employés âgés de moins ou égaux à 35 ans et triez les résultats de la requête par ordre croissant d'âge. Si les âges sont identiques, triez les résultats par ordre décroissant de date d'entrée.
  5. Interrogez les informations des 5 principaux employés dont le sexe est de sexe masculin et dont l'âge est compris entre 20 et 40 ans (inclus). Les résultats de la requête sont triés par ordre croissant d'âge. S'ils ont le même âge, ils sont triés par ordre croissant. de la date d'adhésion.
SELECT * FROM EMP WHERE GENDER = '女' AND AGE IN(20,21,22,23);

SELECT * FROM EMP WHERE GENDER = '男' AND (AGE BETWEEN 20 AND 40) AND NAME LIKE '___';

SELECT GENDER,COUNT(*) FROM EMP WHERE AGE < 60 GROUP BY GENDER;

SELECT NAME,AGE FROM EMP WHERE AGE <= 35 ORDER BY AGE,ENTRYDATE DESC;

SELECT * FROM EMP WHERE GENDER = '男' AND (AGE BETWEEN 20 AND 40) ORDER BY AGE,ENTRYDATE LIMIT 5;

Ordre d'exécution

Insérer la description de l'image ici

#语句顺利执行,不报错!
SELECT E.NAME,E.AGE FROM EMP E WHERE E.AGE > 15 ORDER BY AGE;

DCL

langage de contrôle des données, utilisé pourCréer un utilisateur de base de données et contrôler les autorisations d'accès à la base de données

Gestion des utilisateurs
  • Interroger l'utilisateur

    USE mysql;
    
    SELECT * FROM USER;
    
  • Créer un utilisateur

    CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
    
    #创建用户 itcast ,只能够在当前主机localhost访间,密码125456;
    CREATE USER 'ITCAST'@'LOCALHOST' IDENTIFIED BY '123456';
    #创建用户 heima ,可以在任意主机访问该数据库,密码125456;
    CREATE USER 'HEIMA'@'%' IDENTIFIED BY '123456';
    
    
    
    
  • Changer le mot de passe utilisateur

    ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码';
    
    #修改用户 heima 的访问密码1234;
    ALTER USER 'HEIMA'@'%' IDENTIFIED WITH mysql_native_password BY '1234';
    
  • supprimer des utilisateurs

    DROP USER '用户名'@'主机名';
    
    #删除itcast@localhost用户
    DROP USER 'ITCAST'@'LOCALHOST';
    
Contrôle des autorisations

Insérer la description de l'image ici

  • Autorisations de requête

    SHOW GRANTS FOR '用户名'@'主机名';
    
  • Autorisation accordée

    GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
    
  • révoquer l'autorisation

    REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
    

Utilisez des virgules pour séparer plusieurs autorisations.

Lors de l'autorisation, le nom de la base de données et le nom de la table peuvent être remplacés par un caractère générique *, qui représente tout.

fonction

Une fonction fait référence à un programme ou à un code qui peut être directement appelé par un autre programme.

Fonctions de chaîne

Insérer la description de l'image ici

SELECT CONCAT('HELLO',' mysql');
SELECT LOWER('HELLO');
SELECT UPPER('hello');
SELECT LPAD('01',5,'-');
SELECT RPAD('01',5,'-');
SELECT TRIM(' Hello Mysql ');
SELECT SUBSTR('HELLO MYSQL',1,5);

En raison de l'évolution des besoins des entreprises, les numéros d'emploi des employés de l'entreprise ont été unifiés en chiffres 5. Actuellement, tous les nombres comportant moins de chiffres 5 sont précédés de zéros. Par exemple : le numéro de poste de l'employé n°1 doit être 00001.

UPDATE EMP SET WORKNO = LPAD(WORKNO,5,'0');

Fonction numérique

Insérer la description de l'image ici

SELECT CEIL(1.5);#2
SELECT FLOOR(1.5);#1
SELECT MOD(3,4);#3
SELECT RAND();#0~1之间
SELECT ROUND(2.34,2);#2.34
SELECT ROUND(2.35,1);#2.4

Générez un code de vérification aléatoire à six chiffres grâce à la fonction de la base de données.

SELECT LPAD(ROUND(RAND()*1000000,0),6,'0');

fonction date

Insérer la description de l'image ici

SELECT CURDATE();#2023-03-29
SELECT CURTIME();#19:59:54
SELECT NOW();#2023-03-29 20:00:17
SELECT YEAR(NOW());#2023
SELECT MONTH(NOW());#3
SELECT DAY(NOW());#29
SELECT DATE_ADD(NOW(),INTERVAL 70 MONTH);#2029-01-29 20:02:47
SELECT DATEDIFF('2021-12-01','2021-10-01');#61

Recherchez le nombre de jours d'emploi de tous les employés et triez-les par ordre décroissant en fonction du nombre de jours d'emploi.

SELECT NAME,DATEDIFF(CURDATE(),ENTRYDATE) AS 'ENTRYDAYS' FROM EMP ORDER BY ENTRYDAYS DESC;

fonction de processus

Les fonctions de processus sont également un type de fonction très couramment utilisé, qui peut implémenter un filtrage conditionnel dans les instructions SQL, améliorant ainsi l'efficacité des instructions.

Insérer la description de l'image ici

SELECT IF(TRUE,'OK','ERROR');#OK
SELECT IFNULL('OK','DEFAULT');#OK
SELECT IFNULL(NULL,'DEFAULT');#DEFAULT
SELECT
	NAME, 
	(CASE WORKADDRESS WHEN '北京' THEN '一线城市' WHEN '上海' THEN '一线城市' ELSE '二线城市' END) AS '工作地址'
FROM EMP;

Les résultats de chaque élève de la classe sont comptabilisés. Les règles d'affichage sont les suivantes :

  • Supérieur ou égal à 85, excellent
  • Supérieur ou égal à 60, passant
  • Sinon, échoue
CREATE TABLE SCORE(
ID INT COMMENT 'ID',
NAME VARCHAR(20) COMMENT '姓名',
MATH INT COMMENT '数学',
ENGLISH INT COMMENT '英语',
CHINESE INT COMMENT '语文'
) COMMENT '学员成绩表';
INSERT INTO SCORE(ID,NAME,MATH,ENGLISH,CHINESE)VALUES(1,'TOM',67,88,95),(2,'ROSE',23,66,98),(3,'JACK',29,98,59);

SELECT 
	ID,
	NAME,
	(CASE WHEN MATH >= 85 THEN '优秀' WHEN MATH >= 60 THEN '及格' ELSE '不及格' END) '数学',
	(CASE WHEN ENGLISH >= 85 THEN '优秀' WHEN ENGLISH >= 60 THEN '及格' ELSE '不及格' END) '英语',
	(CASE WHEN CHINESE >= 85 THEN '优秀' WHEN CHINESE >= 60 THEN '及格' ELSE '不及格' END) '语文'
FROM SCORE;

Insérer la description de l'image ici

contrainte

Aperçu

  • Concept : Les contraintes sont des règles qui agissent sur les champs d'une table pour limiter les données stockées dans la table.

  • Objectif : Garantir l’exactitude, la validité et l’intégrité des données de la base de données.

  • Classification:

Insérer la description de l'image ici

Des contraintes agissent sur les champs du tableau et peuvent être ajoutées lors de la création/modification du tableau.

Démonstration de contraintes

Terminer la création de la structure de la table selon les exigences

Insérer la description de l'image ici

CREATE TABLE USER(
		ID INT PRIMARY KEY AUTO_INCREMENT COMMENT '主键',
		NAME VARCHAR(10) NOT NULL UNIQUE COMMENT '姓名',
		AGE INT CHECK(AGE > 0 AND AGE <= 120) COMMENT '年龄',
		STATUS CHAR(1) DEFAULT '1' COMMENT '状态',
		GENDER CHAR(1) COMMENT '性别'
	) COMMENT '用户表';
	INSERT INTO USER(NAME,AGE,STATUS,GENDER) VALUES ('TOM1',19,'1','男'),('TOM2',25,'0','男'),('TOM3',19,'1','男');
	INSERT INTO USER(NAME,AGE,STATUS,GENDER) VALUES (NULL,19,'1','男');#报错,NAME不能为空
	INSERT INTO USER(NAME,AGE,STATUS,GENDER) VALUES ('TOM3',19,'1','男');#报错,NAME唯一
	INSERT INTO USER(NAME,AGE,STATUS,GENDER) VALUES ('TOM4',80,'1','男');
	INSERT INTO USER(NAME,AGE,STATUS,GENDER) VALUES ('TOM5',-1,'1','男');#报错,年龄不能为负
	INSERT INTO USER(NAME,AGE,STATUS,GENDER) VALUES ('TOM5',121,'1','男');#报错,年龄不能超出120
	INSERT INTO USER(NAME,AGE,STATUS,GENDER) VALUES ('TOM5',120 ,'男');

contraintes de clé étrangère

Des clés étrangères sont utiliséesÉtablir une connexion entre les données des deux tables pour assurer la cohérence et l'intégrité des données

Insérer la description de l'image ici

#建立部门表并插入数据
CREATE TABLE DEPT(
		ID INT AUTO_INCREMENT COMMENT 'ID' PRIMARY KEY,
		NAME VARCHAR(50) NOT NULL COMMENT '部门名称'
	) COMMENT '部门表';
	ALTER TABLE DEPT CONVERT TO CHARACTER SET utf8;
	INSERT INTO dept (ID,NAME) VALUES (1,'研发部'),(2,'市场部'),(3,'财务部'),(4,'销售部'),(5,'总经办');
#建立员工表并插入数据
CREATE TABLE EMP(
	ID INT AUTO_INCREMENT COMMENT 'ID' PRIMARY KEY,
	NAME VARCHAR(50) NOT NULL COMMENT '姓名',
	AGE INT COMMENT '年龄',
	JOB VARCHAR(20) COMMENT '职位',
	SALARY INT COMMENT '薪资',
	ENTRYDATE DATE COMMENT '入职时间',
	MANAGERID INT COMMENT '直属领导ID',
	DEPT_ID INT COMMENT '部门ID'
	) COMMENT '员工表';
	ALTER TABLE EMP CONVERT TO CHARACTER SET utf8;
	INSERT INTO EMP(ID,NAME,AGE,JOB,SALARY,ENTRYDATE,MANAGERID,DEPT_ID) VALUES (1,'金庸',66,'总裁',20000,'2000-01-01',NULL,5),(2,'张无忌',20,'项目经理',12500,'2005-12-05',1,1),(3,'杨逍',33,'开发',8400,'2000-11-03',2,1),(4,'韦一笑',48,'开发',11000,'2002-02-05',2,1),(5,'常遇春',43,'开发',10500,'2004-09-07',3,1),(6,'小昭',19,'程序员鼓励师',6600,'2004-10-12',2,1);
	

Insérer la description de l'image ici
Insérer la description de l'image ici

Ajouter une clé étrangère

Insérer la description de l'image ici

ALTER TABLE EMP ADD CONSTRAINT FK_EMP_DEPT_ID FOREIGN KEY(DEPT_ID) REFERENCES DEPT(ID);

Supprimer la clé étrangère

Insérer la description de l'image ici

ALTER TABLE EMP DROP FOREIGN KEY FK_EMP_DEPT_ID;

Comportement de mise à jour de suppression de clé étrangère

Insérer la description de l'image ici
Insérer la description de l'image ici

ALTER TABLE EMP ADD CONSTRAINT FK_EMP_DEPT_ID FOREIGN KEY(DEPT_ID) REFERENCES DEPT(ID) ON UPDATE CASCADE ON DELETE CASCADE;

Requête multi-tables

Relation à plusieurs tables

Au cours du développement du projet, lors de la conception de la structure des tables de la base de données, la structure des tables sera analysée et conçue en fonction des besoins de l'entreprise et de la relation entre les modules métier . Étant donné que les entreprises sont interdépendantes, il existe diverses connexions entre chaque structure de table. Il existe essentiellement trois types :

  • Un-à-plusieurs (plusieurs-à-un)

    Départements et employés

    Un service correspond à plusieurs employés, et un employé correspond à un service.

    Méthode d'implémentation : Créez une clé étrangère du côté multiple, pointant vers la clé primaire de l'autre côté.

  • plusieurs à plusieurs

    étudiants et cours

    Un étudiant peut suivre plusieurs cours et un cours peut être choisi par plusieurs étudiants.

    Méthode de mise en œuvre : Créez une troisième table avec au moins deux clés étrangères au milieu, qui sont associées aux clés primaires des deux parties.

  • Un par un

    Utilisateurs et détails de l'utilisateur

    Les relations un à un sont principalement utilisées pour le fractionnement d'une seule table. Les champs de base d'une table sont placés dans une table et les autres champs détaillés sont placés dans une autre table pour améliorer l'efficacité opérationnelle .

    Méthode de mise en œuvre : chaque partie ajoute une clé étrangère, associe la clé primaire de l'autre partie et définit la clé étrangère pour qu'elle soit unique (UNIQUE).

Présentation des requêtes multi-tables

Fait référence à l'interrogation de données à partir de plusieurs tables.

Produit cartésien : Le produit cartésien fait référence à toutes les compositions de deux ensembles A et B en mathématiques. ( Lors de l'interrogation de plusieurs tables, les produits cartésiens invalides doivent être éliminés ).

SELECT * FROM EMP,DEPT WHERE EMP.DEPT_ID = DEPT.ID;

jointure interne

Cela équivaut à interroger les données d’intersection des ensembles A et B.

jointure interne implicite

Insérer la description de l'image ici

Interroger le nom de chaque employé et le nom du service associé

SELECT EMP.NAME,DEPT.NAME FROM EMP,DEPT WHERE EMP.DEPT_ID = DEPT.ID;

jointure interne explicite

Insérer la description de l'image ici

Interrogez le nom de chaque employé et le nom du service associé

SELECT E.NAME,D.NAME FROM EMP E INNER JOIN DEPT D ON E.DEPT_ID = D.ID;

jointure externe

Jointure externe gauche : interrogez toutes les données de la table de gauche et certaines données à l'intersection des deux tables.

Jointure externe droite : interrogez toutes les données de la table de droite et certaines données à l'intersection des deux tables.

jointure externe gauche

Insérer la description de l'image ici

Interrogez toutes les données de la table emp et les informations du service correspondant.

SELECT * FROM EMP E LEFT OUTER JOIN DEPT D ON E.DEPT_ID = D.ID;

jointure externe droite

Insérer la description de l'image ici

Interrogez toutes les données de la table des services et les informations du service correspondant.

SELECT * FROM EMP E RIGHT OUTER JOIN DEPT D ON E.DEPT_ID = D.ID;

auto-connexion

La requête de connexion entre la table courante et elle-même,Les auto-jointures doivent utiliser des alias de table

Insérer la description de l'image ici

Recherchez les noms des employés et de leurs managers.

SELECT E.NAME,EX.NAME FROM EMP E JOIN EMP EX ON E.MANAGERID = EX.ID;

Recherchez le nom emp de tous les employés emp et de leur leader. Si l'employé n'a pas de leader, vous devez également l'interroger .

SELECT E.NAME,EX.NAME FROM EMP E LEFT JOIN EMP EX ON E.MANAGERID = EX.ID;

Requête syndicale

Pour les requêtes UNION, plusieurs résultats de requête sont combinés pour former un nouveau résultat de requête.

Insérer la description de l'image ici

Interrogez tous les employés dont le salaire est inférieur à 5 000 et les employés de plus de 50 ans.

SELECT * FROM EMP WHERE SALARY < 5000 UNION SELECT * FROM EMP WHERE AGE > 50;
  • Pour les requêtes conjointes, le nombre de colonnes dans plusieurs tables doit être cohérent, tout comme les types de champs .
  • UNION ALL fusionnera directement toutes les données ensemble et UNION dédupliquera les données fusionnées .

sous-requête

L'imbrication d'une instruction SELECT dans une instruction SQL est appelée requête imbriquée, également appelée sous-requête.

Insérer la description de l'image ici

L'instruction en dehors de la sous-requête peut être INSERT/UPDAE/DELETE/SELECT

Selon la position de la sous-requête, elle est divisée en : après WHERE, après FROM et après SELECT.

sous-requête scalaire

Le résultat de la sous-requête est une valeur unique (nombre, chaîne, date, etc.), la forme la plus simple

Opérations courantes := <> > >= < <=

#查询销售部的所有员工信息
SELECT * FROM WHERE DEPT_ID =(SELECT ID FROM DEPT WHERE NAME = '销售部');
#查询在方东白入职之后的员工信息
SELECT * FROM WHERE ENTRYDATE > (SELECT ENTRYDATE FROM EMP WHERE NAME = '方东白');

sous-requête de colonne

Le résultat de la sous-requête est une colonne

Opérations courantes : IN, NOT IN, ANY, SOME, ALL

Insérer la description de l'image ici

#查询销售部和市场部的所有员工信息
SELECT * FROM EMP WHERE DEPT_ID IN (SELECT ID FROM DEPT WHERE NAME ='销售部' OR NAME = '市场部');
#查询比财务部所有人工资高的员工信息
SELECT * FROM EMP WHERE SALARY > ALL(SELECT SALARY FROM EMP WHERE DEPT_ID = (SELECT ID FORM DEPT WHERE NAME = '财务部'));
#查询比研发部其中任意一人工资高的员工信息
SELECT * FROM EMP WHERE SALARY > ANY(SELECT SALARY FROM EMP WHERE DEPT_ID = (SELECT ID FROM DEPT WHERE NAME = '研发部'));

sous-requête de ligne

Le résultat de la sous-requête est une ligne

Opérations courantes : =, <>, IN, NOT IN

#查询与张无忌的薪资及指数领导相同的员工信息
SELECT * FROM EMP WHERE (SALARY,MANAGERID) = (SELECT SALARY,MANAGERID FROM EMP WHERE NAME = '张无忌') ;

Sous-requête de table

Le résultat de la sous-requête est constitué de plusieurs lignes et plusieurs colonnes

Opérations courantes : DANS

#查询与'鹿杖客','宋起桥'的职位和薪资相同的员工信息
SELECT * FROM EMP WHERE (JOB,SALARY) IN (SELECT JOB,SALARY FROM EMP WHERE NAME = '鹿杖客' OR NAME = '宋起桥');
#查询入职日期是'2006-01-01'之后的员工信息,及其部门信息
SELECT E.*,D.* FROM (SELECT * FROM EMP WHERE ENTRYDATE > '2006-01-01') E LEFT JOIN DEPT D ON E.DEPT_ID = D.ID;

Cas de requête multi-tables

  1. Recherchez le nom, l'âge, le poste et les informations sur le service de l'employé.
  2. Recherchez le nom, l'âge, le poste et les informations sur le service des employés de moins de 30 ans.
  3. Recherchez l'ID du service et le nom du service qui compte des employés.
  4. Recherchez tous les employés de plus de 40 ans et le nom du service auquel ils appartiennent ; si l'employé n'est pas affecté à un service, celui-ci doit également être affiché.
  5. Recherchez le niveau de salaire de tous les employés.
  6. Recherchez les informations et les niveaux de salaire de tous les employés du « Département R&D ».
  7. Vérifiez le salaire moyen des employés du « Département R&D ».
  8. Recherchez des informations sur les employés dont le salaire est supérieur à « extinction ».
  9. Recherchez des informations sur les employés dont les salaires sont supérieurs à la moyenne.
  10. Recherchez des informations sur les employés dont les salaires sont inférieurs au salaire moyen du département.
  11. Recherchez toutes les informations du département et comptez le nombre d’employés du département.
  12. Recherchez le statut de sélection de cours de tous les étudiants et affichez le nom de l'étudiant, son identifiant et le nom du cours.
#新建工资表
CREATE TABLE SALGRADE(
	GRADE INT,
	LOSAL INT,
	HISAL INT
) COMMENT '薪资等级';

INSERT INTO SALGRADE VALUES(1,0,3000);
INSERT INTO SALGRADE VALUES(2,3001,5000);
INSERT INTO SALGRADE VALUES(3,5001,8000);
INSERT INTO SALGRADE VALUES(4,8001,10000);
INSERT INTO SALGRADE VALUES(5,10001,15000);
INSERT INTO SALGRADE VALUES(6,15001,20000);
INSERT INTO SALGRADE VALUES(7,20001,25000);
INSERT INTO SALGRADE VALUES(8,25001,30000);
#例题代码
SELECT E.NAME,E.AGE,E.JOB,D.NAME FROM EMP E, DEPT D WHERE E.DEPT_ID = D.ID;

SELECT E.NAME,E.AGE,E.JOB,D.NAME FROM EMP E INNER JOIN DEPT D ON E.DEPT_ID = D.ID WHERE E.AGE < 30;

SELECT DISTINCT D.ID,D.NAME FROM DEPT D,EMP E WHERE D.ID = E.DEPT_ID; 

SELECT E.*,D.NAME FROM EMP E LEFT JOIN DEPT D ON E.DEPT_ID = D.ID WHERE AGE > 40 ;

SELECT E.NAME,S.GRADE FROM EMP E,SALGRADE S WHERE E.SALARY >= S.LOSAL AND E.SALARY <= S.HISAL;
SELECT E.NAME,S.GRADE FROM EMP E,SALGRADE S WHERE E.SALARY BETWEEN S.LOSAL AND S.HISAL;

SELECT E.*,S.GRADE FROM EMP E,SALGRADE S WHERE E.SALARY BETWEEN S.LOSAL AND S.HISAL AND E.DEPT_ID = (SELECT ID FROM DEPT WHERE DEPT.NAME = '研发部');

SELECT AVG(E.SALARY) FROM EMP E,DEPT D WHERE E.DEPT_ID = D.ID AND D.NAME = '研发部';

SELECT * FROM EMP WHERE SALARY > (SELECT SALARY FROM EMP WHERE NAME = '灭绝');

SELECT * FROM EMP E WHERE SALARY > (SELECT AVG(E.SALARY) FROM EMP E);

SELECT *,(SELECT AVG(E1.SALARY) FROM EMP E1 WHERE E1.DEPT_ID = E2.DEPT_ID) '平均薪资' FROM EMP E2 WHERE E2.SALARY < (SELECT AVG(E1.SALARY) FROM EMP E1 WHERE E1.DEPT_ID = E2.DEPT_ID);

SELECT ID,NAME,(SELECT COUNT(*) FROM EMP E WHERE E.DEPT_ID = D.ID) '人数' FROM DEPT D;

SELECT S.NAME,S.NO,C.NAME FROM STUDENT S,STUDENT_COURSE SC,COURSE C WHERE S.ID = SC.STUDENTID AND SC.COURSEID = C.ID;

affaires

Présentation de la transaction

Une transaction est un ensemble d'opérations, qui constitue une unité de travail indivisible, réunion d'affairesSoumettre ou révoquer des demandes d'opération au système dans son ensemble pour toutes les opérations, c'est-à-dire que ces opérations réussissent ou échouent en même temps .

Par défaut, les transactions MySQL sont automatiquement validées, ce qui signifie que lorsqu'une instruction DML est exécutée, MySQL validera immédiatement et implicitement la transaction.

Opérations transactionnelles

Exemple : virement bancaire

#查询张三账户余额
SELECT * FROM ACCOUNT WHERE NAME = '张三';
#将张三用户余额-1000
UPDATE ACCOUNT SET MONEY = MONEY - 1000 WHERE NAME = '张三';
#将李四账户余额+1000
UPDATE ACCOUNT SET MONEY = MONEY + 1000 WHERE NAME = '李四';

Si une exception se produit après que le solde utilisateur de Zhang San soit de -1000, alors toutes les données du programme seront confuses. Pour cette raison, nous devons introduire des opérations de transaction !

#查看/设置事务提交方式
SELECT @@AUTOCOMMIT;
SET @@AUTOCOMMIT = 0;#将提交方式设置为手动提交
#提交事务
COMMIT

La méthode de soumission doit être définie sur soumission manuelle pour éviter toute confusion des données !Sans l'instruction COMMIT, les données ne seront pas modifiées dans la base de données

première méthode

SET @@AUTOCOMMIT = 0;#设置为手动提交
SELECT * FROM ACCOUNT WHERE NAME = '张三';
UPDATE ACCOUNT SET MONEY = MONEY - 1000 WHERE NAME = '张三';
UPDATE ACCOUNT SET MONEY = MONEY + 1000 WHERE NAME = '李四';
COMMIT;#提交事务
ROLLBACK#回滚事务,当中间出现异常时,将数据库状态回滚到初试值

Méthode 2

#开启事务
START TRANSACTION;#还可以为BEGIN
#业务操作
SELECT * FROM ACCOUNT WHERE NAME = '张三';
UPDATE ACCOUNT SET MONEY = MONEY - 1000 WHERE NAME = '张三';
UPDATE ACCOUNT SET MONEY = MONEY + 1000 WHERE NAME = '李四';
#提交事务
COMMIT;
#回滚事务
ROLLBACK;

Quatre caractéristiques des transactions

  • Atomicité :Une transaction est une plus petite unité d’opération indivisible, soit toutes réussissent, soit toutes échouent.
  • Cohérence:Une fois la transaction terminée, toutes les données doivent être dans un état cohérent
  • Isolement:Le mécanisme d'isolation fourni par le système de base de données garantit que les transactions s'exécutent dans un environnement indépendant qui n'est pas affecté par les opérations simultanées externes.
  • Durabilité:Une fois qu'une transaction est validée ou annulée, les modifications apportées aux données dans la base de données sont permanentes.

Problèmes de transactions simultanées

Insérer la description de l'image ici

niveau d'isolement des transactions

Insérer la description de l'image ici

Lecture non validée Lecture non validée

Lire engagé Lire engagé

Lecture répétable Lecture répétable

Sérialisation sérialisable

La sécurité est améliorée en conséquence et les performances de concurrence sont réduites en conséquence !

#查看事务隔离级别
SELECT @@TRANSACTION_ISOLATION;
#设置事务隔离级别
SET[SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL {
   
   READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE}
```sql

NAME = '张三';
UPDATE ACCOUNT SET MONEY = MONEY + 1000 WHERE NAME = '李四';
COMMIT;#提交事务
ROLLBACK#回滚事务,当中间出现异常时,将数据库状态回滚到初试值

Méthode 2

#开启事务
START TRANSACTION;#还可以为BEGIN
#业务操作
SELECT * FROM ACCOUNT WHERE NAME = '张三';
UPDATE ACCOUNT SET MONEY = MONEY - 1000 WHERE NAME = '张三';
UPDATE ACCOUNT SET MONEY = MONEY + 1000 WHERE NAME = '李四';
#提交事务
COMMIT;
#回滚事务
ROLLBACK;

Je suppose que tu aimes

Origine blog.csdn.net/pipihan21/article/details/129945575
conseillé
Classement