开始之前分享一个数据库远程连接工具:
Navicat Premium 15
可以远程连接数据库,并且查看表的结构等,非常好用。
SQL语句基础
SQL:结构化查询语言(Structured Query Language),在关系型数据库上执行数据操作、数据检索以及数据维护的标准语言。使用SQL语句,程序员和数据库管理员可以完成如下的任务
- 改变数据库的结构
- 更改系统的安全设置
- 增加用户对数据库或表的许可权限
- 在数据库中检索需要的信息
- 对数据库的信息进行更新
SQL语句分类
MySQL致力于支持全套ANSI/ISO SQL标准。在MySQL数据库中,SQL语句主要可以划分为以下几类
①DDL(Data Definition Language): 数据定义语言,定义对数据库对象(库、表、列、索引)的操作。
CREATE、DROP、ALTER、RENAME、 TRUNCATE等
②DML(Data Manipulation Language): 数据操作语言,定义对数据库记录的操作。
INSERT、DELETE、UPDATE等
③DCL(Data Control Language): 数据控制语言,定义对数据库、表、字段、用户的访问权限和安全级别。
GRANT、REVOKE等
④DQL(Data Query Language): 数据查询语言 SELECT
Transaction Control:事务控制
COMMIT、ROLLBACK、SAVEPOINT等
SQL语句的书写规范
①在数据库系统中,SQL语句不区分大小写(建议用大写) 。
②但字符串常量区分大小写。
③SQL语句可单行或多行书写,以“;”结尾。
④关键词不能跨多行或简写。
⑤用空格和缩进来提高语句的可读性。
⑥子句通常位于独立行,便于编辑,提高可读性。
SELECT * FROM tb_table
⑦注释:
SQL标准:
/**/。多行注释
“–” 单行注释
MySQL注释:
“#”
数据库操作
登录数据库
[root@localhost ~]# mysql -uroot -p
Enter password:
1、查看
SHOW DATABASES
语法:
SHOW DATABASES [LIKE wild];
如果使用LIKE wild不符,wild字符串可以是一个使用SQL的”%”和”_”通配符的字符串。
功能: 列出在MySql服务器主机上的数据库。
上图四个数据库均为MySQL自带库
①Information_schema: 主要存储了系统中的一些数据库对象信息:如用户表信息、列信息、权限信息、字符集信息、分区信息等。(数据字典表)。
②performance_schema: 主要存储数据库服务器的性能参数
③mysql: 存储了系统的用户权限信息及帮助信息。
④ sys:5.7新增,之前版本需要手工导入。这个库是通过视图的形式把information_schema 和 performance_schema结合起来,查询出更加令人容易理解的数据。
2、创建
CRATE DATABASE
语法:
CREATE DATABASE [IF NOT EXISTS]数据库名;
功能:用给定的名字创建一个数据库,如果数据库已经存在,发生一个错误。
查看创建数据库:SHOW CREATE DATABASE <数据库名>;
示例:
create database school DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
3、删除
DROP DATABSE
语法: DROP DATABASE [IF EXISTS]数据库名;
功能:删除数据库中得所有表和数据库
例如:
drop database school;
4、切换
使用USE选用数据库
语法: USE 数据库名;
功能: 把指定数据库作为默认(当前)数据库使用,用于后续语句。
其他:
查看当前连接的数据库
SELECT DATABASE();
查看数据库版本
SELECT VERSION();
查看当前用户
SELECT USER();
查看所有用户
SELECT User,Host,Password FROM mysql.user;
5、执行对应系统命令
SYSTEM <命令>system cls | clearsystem date 等
MySQL字符集
MySQL字符集包括字符集(CHARACTER) 和校对规则(COLLATION) 两个概念:
latin1支持西欧字符、希腊字符等
gbk支持中文简体字符
big5支持中文繁体字符
utf8几乎支持世界所有国家的字符。
数据库设计与对象
数据库设计的基本步骤
需求分析==>概念结构设计==>l逻辑结构设计==>物理结构设计==>数据库的实施==>数据库的运行和维护
三大范式原则
第一范式(1st NF)
第一范式的目标是确保每列的原子性
如果每列都是不可再分的最小数据单元(也成为最小的原子单元),则满足第一范式(1 NF)。
第二范式(2st NF)
第二范式要求每个表只描述一件事情
第三范式(3st NF)
如果一个关系满足2NF,并且除了主键以外的其他列都不传递依赖于主键列,则满足第三范式(3NF)。
E-R图
绘制E-R图三要素
符号 | 含义 |
---|---|
矩形 | 实体,一般是名词 |
椭圆形 | 属性,一般是名词 |
菱形 | 关系,一般是动词 |
关系型数据库常见映射函数
根据需求而生成的实体关系图
- 用二维表的形式表示实体和实体间联系的数据模型即关系模式
- E-R图转换为关系模式的步骤
- 把每个实体都转化为关系模式R(U)形式
- 建立实体间联系的转换
- 酒店管理系统数据库的关系模式是
- 客房(客房号、客房描述、客房类型、客房状态、床位数、入住人数、价格)
- 客人(客人编号,客人姓名、身份证号、入住日期、结账日期、押金、总金额、客房号)
转化E-R图为数据库模型图
- 将各实体转换为对应的表,将各属性转换为各表对应的列
- 标识每个表的主键列
- 在表之间建立主外键,体现实体
数据库对象
命名规则:
①必须以字母开头
②可包括数字和(# _ $ )三个特殊字符
③不要使用MySQL的保留字
④统一Schema下的对象不能同名。
表的基本操作
创建表
建表的语句:
CREATE TABLE [schema.]table(column datatype[DEFAULT expr] ,…) ENGINE = 存储机制CREATE TABLE
简单语法:CREATE TABLE 表名(列名 列类型,列名 列类型);
功能:在当前数据库中创建一张表
数据类型
在MySQL中有三种主要的类型:
①文本
②数字
③日期/时间类型
数据类型 | 描述 |
---|---|
CHAR(size) | 保存固定长度的字符串(可包含字母、数字以及特殊字 符)。在括号中指定字符串的长度。最多 255 个字符。 |
VARCHAR(size) | 保存可变长度的字符串(可包含字母、数字以及特殊字 符)。在括号中指定字符串的最大长度。最多 255 个字 符。 注释:如果值的长度大于 255,则被转换为 TEXT 类型。 |
TINYTEXT | 存放最大长度为 255 个字符的字符串。 |
TEXT | 存放最大长度为 65,535 个字符的字符串。 |
BLOB | 用于 BLOBs (Binary Large OBjects)。存放最多 65,535 字节的数据。 |
MEDIUMTEXT | 存放最大长度为 16,777,215 个字符的字符串。 |
MEDIUMBLOB | 用于 BLOBs (Binary Large OBjects)。存放最多 16,777,215 字节的数据。 |
LONGTEXT | 存放最大长度为 4,294,967,295 个字符的字符串。 |
LONGBLOB | 用于 BLOBs (Binary Large OBjects)。存放最多 4,294,967,295 字节的数据。 |
ENUM(x,y,z,etc.) | 允许你输入可能值的列表。可以在 ENUM 列表中列出最大 65535 个值。如果列表中不存在插入的值,则插入空值。 注释:这些值是按照你输入的顺序存储的。 可以按照此格式输入可能的值: ENUM(‘X’,‘Y’,‘Z’) |
SET | 与 ENUM 类似, SET 最多只能包含 64 个列表项,不过 SET 可存储一个以上的值。 |
Number 类型:
数据类型 | 描述 |
---|---|
TINYINT(size) | -128 到 127 常规。 0 到 255 无符号*。在括号中规定最 大位数。 |
SMALLINT(size) | -32768 到 32767 常规。 0 到 65535 无符号*。在括号中 规定最大位数。 |
MEDIUMINT(size) | -8388608 到 8388607 普通。 0 to 16777215 无符号*。在 括号中规定最大位数。 |
INT(size) | -2147483648 到 2147483647 常规。 0 到 4294967295 无 符号*。在括号中规定最大位数。 |
BIGINT(size) | -9223372036854775808 到 9223372036854775807 常规。 0 到18446744073709551615 无符号*。在括号中规定最大位 数。 |
FLOAT(size,d) | 带有浮动小数点的小数字。在括号中规定最大位数。在 d 参数中规定小数点右侧的最大位数。 |
DOUBLE(size,d) | 带有浮动小数点的大数字。在括号中规定最大位数。在 d 参数中规定小数点右侧的最大位数。 |
DECIMAL(size,d) | 作为字符串存储的 DOUBLE 类型,允许固定的小数点。 |
Date 类型:
数据类型 | 描述 |
---|---|
DATE() | 日期。格式: YYYY-MM-DD 注释:支持的范围是从 ‘1000-01-01’ 到 ‘9999-12-31’ |
DATETIME() | 日期和时间的组合。格式: YYYY-MM-DD HH:MM:SS 注释:支持的范围是’1000-01-01 00:00:00’ 到 ‘9999-12- 31 23:59:59’ |
TIMESTAMP() | 时间戳。 TIMESTAMP 值使用 Unix 纪元(‘1970-01-01 00:00:00’ UTC) 至今的描述来存储。格式: YYYY-MM-DD HH:MM:SS 注释:支持的范围是从 ‘1970-01-01 00:00:01’ UTC 到 ‘2038-01-09 03:14:07’ UTC |
TIME() | 时间。格式: HH:MM:SS 注释:支持的范围是从 ‘-838:59:59’ 到 ‘838:59:59’ |
YEAR() | 2 位或 4 位格式的年。 注释: 4 位格式所允许的值: 1901 到 2155。 2 位格式所允许 的值: 70 到69,表示从 1970 到 2069 |
查看表
SHOW 语句
语法:
SHOW TABLES[FROM 数据库名][LIKE wild];
功能:
显示当前数据库中已有的数据表的信息(结构和创建信息)。
DESCRIBE
语法:
{DESCRIBE|DESC}表名[列名];
# or
show columns from 表名称;
功能:
查看数据表中各列的信息。
删除表
DROP语句
语法:
DROP TABLE [IF EXISTS] 表名;
功能:
删除指定表
修改表的结构
修改列类型:
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-存放了数据表的索引。
表的约束
约束是在表上强制执行的数据校验规则。约束主要用于保证数据库的完整性。当表中数据有相互依赖性时,可以保护相关的数据不被删除。大部分数据库支持下面五类完整性约束:
NOT NULL 非空
UNIQUE KEY 唯一键
PRIMARY KEY 主键
FOREIGN KEY 外键
CHECK 检查默认值约束
约束作为数据库对象,存放在系统表中,也有自己的名字。
创建约束的时机:
①在建表的同时创建
②建表后创建(修改表)
可定义列级或表级约束
有单列约束和多列约束
列级约束: 在定义列的同时定义约束
语法: 列定义 约束类型,
表级约束: 在定义了所有列之后定义的约束
语法:
列定义
[CONSTRAINT 约束名] 约束类型(列名)
约束名的取名规则
推荐采用: 表名_列名_约束类型简介
在创建完后再添加约束:
语法:
ALTER TABLE 表名 ADD CONSTRAINT 约束名 约束类型(要约束的列名)
表的约束市例
1、非空约束(NOT NULL)
CREATE TABLE tb_student(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(18) NOT NULL
);
2、唯一约束(UNIQUE)
唯一性约束条件确保所在的字段或者字段组合不出现重复值。
唯一性约束条件的字段允许出现多个NULL。
同一张表内可建多个唯一约束。
唯一约束可由多列组合而成。
建唯一约束时MySQL会为之建立对应的索引。
如果不给唯一约束起名,该唯一约束默认与列名相同。
CREATE TABLE tb_student(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(18) UNOQUE NOT NULL
);
3、主键约束
主键从功能上看相当于非空且唯一。
一个表中只允许一个主键。
主键是表中唯一确定一行数据的字段。
CREATE TABLE tb_student(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(18)
);
4、外键约束
外键是构建于一个表的两个字段或者两个表的两个字段之间的关系。
外键确保了相关的两个字段的两个关系:
子(从) 表外键列的值必须在主表参照列值的范围内,或者为空(也可以加非空约束,强制不允许为空)。
当主表的记录被子表参照时,主表记录不允许被删除。
外键参照的只能是主表主键或者唯一键,保证子表记录可以准确定位到被参照的记录。
格式
FOREIGN KEY (外键列名) REFERENCES 主表(参照列)
CREATE TABLE tb_dept(
dept_id INT PRIMARY KEY,
NAME VARCHAR(18),
decription VARCHAR(255)
);CREATE TABLE tb_employee(
employee_id INT PRIMARY KEY,
NAME VARCHAR(18),
gender VARCHAR(10),
dept_id INT REFERENCES tb_dept(dept_id),
address VARCHAR(255)
);
5、检查约束
create table t3(id int, age int check(age > 18),gender char(1) check(gender in ('M','F'))
);
6、默认值
可以使用default关键字设置每一个字段的默认值。
CREATE TABLE `test`.`user`( `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT 'id',`name` VARCHAR(225) COMMENT '姓名',`sex` TINYINT(1) DEFAULT 1 COMMENT '性别 1男 0女',PRIMARY KEY (`id`)
) ENGINE=INNODB CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
删除表的约束
1、删除NOT NULL约束
ALTER TABLE 表名 MODIFY 列名 类型;
2、删除UNIQUE约束
ALTER TABLE 表名 DROP INDEX 唯一约束名;
3、删除PRIMARY KEY约束
ALTER TABLE 表名 DROP PRIMARY KEY;
4、删除FOREIGN KEY约束
ALTER TABLE 表名 DROP FOREIGN KEY 外键名;
自动增长和默认值
为新的行产生唯一的标识。
一个表只能优一个auto_increment,且该属性必须为主键的一部分。auto_increment的属性可以是任何整数类型。
AUTO_INCREMENT:自动增长
DEFAULT:默认值