主要概述
数据库管理语句分类
数据库服务字符设置
数据库数据 类型介绍
数据库属性约束设置
数据库语句获取帮助
数据库操作库的语句(DDL)
数据库操作表的语句(DDL)
1. 数据库管理语句分类
SQL语句的概述
他是一种对关系数据库中的数据进行定义和操作的语言,是大多数关系数据库管理系统所支持的工业标准
SQL语句的分类
DDL:数据定义语言
负责管理数据库的基础数据,比如数据增删库、增删表、增删索引、增删用户。
涉及语句:CREATE(创建)、ALTER(修改)、DROP(删除)等
DCL:数据控制语言
主要用于定义访问权限和安全级别
涉及语句:GRANT(用户授权)、REVOKE(权限回收)、COMMIT(提交)、ROLLBACK(回滚)
DML:数据操作语言
主要针对数据库里的表里的数据进行操作,用来定义数据库记录。
涉及语句:SELECT(查)、INSERT(增)、DELETE(删)、UPDATE(改)
DQL:数据查询语言
主要用来查询数据
涉及语句:SELECT(查)
2. 数据库服务字符设置
为什么要有字符编码设置(避免中文乱码)
开发人员------英文写好代码---字典/编码ASCLL------二进制
数据库中常用字符编码以及区别
utf8:不支持表情符号 emoji 最多存储3字节长度字符
utf8mb4:支持表情符号 emoji 最多存储4字节长度字符
数据库中如何设置字符编码
查看数据库的可以设置的字符编码:
show charset;
查看目前的字符编码设置:
show variables like '%char%';
全局调整字符编码
vim /etc/my.cnf
[mysql]
socket=/tmp/mysql.sock
user=root
password=123
[mysqld]
default_authentication_plugin=mysql_native_password
mysqlx=0
user=mysql
basedir=/usr/local/mysql
datadir=/data/3306/data
socket=/tmp/mysql.sock
## 调整字符编码
character-set-server=gbk
## 重启数据库
systemctl restart mysqld
## 查看字符编码
show variables like '%char%';
局部调整字符编码(库,表)
create database zhibang charset utf8;
create table t2(id int) charset gbk;
3. 数据库数据类型介绍
简单来说就是为了限制用户输入的信息,比如说我想要收集用户的名字比如张三、李四,年龄20、30,你非要输入acb,年龄-1,1000等这些无效数据,因此就有了数据类型来限制用户输入的信息。
常用的数据类型:
整型:
tinyint(m) 1个字节
int(m) 4个字节
bigint(m) 8个字节
浮点型:
float (m,d) 单精度浮点型 4字节 m总个数 ,d小数位
字符串类型:
char(n) 固定长度,最多255个字符
varchar(n) 固定长度,最多65535个字符
longtext 可变长度,最多2的32次方-1个字符 存储评论信息
特殊数据类型
enum 枚举类型
参考链接:
4. 数据库属性约束设置
约束用户输入的信息,前面数据库的数据类型约束了用户输入的数据,可是又有一个问题,比如说两个用户输入相同的手机号或者ID,这在结果上应该不是我们希望看到的,因此我们引入了数据库属性约束的设置
约束:
PK(primary key) 表示主键约束,非空且唯一(表中只能有一个主键)
UK(unique key) 表示唯一约束
NN(not null) 表示非空约束
FK(foreign key) 表示外键约束,多表之间关联使用
属性:
辅助表信息录入
default 设置默认数据信息,可以实现自动填充
auto_increment 设置数值信息自增,可以实现数值编号自增填充(一般配合主键使用)
comment 设置数据的注释信息
unsigned 设置数值信息非负,可以实现数值信息列不能负数信息
补充:数据库外键约束说明----FK
外键也称之为外键约束,顾名思义,就是外面的键,一张表的一个字段(非主键)指向另外一个表的主键,那么该字段就可以称之为外键。外键所在的表称之为子表,外键所指向的主键所在的表称之为父表。
外键的设置说明
添加外键:
## 方式一:在创建表的时候添加外键
mysql>foreign key(外键字段) references 主表(主键)
## 实际操作
## 创建外键关联的父表
mysql> create table class(
-> id int primary key auto_increment,
-> name varchar(10) not null comment "班级名,不能为空",
-> room varchar(10) comment "教室,允许为空"
-> ) charset utf8;
## 创建外键关联的子表
mysql> create table student( id int primary key auto_increment, number char(10) not null unique comment "学号,不能
重复", name varchar(10) not null comment "姓名", c_id int, foreign key (c_id) references class(id) ) charset utf8;
## 查看外键 在Key的那一列是否为MUL,如果是则表示设置成功
mysql> desc student;
## 方式二:在创建表后添加外键
mysql>alter table 表名 add constraint 外键名 foreign key (外键字段) references 父表(主键字段)
## 实际操作
## 创建没有外键信息的表
mysql> create table t_foreign(
-> id int primary key auto_increment,
-> c_id int
-> ) charset utf8;
## 设置外键
mysql> alter table t_foreign add constraint class_foreign foreign key (c_id) references class(id);
## 查看外键
mysql> desc t_foreign;
删除外键:
外键不能被修改,只能先删除后在新增;
## 删除外键的格式
mysql> alter table 表名 drop foreign key 外键名;
## 删除表(t_foreign中外键信息)
mysql> alter table t_foreign drop foreign key class_foreign;
查看外键:
mysql> show create table t_foreign;
mysql> desc t_foreign;
外键的约束
外键对子表的数据写操作约束(增加和更新)
如果子表中插入的数据所对应的外键在父表不存在,创建不成功。
## 实际操作,班级表都是空的,你创建学生自然也没有意义了
mysql> select * from class;
Empty set (0.01 sec)
mysql> select * from student;
Empty set (0.00 sec)
mysql> insert into student values (null,'20250514','xiaoXing',1);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`xingzhibang`.`student`, CONSTRAINT `student_ibfk_1` FOREIGN KEY (`c_id`) REFERENCES `class` (`id`))
外键对父表也有数据约束
当父表操作一个记录,但是该记录被子表所引用的时候,那么父表的操作将会被限制
## 实际操作
## 创建班级
mysql> insert into class values (1,'linux','001'),(2,'mysql','002');
## 创建学生
mysql> insert into student values(null,'001','xiaoxing',1);
mysql> insert into student values(null,'002','xiaobang',2);
## 查看表
mysql> select * from class;
+----+-------+------+
| id | name | room |
+----+-------+------+
| 1 | linux | 001 |
| 2 | mysql | 002 |
+----+-------+------+
mysql> select * from student;
+----+--------+----------+------+
| id | number | name | c_id |
+----+--------+----------+------+
| 2 | 001 | xiaoxing | 1 |
| 3 | 002 | xiaobang | 2 |
+----+--------+----------+------+
## 此时当我想要删除班级表的时候发现会报错
mysql> delete from class where id=1;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`xingzhibang`.`student`, CONSTRAINT `student_ibfk_1` FOREIGN KEY (`c_id`) REFERENCES `class` (`id`))
## 因为班级001中已经有了一位学生了,因此我们需要先删除在001号教室里的学生信息然后才能删除001的教室
mysql> delete from student where id=2;
Query OK, 1 row affected (0.01 sec)
mysql> select * from student;
+----+--------+----------+------+
| id | number | name | c_id |
+----+--------+----------+------+
| 3 | 002 | xiaobang | 2 |
+----+--------+----------+------+
mysql> delete from class where id=1;
Query OK, 1 row affected (0.00 sec)
5. 数据库语句获取帮助
在数据库服务中,SQL语句涉及到的语句非常多,在实际应用过程中也未必都能记住因此就需要掌握获取帮助的方法;
## 获取基本帮助信息
mysql> \h
# 或者
mysql> ?
## 获取语句分类帮助
mysql> ? contents;
mysql> help contents;
## 获取具体语句帮助
mysql> ? create
mysql> ? create database
6. 数据库操作库的语句(DDL)
创建库
mysql> create database test;
mysql> create schema test;
## 创建新的数据库,并修改调整默认的字符编码
mysql> create database test character set utf8mb4;
mysql> create database test character set utf8 collate utf8_general_mysql500_ci;
查看库
mysql> show databases;
mysql> show create database test;
删除库
mysql> drop database test;
mysql>drop schema test;
## 生产环境慎用!!!
修改库
mysql> alter database test charset utf8mb4;
mysql> alter database test charset collate utf8_general_mysql500_ci;
切换库
mysql> use test;
mysql> select database();
7. 数据库操作表的语句(DDL)
创建表
#格式:
mysql> create table 表名(
<字段名1> <类型1> 约束 属性,
...
<字段名n> <类型n>);
## 实际操作
mysql> create table class(
-> id int primary key auto_increment,
-> name varchar(10) not null comment "班级名,不能为空",
-> room varchar(10) comment "教室,允许为空"
-> ) charset utf8;
查看表
## 查看表结构
mysql> desc stu1;
## 查看表创建的命令
mysql> show create table stu1;
修改表
## 修改表名
mysql> rename table stu1 to stu2;
mysql> alter table stu2 rename stu1;
## 修改表结构
# 在学生表中添加新的表结构字段列--追加字段列
mysql>alter table stu1 add column telno char(11) not null unique key comment '手机号';
# 插入字段列
mysql> alter table stu1 add column wechat char(11) not null unique key comment '微信号' after age;
# 插入首行列
mysql> alter table stu1 add column wechat char(11) not null unique key comment '微信号' first;
删除表
## 删除表,会将定义的表结构和表中数据内容一并删除
mysql>drop table stu1;
## 只是清空表中数据内容,但是保留定义的表结构信息
mysql>truncate table stu1;
mysql>delete table stu1;
评论