【JavaWeb】MySQL约束、事务、多表查询

1 约束

|-----------------|-------|
| PRIMARY KEY | 主键约束 |
| UNIQUE | 唯一约束 |
| NOT NULL | 非空约束 |
| DEFAULT | 默认值约束 |
| FOREIGN KEY | 外键约束 |

主键

主键值必须唯一且非空;每个表必须有一个主键

建表时主键约束

sql 复制代码
CREATE TABLE 表名 (
	字段名 字段类型 PRIMARY KEY,
	字段名 字段类型
);

CREATE TABLE 表名(
   列名 数据类型,
   [CONSTRAINT] [约束名称] PRIMARY KEY(列名)
); 

建表后单独添加主键

sql 复制代码
ALTER TABLE 表名 ADD PRIMARY KEY (字段名);

删除主键约束

sql 复制代码
ALTER TABLE 表名 DROP PRIMARY KEY;

主键自增

在每次插入新数据时,数据库自动生成主键字段的值(字段类型必须是数值类型)

建表时:

sql 复制代码
CREATE TABLE 表名 (
	字段名 字段类型 PRIMARY KEY AUTO_INCREMENT,
	字段名 字段类型
);

自增字段在省略字段名插入时,可以给个表中没有的主键数值,也可以用null做占位符,如果没有占位,直接省略不写会报错

修改自动增长的开始值

sql 复制代码
ALTER TABLE 表名 AUTO_INCREMENT = 要修改的数值;

唯一约束

唯一约束作用:让字段值唯一,不能重复

sql 复制代码
CREATE TABLE 表名 (
	字段名 字段类型 UNIQUE,
	字段名 字段类型
);

非空约束作用:让字段值不能为null

sql 复制代码
CREATE TABLE 表名 (
	字段名 字段类型 NOT NULL,
	字段名 字段类型
);

默认值约束作用:如果这个字段不设置值,用默认值

sql 复制代码
CREATE TABLE 表名 (
	字段名 字段类型 DEFAULT 值,
	字段名 字段类型
);

主键时唯一且非空,约束也可以唯一且非空区别:主键一个表只有一个,约束可以约束多个键

外键

外键:一个表中的引用其它表中的主键的字段

sql 复制代码
CREATE TABLE 表名 (
    字段名 字段类型,
    字段名 字段类型,
    -- 添加外键约束
    CONSTRAINT 外键约束名 FOREIGN KEY(外键字段名) REFERENCES 主表(主键字段名)
);
  • CONSTRAINT: 表示约束外键约束名,给外键约束取个名字,将来通过约束名可以删除这个约束
  • FOREIGN KEY(外键字段名): 指定某个字段作为外键
  • REFERENCES 主表(主键字段名) : 引用主表的主键的值

在存在的表添加外键约束([]内可以省略不写)

sql 复制代码
ALTER TABLE 从表 ADD [CONSTRAINT 外键约束名称] FOREIGN KEY(外键字段名) REFERENCES 主表(主键字段名);

删除外键约束

sql 复制代码
ALTER TABLE 表名 DROP FOREIGN KEY 外键约束名;

2 事务

sql 复制代码
-- 开启事务
START TRANSACTION; 或者  BEGIN;
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;

事务特性

|------------------|--------------------------------------------------------|
| 原子性(Atomicity) | 事务是不可分割的最小操作单位,要么同时成功,要么同时失败。 |
| 一致性(Consistency) | 事务前后数据的完整性必须保持一致。 |
| 隔离性(Isolation) | 是指多个事务并发访问数据库时,一个事务不能被其它的事务所干扰,多个并发事务之间数据要相互隔离,不能相互影响。 |
| 持久性(Durability) | 事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。 |

默认事务是自动提交的

sql 复制代码
 -- 查看MySQL是否开启自动提交事务
SELECT @@autocommit;

-- 关闭自动提交事务
set autocommit = 0;

3 多表查询

内连接:不显示不满足条件的数据

隐式内连接

sql 复制代码
SELECT 字段列表 FROM 表1 [别名],表2 [别名]... WHERE 条件;

显示内连接(INNER JOIN ... ON)

sql 复制代码
SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 条件;
sql 复制代码
select * from 表1 inner join 表2 on 表连接条件 where 查询条件;

外连接

左外连接:查询出满足条件的数据和表1其余数据

左外连接:查询出满足条件的数据和表2其余数据

sql 复制代码
--左外连接格式
SELECT * FROM 表1 LEFT OUTER JOIN 表2 ON 表连接条件 WHERE 查询条件;
--右外连接格式
SELECT * FROM 表1 RIGHT OUTER JOIN 表2 ON 表连接条件 WHERE 查询条件;

子查询

先执行子查询,将子查询的结果作为父查询的一部分

in; not in; exists

sql 复制代码
SELECT 查询字段 FROM 表 WHERE 条件;
--例子,单行单列,括号里面是子查询
SELECT * FROM employee WHERE salary=(SELECT MAX(salary) FROM employee);
-- 多行单列,多行数据但是查询的是同一列 in/any/all
SELECT 查询字段 FROM 表 WHERE 字段 IN (子查询);
--多行多列,from后是子查询
SELECT 查询字段 FROM (子查询) 表别名 WHERE 条件;

多行单列

多行多列

sql 复制代码
-- aaa是子查询数据的别名
select * from (select * from Student where age >= 18) aaa left outer join class on aaa.classid = class.id
相关推荐
SHUIPING_YANG13 分钟前
根据用户id自动切换表查询
java·服务器·数据库
爱吃烤鸡翅的酸菜鱼25 分钟前
IDEA高效开发:Database Navigator插件安装与核心使用指南
java·开发语言·数据库·编辑器·intellij-idea·database
超奇电子30 分钟前
阿里云OSS预签名URL上传与临时凭证上传的技术对比分析
数据库·阿里云·云计算
modelmd35 分钟前
mysql not in 查询引发的bug问题记录
sql·mysql
神仙别闹42 分钟前
基于C#+SQL Server实现(Web)学生选课管理系统
前端·数据库·c#
m0_653031361 小时前
PostgreSQL技术大讲堂 - 第97讲:PG数据库编码和区域(locale)答疑解惑
数据库·postgresql
会编程的林俊杰1 小时前
MySQL中的锁有哪些
数据库·mysql
cts6181 小时前
Milvus分布式数据库工作职责
数据库·分布式·milvus
周胡杰1 小时前
鸿蒙加载预置数据库-关系型数据库-如何读取本地/预制数据库
数据库·华为·harmonyos·鸿蒙
布朗克1681 小时前
java常见的jvm内存分析工具
java·jvm·数据库