MySQL数据库和表的操作
#使用数据库
use 数据库名;
# 查询当前数据库是哪个数据库
select database();
查看数据库版本
SELECT VERSION();
查看当前用户
SELECT USER();
查看所有用户()
SELECT User,Host,Password FROM mysql.user;
数据库
MySQL自带数据库:
Information_schema: 主要存储了系统中的一些数据库对象信息:如用户表信息、列信息、权限信 息、字符集信息、分区信息等。(数据字典表)
performance_schema: 主要存储数据库服务器的性能参数
mysql: 存储了系统的用户权限信息及帮助信息。
sys: 5.7新增,之前版本需要手工导入。这个库是通过视图的形式把information_schema
performance_schema结合起来,查询出更加令人容易理解的数据
test:系统自动创建的测试数据库,任何用户都可以使用。
MySQL数据库的编码
MySQL的编码格式
在 MySQL 中,编码格式是用来定义字符集的存储和比较方式。不同的编码格式支持不同范围的字符,并且影响数据库的排序规则和比较结果。了解和选择合适的编码格式对于数据库的国际化和字符数据的准确存储至关重要。
utf8 和 utf8mb4 的区别
MySQL 提供了多种编码格式,其中 utf8 和 utf8mb4 是最常用的两种。utf8 编码格式在 MySQL 中支持最长三个字节的 UTF-8 字符,这意味着它只能表示 Unicode 中的基本多文本平面1。这个范围包括了大多数常用字符,但不包括四字节的字符,如某些表情符号。
utf8mb4 是 utf8 的超集,支持最长四个字节的 UTF-8 字符,能够存储所有 Unicode 字符,包括表情符号。因此,如果需要在数据库中存储表情符号或其他四字节字符,应该使用 utf8mb4 编码格式。
utf8mb4 的排序规则
utf8mb4 编码格式还有几种不同的排序规则(collation),例如 utf8mb4_general_ci、utf8mb4_unicode_ci 和 utf8mb4_0900_ai_ci。这些排序规则影响字符串比较和排序的行为。utf8mb4_general_ci 是一种性能较好的排序规则,但在某些情况下可能不够准确。utf8mb4_unicode_ci 基于 Unicode 标准提供了更准确的排序,但可能会稍微慢一些。utf8mb4_0900_ai_ci 是 MySQL 8.0 引入的新排序规则,提供了更好的性能和准确性1。
-- 查看数据库编码
SHOW CREATE DATABASE database_name;
-- 查看表编码
SHOW CREATE TABLE table_name;
-- 查看字段编码
SHOW FULL COLUMNS FROM table_name;
-- 修改数据库编码
ALTER DATABASE database_name CHARACTER SET charset_name;
-- 修改表编码
ALTER TABLE table_name CONVERT TO CHARACTER SET charset_name;
-- 修改字段编码
ALTER TABLE table_name MODIFY column_name column_type CHARACTER SET charset_name;
将 table_name
替换为表名称,column_name
替换为字段名称,column_type
替换为字段类型,charset_name
替换为你要使用的编码。
创建数据库
使用命令是create
# 创建数据库
CREATE DATABASE 数据库名称;
# 创建数据库,同时指定编码
create database db_name default charset="utf8mb4";
create database school DEFAULT CHARACTER SET utf8mb4;
create database school DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
例如:
查看当前数据库
# 查看创建的数据库
show create databsse 数据库名称;
#查看当前所有数据库
SHOW DATABASES;
删除数据库
使用drop命令
drop database 数据库名称;
drop database [if exists] db_chengke;
---为了使输出不报错,可添加上if exists,一般用于在大量SQL语句执行时,[]中的内容可省略,
例如:
数据库表的操作
数据表(table),是一种二维表格,类似于execel,用来存储真正的数据。
创建表格
-- 语法结构
create table [if not exists] t_name (
# 定义表结构
字段名称1 类型 [约束条件],
字段2 类型 [约束条件],
……
字段n 类型 [约束条件]
);
例如:
/**
创建一个用户表
用户的姓名
用户的年龄
用户的性别
用户的地址
用户的电话
**/
create table t_user (
id int,
name varchar(50),
age int,
gender char(5),
address varchar(255),
tel char(11)
);
插入数据
删除表格
drop table if exists t_user;
数据库约束
创建数据库表的时候,字段名称 该字段类型 [约束 [,……] ]。
约束是在表上强制执行的数据校验规则。约束主要用于保证数据库的完整性。当表中数据有相互依赖性时,可以保护相关的数据不被删除。大部分数据库支持下面五类完整性约束:
存在如下一些数据库表的约束:
默认值约束
主键约束
非空约束
外键约束
唯一约束
检查约束 (MySQL8之前,不生效。MySQL8之后是支持检查约束)
主键约束
主键从功能上看相当于非空且唯一,一个表中只允许一个主键,主键是表中唯一确定一行数据的字段。
一般建议主键采用“int类型”,一般建议由数据库自身维护这个字段的值。
当建立主键约束时,MySQL为主键创建对应的索引——主键索引,主键约束名总为PRIMARY。
案例演示:
create table t_name(
id int primary key, -- 主键约束
name varchar(50)
);
#插入数据
insert into t_name values(1,"zxy");
Query OK, 1 row affected (0.00 sec)
#必须是唯一值,出现重复就会报错
insert into t_name values(1,"zxy");
ERROR 1062 (23000): Duplicate entry '1' for key 't_name.PRIMARY'
#不能为空值
insert into t_name values(null,"lh");
ERROR 1048 (23000): Column 'id' cannot be null
-- 主键还存在一种写法
create table t_name(
id int auto_increment, -- 主键约束
name varchar(50),
primary key(id)
);
唯一约束
唯一性约束条件确保所在的字段或者字段组合不出现重复值
唯一性约束条件的字段允许出现一个NULL
同一张表内可建多个唯一约束
唯一约束可由多列组合而成
建唯一约束时MySQL会为之建立对应的索引——唯一索引。
如果不给唯一约束起名,该唯一约束默认与列名相同。
#唯一约束:
CREATE TABLE tb_student(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(18) UNIQUE -- 唯一约束
);
AUTO_INCREMENT ---自增1
# 另一种写法:
CREATE TABLE tb_student(
id INT AUTO_INCREMENT,
NAME VARCHAR(18), -- 唯一约束
PRIMARY KEY(id),
unique(name)
);
默认值约束
给给定的字段,设置默认值
语法格式:
CREATE TABLE 表名 (
字段 数据类型 DEFAULT 默认值
);
案例演示:
create table tb_user(
id int primary key auto_increment,
name varchar(50) unique, --唯一约束
age int default 18 -- 默认值约束
);
insert into tb_user(name, age) values("zxy", 18);
insert into tb_user values(null, "xy", 16); -- 因为存在自增,所以可以写null
insert into tb_user values(default, "zx", 16); -- 因为存在自增,所以可以写默认
非空约束
不允许字段的值为空
语法格式:
CREATE TABLE 表名 (
字段 数据类型 NOT NULL
);
案例演示:
create table t_user(
id int primary key auto_increment,
name varchar(50) unique not null,
age int default 18 ,
password varchar(255) not null --非空约束
);
insert into t_user values(null, "zxy", 16); -- 因为存在自增,所以可以写null
ERROR 1136 (21S01): Column count doesn't match value count at row 1
这里password字段有非空约束,所以报错
外键约束
检查约束
注意:检查约束在MySQL8之前是不生效的,当然也不报错。
MySQL8之后,就支持了检查约束。
create table t_stu(
id int primary key auto_increment,
name varchar(50) not null unique,
age int check(age >= 18), --外键约束
# gender char(2) check(gender in ("男", "女"))
gender enum("男", "女") ----外键约束
);
修改表结构
在sql中,也提供了动态修改表结构的sql功能。
使用alter
指令,实现对数据库对象的结构的调整和修改。
语法格式:
修改列类型
ALTER TABLE 表名 MODIFY 列名 列类型; -- 注意存在值的情况,类型不一定能成功
增加列
ALTER TABLE 表名 ADD 列名 列类型;
删除列
ALTER TABLE 表名 DROP 列名;
列改名
ALTER TABLE 表名 CHANGE 旧列名 新列名 列类型;
更改表名
ALTER TABLE 表名 RENAME 新表名;
RENAME TABLE 表名 TO 新表名;
复制表结构和内容
复制一个表结构的实现方法有两种
方法一:在create table语句的末尾添加like子句,可以将源表的表结构复制到新表中,语法格式如下。
create table 新表名 like 源表
方法二:在create table语句的末尾添加一个select语句,可以实现表结构的复制,甚至可以将源表的表
记录拷贝到新表中。下面的语法格式将源表的表结构以及源表的所有记录拷贝到新表中。
create table 新表名 select * from 源表
方法三:如果已经存在一张机构一致的表,复制数据
insert into 表 select * from 原表;
注意:如果直接复制表结构,则会默认将约束也复制过来
注意:如果复制表结构的同时,复制数据,则不会复制约束
数据库字典
由information_schema数据库负责维护
tables-存放数据库里所有的数据表、以及每个表所在数据库。
schemata-存放数据库里所有的数据库信息
views-存放数据库里所有的视图信息。
columns-存放数据库里所有的列信息。
triggers-存放数据库里所有的触发器。
routines-存放数据库里所有存储过程和函数。
key_column_usage-存放数据库所有的主外键
table_constraints-存放数据库全部约束。
statistics-存放了数据表的索引。