- 是所有关系型数据库的统一操作规范,不同关系型数据库都支持SQL
- 所有的关系型数据库都可多使用SQL
- 不同数据库之间的SQL有一些区别(方言)
释语注法 | 说明 |
- 空格 | 单行注释 |
/**/ | 多行注释 |
# | MySQL特有的单行注释 |
数据库查询语言(Data Query Language,DQL):
DQL主要用于数据的查询,其基本结构是使用SELECT子句,FROM子句和WHERE子句的组合来查询一条或多条数据。
数据库操作语言(Data Manipulation Language,DML):
DML主要用于对数据 增加、修改和删除的操作。
主要包括:INSERT-增加数据;UPDATE-修改数据;DELETE-删除数据。
数据定义语言(Data Definition Language,DDL):
DDL主要针对是数据库对象(数据库、表、索引、视图)进行创建,修改和删除操作。
主要包括:CREATE-创建;ALTER-修改;DROP-删除。
数据库控制语言(Data Control Language,DCL):
DCL用来授予或回收访问数据库的权限。
主要包括:GRANT-授予用户某种权限;REVOKE-回收授予的某种权限
事务控制语言(Transaction Control Language,TCL):
TCL用于数据库的实物管理。
主要包括:START TRANSACTION-开启实物;SET TRANSACTION-设置事务的属性
COMMIT-提交事务;ROLLBACK-回滚事务
-- 查看所有的数据库
show database;
--创建数据库
create database bjsxt01;
-- 删除数据库
drop database bjsxt01;
类型 | 描述 |
---|---|
int | 整型 |
double | 浮点型 |
varchar | 字符串型 |
char(M) | 0~255字符 允许长度0~M个字符的定长字符串 |
date | 日期类型,格式为:yyyy-MM-dd |
datetime | ‘YYYY-MM-DD HH:MM:SS’('1000-01-01 00:00:00','9999-12-31 23:59:59') |
整数类型 | 大小 | 表数范围(有符号) | 表数范围(无符号) | 作用 |
---|---|---|---|---|
TINYINT | 1字节 | (-128,127) | (0,255) | 小整数值 |
SMALLINT | 2字节 | (-32768,32767) | (0,65535) | 大整数值 |
MEDIUMINT | 3字节 | (-8388608,8388607) | (0,16777215) | 大整数值 |
INT/INTEGER | 4字节 | (-214748364,2147483647) | (0,4294967295) | 大整数值 |
BIGINT | 8字节 | (-9233372036854775808,9223372036854775807) | (0,18446744073709551615) | 极大整数值 |
MySQL支持选择在该类型关键字后面的括号内指定整数值的显示宽度(例如,INT(4))。显示宽度并不限制可以在列内保存的值的范围。
浮点数类型 | 大小 | 作用 |
---|---|---|
FLOAT | 4字节 | 单精度浮点数值 |
DOUBLE | 8字节 | 双精度浮点数值 |
注意事项:
浮点数类型的宽度不会自动扩充,使用时需要指定长度。
如:score double(4,1) 总体长度是4 精度为1位。 decimal (16个字节)
字符串类型 | 大小 | 描述 |
---|---|---|
CHAR(M) | 0~255字符 | 允许长度0~M个字符的定长字符串 |
VARCHAR(M) | 0~65535字符 | 允许长度0~M个字符的变长字符串 |
BINARY(M) | 0~255字节 | 允许长度0~M个字节的定长二进制字符串 |
VARBINARY(M) | 0~65535字节 | 允许长度0~M个字节的变长二进制字符串 |
TINYBLOB | 0~255字节 | 二进制形式的短文本数据(长度为不超过255个字符) |
TINYTEXT | 0~255字节 | 短文本数据 |
BLOB | binary large object | 二进制形式的长文本数据 |
TEXT | 长文本数据 | |
MEDIUMBLOB | 0~16777215字节 | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0~16777215字节 | 中等长度文本数据 |
LOGNGBLOB | 0~4294967295字节 | 二进制形式的极大文本数据 |
LONGTEXT | 0~4294967295字节 | 极大文本数据 |
CHAR 和 VARCHAR 类型相似,均用于存于较短的字符串,主要的不同之处在于存储方式。CHAR 类型长度固定,VARCHAR 类型的长度可变。因为 VARCHAR 类型能够根据字符串的实际长度来动态改变所占字节的大小,所以在不能明确该字段具体需要多少个字符时推荐使用 VARCHAR 类型,这样可以大大地节约磁盘空间、提高存储效率。
注意事项:
CHAR 和 VARCHAR 表示的是字符的个数,而不是字节的个数。
类型 | 格式 | 取值范围 |
---|---|---|
TIME | 'HH:MM:SS' | ('-838:59:59','838:59:59') |
DATE | 'YYYY-MM-DD' | ('1000-01-01','9999-12-31') |
YEAR | YYYY | (1901,2155), 0000 |
DATETIME | 'YYYY-MM-DD HH:MM:SS' | (‘1000-01-01 00:00:00’, ‘9999-12-31 23:59:59’) |
TIMESTAMP时间戳 | ‘YYYY-MM-DD HH:MM:SS’ | (‘1970-01-01 00:00:01’ UTC, ‘2038-01-19 03:14:07’ UTC) |
TIMESTAMP类型的数据指定方式与DATETIME基本相同,两者不同之处在于以下几点:
数据的取值范围不同,TIMESTAMP类型的取值范围更小
如果我们对TIMESTAMP类型的字段没有明确赋值,或是被赋予了NULL值,MySQL会自动将该字段赋值为系统当前的日期与时间
语法:
create table 表名(
字段1 数据类型,
字段2 数据类型(长度)
);
-- 注意:最后一个字段不要加逗号,可以给字段的数据类型指定长度
表名:category
表中的字段:
分类编号:cid,整型
分类名称:cname,字符串类型,长度为20
SQL实现:
-- 切换到bjsxt01数据库
use bjsxt01;
-- 创建表
create table category(
cid int,
cname varchar(20)
);
表名:student
表中的字段:
学号:sid,整型
姓名:sname,字符串类型,长度为10
性别:sex,字符串类型,长度为1
年龄:age,整型
入学日期:createdate,日期类型
班级:clazz,字符串类型,长度为15
邮箱:email,字符串类型,长度为25
SQL实现:
create table student(
sid int,
sname varchar(10),
sex char(1),
age int,
createdate date,
clazz varchar(15),
email varchar(25)
);
-- 显示当前数据库的所有的表
show tables;
-- 显示某个表的结构 desc 表名
desc student;
-- 查看某个表完整的建表语句 show create table 表名
show create table student;
-- 删除当前数据库中的某个表 drop table 表名
drop table student;
-- 语法格式:rename table 旧表名 to 新表名;
-- 修改student表名为stu
rename table student to stu;
-- 显示所有表
show tables;
-- 语法格式:alter table 表名 add 字段名称 字段类型;
-- 案例:向学生表中添加字段address,长度为50
alter table stu add address varchar(50); -- 默认添加到最后
alter table stu add address2 varchar(50) first; -- 添加到第一个
alter table stu add address3 varchar(50) after age; -- 添加到age字段之后
-- 查看表结构
desc stu;
-- 语法格式:alter table 表名 modify 字段名称 字段类型;(修改字段类型和长度)
-- 案例:修改学生表中的字段address,长度改为30
alter table stu modify address varchar(30);
-- 语法格式:alter table 表名 change 旧字段名 新字段名 类型(长度); (修改字段名)
-- 案例:修改学生表中的字段address,修改为city, 长度为10
alter table stu change address city varchar(10);
-- 语法格式:alter table 表名 drop 字段名;
-- 案例:删除学生表中 address2 字段
alter table stu drop address2;
-- 语法格式:
-- 1. 插入部分或全部字段 insert into 表名(字段名1,字段名2,...,字段名n) values(值1,值2,...,值n);
-- 2. 插入全部字段 insert into 表名 values(值1,值2,...,值n);
-- 案例:向学生表中插入数据
-- 方式1:插入全部字段,将所有字段名都写出来
insert into stu(sid,sname,sex,age,createdate,clazz,email) values(1,'张飞','男',50,'1990-05-05','1班','[email protected]');
-- 方式2:插入全部字段,可以不写字段名
insert into stu values(2,'刘备','男',30,'1995-06-06','2班','[email protected]');
-- 方式3:插入指定字段的值
insert into stu(sid,sname,age,createdate) values(3,'赵云',19,now());
insert into stu(sid,sname,createdate) values(4,'曹操',sysdate());
insert into stu(sid,createdate) values(5,current_date());
注意事项:
-- 语法格式
-- update 表名 set 字段1=值1,字段2=值2,...,字段n=值n where 条件;
-- update 表名 set 字段1=值1,字段2=值2,...,字段n=值n; -- 慎用:不加条件会修改所有的数据
-- 案例1:将sid=1的学生性别改为女
update stu set sex='女' where sid=1;
-- 案例2:将sid=2的学生性别改为女,年龄改为30,班级改为11班
update stu set sex='女',age=30,clazz='11班' where sid=2;
-- 语法格式
-- delete from 表名 where 条件;
-- delete from 表名; -- 慎用:删除表中的所有数据
-- truncate table 表名; -- 慎用:删除表中的所有数据
-- 案例1:删除sid=5的学生信息
delete from stu where sid=5;
-- 案例2:删除stu表中所有的数据
-- 方式一:
delete from stu;(较快)
-- 方式二:
truncate table stu; -- 推荐使用(快)
-- 补:(delete 和 truncate 只删除表数据,而 drop 把表结构和表数据都删除了)
truncate 和 delete的对比:
可以对表中的数据做一些限制,从而保证数据的正确性,有效性和完整性。
违反约束的不正确数据是无法插入到表中的。
约束名 | 关键字 | 作用 |
---|---|---|
主键 | primary key | 不可重复,不能为空。即唯一+非空 |
唯一 | unique | 不可重复 |
非空 | not null | 不能为空 |
默认值 | default | 赋予默认值 |
检查(MySQL8提供) | check | 取值范围 |
自增 | AUTO_INCREMENT | 自动增加约束,约束字段的值自动递增(整数) |
外键 | foreign key | 表与表之间的关系 |
约束从作用上可以分为两类:
(1)表级约束:可以约束表中任意一个或多个字段。与列定义相互独立,不包含在列定义中。定义时候用“ , ”分隔;必须指出要约束的列的名称;
(2)列级约束:包含在列定义中,直接跟在该列的其它定义之后,用空格分隔必指定列名;
-- 语法格式:字段名 字段类型 primary key
-- 案例1:创建一个带有主键的emp表 字段 eid int ename varchar(10) esex char(1)
-- 方式一
create table emp(
eid int primary key, -- 设置主键 非空唯一
ename varchar(10),
esex char(1)
);
-- 方式二
-- 删除emp表
drop table emp;
create table emp(
eid int,
ename varchar(10),
esex char(1),
primary key(eid) -- 指定主键为eid字段
);
-- 方式三
-- 删除emp表
drop table emp;
create table emp(
eid int,
ename varchar(10),
esex char(1)
);
-- 创建表时不指定主键,然后通过DDL语句进行设置
alter table emp add primary key(eid);
-- 插入正常数据
insert into emp values(1,"宋江","男");
-- 插入一条数据,主键为空
insert into emp values(null,"李逵","男");
-- Column 'eid' cannot be NULL 主键不能为空
-- 插入一条数据,主键重复
insert into emp values(1,"孙二娘","女");
-- Duplicate entry '1' for key 'emp.PRIMARY' 主键冲突
-- 使用DDL 删除表中的主键约束
alter table emp drop primary key;
-- 查看表结构
desc emp;
-- 删除唯一约束(了解)
-- 添加了唯一约束为 eid int not null, 通过设置字段属性删除唯一约束
alter table emp modify eid int;
自己添加数据可能出现重复,我们通常希望在每次插入新纪录时,数据库自动生成主键字段的值。
-- 语法格式:关键字 auto_increment 表示自增长(字段类型必须为整数类型)
-- 案例:为emp表eid字段添加主键约束,并设置为自增
-- 创建主键自增的emp表
drop table emp;
create table emp(
eid int primary key auto_increment,
ename varchar(10),
esex char(1)
);
-- 测试主键自增
insert into emp values(null,'张三','男');
insert into emp values(default,'李四','男');
insert into emp(ename, esex) values('王五','男);
-- 语法格式:字段名 字段类型 not null
-- 案例:创建emp表,eid为主键约束,自增,ename为非空约束
-- 删除存在的emp表
drop table emp;
create table emp(
eid int primary key auto_increment,
ename varchar(10) not null,
esex char(1)
);
-- 测试非空约束
insert into emp values(default,null,'n');
-- Column 'ename' cannot be null ename不能为空
-- 语法格式:字段名 字段类型 unique
-- 案例:emp表 eid 主键约束,自增 ename 非空约束 esex 唯一约束
-- 删除存在的emp表
drop table emp;
create table emp(
eid int primary key auto_increment,
ename varchar(10) not null,
esex char(1) unique
);
-- 测试唯一约束 添加两个性别为男
insert into emp values(default,'zs','男');
insert into emp values(default,'lisi','男');
-- Duplicate entry 'n' for key 'emp.esex' esex重复
-- 语法格式:字段名 字段类型 default '值'
-- 案例:emp表 eid 主键约束,自增 ename 非空约束 esex 默认值'男'
-- 删除存在的emp表
drop table emp;
create table emp(
eid int primary key auto_increment,
ename varchar(10) not null,
esex char(1) default '男'
);
-- 查看emp表结构
desc emp;
-- 测试默认值约束
insert into emp values(default,'zs',default);
-- 错误用法
insert into emp values(default,'zs',null);
语法格式:
字段名 字段类型 check(字段='值' or 字段='值')
字段名 字段类型 check(字段>n or 字段n and 字段
案例:emp表 eid 主键约束,自增 ename 非空约束 esex 默认值'男'并检查 男|女
-- 删除存在的emp表
drop table emp;
create table emp(
eid int primary key auto_increment,
ename varchar(10) not null,
esex char(1) default '男' check(esex='男' or esex='女')
);
-- 查看emp表结构
desc emp;
-- 测试检查约束
insert into emp values(default,'lisi','n');
-- Check constraint 'emp_chk_1' is violated 不符合字段要求
-- 表级约束
CREATE table stu4(
sid int auto_increment,
sname VARCHAR(255),
sex char(1),
age int,
email CARCHAR(255),
constraint pk_stu3 primary key(sid),
constraint uk_stu3_email unique(email),
constraint ck_stu3_sex check(sex='男' or sex='女'),
constraint ck_stu3_age check(age>18 and age<30)
);
另外非空和默认只能用列级约束
-- 删除检查约束
ALTER TABLE stu7 DROP CHECK ck_stu4_sex;
-- 删除唯一约束
ALTER TABLE stu7 DROP index uk_stu4_email;
-- 删除主键约束
ALTER TABLE stu7 DROP primary key;
需求1:创建数据库bjsxt01
需求2:创建数据库表student
需求3:添加五条测试数据
需求4:删除编号为1的学生信息
需求5:修改编号为2,性别改为相反
需求6:验证表中的约束
-- 创建数据库
create database bjsxt01;
-- 切换到指定的数据库
use bjsxt01;
-- 删除学生表
drop table student;
-- 创建学生表
create table student(
id int primary key auto_increment comment '学号', -- 学号是主键 = 不能为空 + 唯一
name varchar(30) not null comment '姓名', -- 姓名不能为空
age int not null check(age>=1 and age<=150) comment '年龄', -- 年龄 不能为空 检查 年龄在1-150岁之间
sex char(1) default '男' check(sex='男' or sex='女') comment '性别', -- 性别默认值是男 检查 男|女
hiredate date comment '入学日期',
email varchar(50) unique comment '邮箱' -- Email唯一
);
-- 查看表结构
desc student;
-- 插入数据
insert into student values(default,'吕布',20,'男','2000-02-02','[email protected]');
-- 插入多条数据
insert into student values(default,'宋江',30,'男','2001-02-02','[email protected]'),(default,'貂蝉',30,'女','2010-03-02','[email protected]');
-- 查看数据
select * from student;
-- 删除编号为1的数据
delete from student where id=1;
-- 修改编号为2的数据,性别改为相反的
update student set sex='女' where id=2;
-- 验证主键约束 1062 - Duplicate entry '3' for key 'PRIMARY'
insert into student values(3,'tom',30,'男','2001-02-02','[email protected]');
-- 验证非空约束 1048 - Column 'name' cannot be null
insert into student values(default,null,30,'男','2001-02-02','[email protected]');
-- 验证检查约束 3819 - Check constraint 'student_chk_2' is violated
insert into student values(default,'关羽',30,'中','2001-02-02','[email protected]');
-- 验证唯一约束 1062 - Duplicate entry '[email protected]' for key 'email'
insert into student values(default,'伊藤舞雪',30,'男','2001-02-02','[email protected]');