SQL - 数据定义语句

SQL - 数据定义语句

文章目录

  • [SQL - 数据定义语句](#SQL - 数据定义语句)
    • [数据定义语句 - DDL](#数据定义语句 - DDL)
      • [1 创建数据表](#1 创建数据表)
      • [2 修改数据表](#2 修改数据表)
      • [3 删除表](#3 删除表)
    • 约束
      • [1 实体完整性约束](#1 实体完整性约束)
        • [1.1 主键约束](#1.1 主键约束)
        • [1.2 唯一约束](#1.2 唯一约束)
        • [1.3 自动增长列](#1.3 自动增长列)
      • [2 域完整性约束](#2 域完整性约束)
      • [3 引用完整性约束](#3 引用完整性约束)

数据定义语句 - DDL

概念:

  • DDL(Data Definition Language), 即数据定义语句。定义语言就是定义关系模式、删除关系、修改关系模式以及创建数据库中的各种对象,比如表、聚簇、索引、视图、函数、存储过程和触发器等等。
  • 数据定义语言是由SQL语言集中负责数据结构定义与数据库对象定义的语言,并且由CREATE、ALTER、DROP和TRUNCATE四个语法组成。

1 创建数据表

语法:

sql 复制代码
CREATE TABLE 表名(

  列名 数据类型 [约束],

  列名 数据类型 [约束],

  列名 数据类型 [约束]

)charset=utf8mb4

代码演示:

sql 复制代码
# 1 创建表
# 学生表
create table if not exists student(
	stu_id int,
	stu_name varchar(20),
	stu_age int,
	stu_gender char(2),
	stu_address varchar(100),
	stu_born date
)charset=utf8mb4;

# 科目表
create table if not exists course(
	course_id int,
	course_name varchar(20),
	course_hour int
);

# 成绩表
create table if not exists score(
	stu_id int,
	course_id int,
	result double(5,2),
	exam_time datetime
);

注意:

  • 最后一列的末尾不加逗号。
  • 在最外面可以指定表的字符编码集,不指定默认编码。

2 修改数据表

语法: ALTER TABLE 表名 操作;

代码演示:

sql 复制代码
# 2.1 向现有表中添加列
alter table student add stu_email varchar(50);
sql 复制代码
# 2.2 修改列名和类型
alter table student change stu_email email varchar(60);
sql 复制代码
# 2.3 删除一列
alter table student drop stu_born;
sql 复制代码
# 2.4 修改表名
alter table student rename t_student;
alter table score rename t_score;
alter table course rename t_course;

3 删除表

**语法: **DROP TABLE 表名;

sql 复制代码
# 3 删除表
# if exists 判断是否存在
drop table if exists student; 

约束

思考:

  • 向表中新增数据时,可不可以新增两行相同列值的数据?
  • 如果可行,会有什么弊端?

概念: 用于限制加入表的数据的类型和规范。

1 实体完整性约束

1.1 主键约束

**语法:**PRIMARY KEY。

**作用:**唯一,标识表中的一行数据,此列的值不可重复,且不能为 NULL。

代码演示:

sql 复制代码
# 为适用于主键的列添加主键约束
# 1.1 主键约束: 唯一表示一行数据, 此列的值不能重复, 也不能为空
create table if not exists student(
	stu_id int primary key,
	stu_name varchar(20),
	stu_age int,
	stu_gender char(2),
	stu_address varchar(100)
)charset=utf8mb4;

insert into student values(101,'张三',20,'男','北京昌平');
insert into student values(102,'田美丽',20,'女','北京昌平');

create table if not exists course(
	course_id int primary key,
	course_name varchar(20),
	course_hour int
);

insert into course values(1,'Java',200),(2,'MySQL',50),(3,'HTML',60);

[重点] 联合主键

语法: primary key(表1, 表2)

代码演示:

sql 复制代码
# 联合主键
create table if not exists score(
	stu_id int,
	course_id int,
	result double(5,2),
	exam_time datetime,
	primary key(stu_id,course_id)
);

insert into score values(101,1,90,'2024-1-25');
insert into score values(101,2,90,'2024-1-25');
1.2 唯一约束

语法: unique

作用: 唯一,标识表中的一行数据,不可重复,可以为NULL

代码演示:

sql 复制代码
create table if not exists student(
	stu_id int primary key,
	stu_name varchar(20),
	stu_age int,
	stu_gender char(2),
	stu_address varchar(100),
	identitycard varchar(18) unique
)charset=utf8mb4;

insert into student values(101,'张三',20,'男','北京昌平','111111111111111111');
insert into student values(102,'田美丽',20,'女','北京昌平',null);
1.3 自动增长列

语法: AUTO_INCREMENT

代码演示:

sql 复制代码
# 1.3 自动增长列
-- 不能单独使用,给主键数值列添加自动增长;每个表只能有一个。
-- 默认从1开始,每次加1;可以使用auto_increment=100修改初始值
-- 只会增加, 即使将数据删除也不会倒退

# 需求: 为编号添加自动增长
create table if not exists course(
	course_id int primary key auto_increment,
	course_name varchar(20),
	course_hour int
);

insert into course(course_name,course_hour) values('JAVA',200),('MySQL',50),('HTML',60);

注意:

  • 不能单独使用,给主键数值列添加自动增长;每个表只能有一个。
  • 默认从1开始,每次加1;可以使用auto_increment=100修改初始值

2 域完整性约束

**概念: **限制列的单元格的数据正确性。

**包括: **

  • 数据类型:
    • 数值类型、字符串类型、日期时间类型
  • 非空约束:
    • 语法:NOT NULL。
    • 作用:非空
  • 默认值约束:
    • 语法:DEFAULT 值。
    • 作用:为列赋予默认值,新增数据不指定值或书写DEFAULT,使用默认值进行填充。

代码演示:

sql 复制代码
drop table student; # 删除原有student表

create table if not exists student(
	stu_id int primary key auto_increment,
	stu_name varchar(20) not null, #非空约束
	stu_age int,
	stu_gender char(2),
	stu_address varchar(100) default '地址不详', #默认值约束
	stu_born date default '2000-01-01'
)charset=utf8mb4;

insert into student values(null,'张三',20,'男','北京','2000-10-05'); 
insert into student values(null,'李四',20,'男',null,'2000-10-05');
insert into student values(null,'王五',20,'男',default,'2000-10-05'); 
insert into student (stu_name,stu_age,stu_gender) values('赵六',20,'女');

3 引用完整性约束

概念: 引用完整性约束也称为外键约束。

语法: constraint [外键名] foreign key(列名) references 主表(列名)。

作用:

  • FOREIGN KEY引用外部表的某个列的值。
  • 新增数据时,约束此列的值必须是引用表中已经存在的值。

代码演示:

sql 复制代码
# 引用完整性约束[外键约束]
drop table score; # 删除原有数据表

create table if not exists score(
	stu_id int,
	course_id int,
	result double(5,2),
	exam_time datetime,
	primary key(stu_id,course_id),
	constraint foreign key(stu_id) references student(stu_id),
	constraint foreign key(course_id) references course(course_id)
);

insert into score values(101,1,90,'2024-1-25');
insert into score values(101,2,93,'2024-1-25');
insert into score values(101,3,99,'2024-1-25');
insert into score values(102,3,99,'2024-1-25');

注意:当两张表存在引用关系,若要执行删除操作,一定要先删除从表(引用表),再删除主表(被引用表)

相关推荐
几道之旅2 小时前
Electron实现“仅首次运行时创建SQLite数据库”
数据库·electron·sqlite
AWS官方合作商2 小时前
从AWS MySQL数据库下载备份到S3的完整解决方案
数据库·mysql·aws
Mr_Xuhhh3 小时前
QT窗口(4)-浮动窗口
android·开发语言·网络·数据库·c++·qt
Mr_Xuhhh3 小时前
QT窗口(3)-状态栏
java·c语言·开发语言·数据库·c++·qt·算法
小鱼1517434 小时前
SQL-DML
数据库
gwcgwcjava4 小时前
【时序数据库-iotdb】时序数据库iotdb的可视化客户端安装部署--dbeaver
数据库·时序数据库·iotdb
qq_529835354 小时前
事务隔离:从锁实现到MVCC实现
java·开发语言·数据库
Komorebi_99994 小时前
MySQL常用指令
数据库·mysql
weixin_439828094 小时前
Redis的协同和异步
数据库·redis·缓存
liux35284 小时前
Oracle 11g RAC 高可用集群部署最佳实践
数据库·oracle·rac