• 【MySQL】外连接(左外连和右外连)和主键,mysql约束


    1.外连接

    1. 左外连接,(如果左侧的表完全显示我们就说是左外连接)
    2. 右外连接,(如果右侧的表完全显示我们就说是右外连接)
    1. 使用左连接
      – (显示所有人的成绩,如果没有成绩,也要显示该人的姓名和id号,成绩显示为空)SELECT name, stu.id, grade
      FROM stu LEFT JOIN exam
      ON stu.id = exam.id;
    2. – 使用右外连接(显示所有成绩,如果没有名字匹配,显示空)
      – 即:右边的表(exam) 和左表没有匹配的记录,也会把右表的记录显示出来
      SELECT name, stu.id, grade
      FROM stu RIGHT JOIN exam
      ON stu.id = exam.id;
    -- 外连接
    
    -- 比如:列出部门名称和这些部门的员工名称和工作,
    -- 同时要求 显示出那些没有员工的部门。
    
    -- 使用我们学习过的多表查询的SQL, 看看效果如何?
    
    SELECT dname, ename, job 
    	FROM emp, dept
    	WHERE emp.deptno = dept.deptno
    	ORDER BY dname
    SELECT * FROM dept;
    
    SELECT * FROM emp;
    
    CREATE TABLE stu (
    	id INT,
    	`name` VARCHAR(32));
    INSERT INTO stu VALUES(1, 'jack'),(2,'tom'),(3, 'kity'),(4, 'nono');
    SELECT * FROM stu;
    
    CREATE TABLE exam(
    	id INT,
    	grade INT);
    INSERT INTO exam VALUES(1, 56),(2,76),(11, 8);
    SELECT * FROM exam;
    
    -- 使用左连接
    -- (显示所有人的成绩,如果没有成绩,也要显示该人的姓名和id号,成绩显示为空)
    
    SELECT `name`, stu.id, grade
    	FROM stu, exam
    	WHERE stu.id = exam.id;
    	
    -- 改成左外连接
    SELECT `name`, stu.id, grade
    	FROM stu LEFT JOIN exam
    	ON stu.id = exam.id;
    	
    	
    -- 使用右外连接(显示所有成绩,如果没有名字匹配,显示空)
    -- 即:右边的表(exam) 和左表没有匹配的记录,也会把右表的记录显示出来
    SELECT `name`, stu.id, grade
    	FROM stu RIGHT JOIN exam
    	ON stu.id = exam.id;
    
    -- 列出部门名称和这些部门的员工信息(名字和工作),
    -- 同时列出那些没有员工的部门名。5min
    -- 使用左外连接实现
    SELECT dname, ename, job
    	FROM dept LEFT JOIN emp
    	ON dept.deptno = emp.deptno
    	
    -- 使用右外连接实现
    
    SELECT dname, ename, job
    	FROM emp RIGHT JOIN dept
    	ON dept.deptno = emp.deptno
    	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    在这里插入图片描述
    在这里插入图片描述

    2.主键

    mysql约束

    基本介绍 约束用于确保数据库数据满足特定的商业规则。 在mysql中,约束包括: not null、unique, primary key,foreign key,和check 五种.

    not null(非空)

    如果在列上定义了not null,那么当插入数据时,必须为列提供数据。
    字段名 字段类型 not null

    . primary key(主键)-细节说明

    1. primary key不能重复而且不能为null。
      INSERT INTO t17
      VALUES(NULL, ‘demo’, ‘demo@sohu.com’);ERROR
    2. 一张表最多只能有一个主键,但可以是复合主键
    3. 主键的指定方式有两种: 1.直接在字段名后指定;2.字段名 primakry key 在表定义最后写 primary key(列名);
    4. 使用desc 表名,可以看到primary key的情况。

    复合主键
    – 演示复合主键 (id 和 name 做成复合主键)
    CREATE TABLE t18
    (id INT ,
    name VARCHAR(32),
    email VARCHAR(32),
    PRIMARY KEY (id, name) – 这里就是复合主键
    );
    当id和name都相同是才违反复合主键规则

    -- 主键使用
    
    -- id	name 	email
    CREATE TABLE t17
    	(id INT PRIMARY KEY, -- 表示id列是主键 
    	`name` VARCHAR(32),
    	email VARCHAR(32));
    	
    -- 主键列的值是不可以重复
    INSERT INTO t17
    	VALUES(1, 'jack', 'jack@sohu.com');
    INSERT INTO t17
    	VALUES(2, 'tom', 'tom@sohu.com');
    
    INSERT INTO t17
    	VALUES(1, 'demo', 'demo@sohu.com');
    	
    SELECT * FROM t17;
    
    -- 主键使用的细节讨论
    -- primary key不能重复而且不能为 null。
    INSERT INTO t17
    	VALUES(NULL, 'hsp', 'hsp@sohu.com');
    -- 一张表最多只能有一个主键, 但可以是复合主键(比如 id+name)
    CREATE TABLE t18
    	(id INT PRIMARY KEY, -- 表示id列是主键 
    	`name` VARCHAR(32), PRIMARY KEY -- 错误的
    	email VARCHAR(32));
    -- 演示复合主键 (id 和 name 做成复合主键)
    CREATE TABLE t18
    	(id INT , 
    	`name` VARCHAR(32), 
    	email VARCHAR(32),
    	PRIMARY KEY (id, `name`) -- 这里就是复合主键
    	);
    
    INSERT INTO t18
    	VALUES(1, 'tom', 'tom@sohu.com');
    INSERT INTO t18
    	VALUES(1, 'jack', 'jack@sohu.com');
    INSERT INTO t18
    	VALUES(1, 'tom', 'xx@sohu.com'); -- 这里就违反了复合主键
    SELECT * FROM t18;
    
    -- 主键的指定方式 有两种 
    -- 1. 直接在字段名后指定:字段名  primakry key
    -- 2. 在表定义最后写 primary key(列名); 
    CREATE TABLE t19
    	(id INT , 
    	`name` VARCHAR(32) PRIMARY KEY, 
    	email VARCHAR(32)
    	);
    
    CREATE TABLE t20
    	(id INT , 
    	`name` VARCHAR(32) , 
    	email VARCHAR(32),
    	PRIMARY KEY(`name`) -- 在表定义最后写 primary key(列名)
    	);
     
    -- 使用desc 表名,可以看到primary key的情况
    
    DESC t20 -- 查看 t20表的结果,显示约束的情况
    DESC t18
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65

    在这里插入图片描述

    3.unique(唯一)

    当定义了唯一约束后,该列值是不能重复的。
    字段名 字段类型 unique

    unique细节

    1. 如果没有指定not null,则unique字段可以有多个null
    2. 一张表可以有多个unique字段

    – 如果一个列(字段), 是 unique not null 使用效果类似 primary key

    -- unique的使用
    
    CREATE TABLE t21
    	(id INT UNIQUE ,  -- 表示 id 列是不可以重复的.
    	`name` VARCHAR(32) , 
    	email VARCHAR(32)
    	);
    	
    INSERT INTO t21
    	VALUES(1, 'jack', 'jack@sohu.com');
    
    INSERT INTO t21
    	VALUES(1, 'tom', 'tom@sohu.com');
    	
    -- unqiue使用细节
    -- 1. 如果没有指定 not null , 则 unique 字段可以有多个null
    -- 如果一个列(字段), 是 unique not null 使用效果类似 primary key
    INSERT INTO t21
    	VALUES(NULL, 'tom', 'tom@sohu.com');
    SELECT * FROM t21;
    -- 2. 一张表可以有多个unique字段
    
    CREATE TABLE t22
    	(id INT UNIQUE ,  -- 表示 id 列是不可以重复的.
    	`name` VARCHAR(32) UNIQUE , -- 表示name不可以重复 
    	email VARCHAR(32)
    	);
    DESC t22
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    在这里插入图片描述

  • 相关阅读:
    HTML批量文件上传方案——图像预览方式
    服务器可以充当负载均衡器
    ubuntu2204 root用户登录、硬盘挂载等新机器操作参考
    Python Interview Question Summary part 1
    【C++类和对象】探索static成员、友元以及内部类
    漏洞复现--奇安信360天擎未授权访问
    Kafka部署安装及简单使用
    Tomca架构细节
    (PC+WAP)织梦模板茶几茶盘类网站
    【Vue五分钟】五分钟了解--Vue过渡
  • 原文地址:https://blog.csdn.net/qq_59708493/article/details/126504980