-- 创建数据库
create database review character set 字符集
create database if not exists review charset 字符集 collate 比较规则
-- 查看表的创建细节
show create database review
-- 修改数据库
alter database review charset utf8mb4 collate utf8mb4_general_ci
-- 使用数据库
use review
-- 删除数据库
drop database if exists review
排序规则:定义在指定字符集下不同字符的比较规则,若没有指定会有一个默认的排序规则。
-- 创建表
create table if not exists test_table1
(
字段名1 数据类型 [约束条件] [默认值],
字段名1 数据类型 [约束条件] [默认值],
...
);
-- 查看表的创建信息
show create table test_table1;
-- 显示表的结构
desc test_table1;
-- 添加表字段 [first|after]表示添加在表的某个字段之前或之后
alter table test_table1 add column 字段名 字段类型 [约束条件] [默认值] [first|after] 字段名;
-- 修改表字段
alter table test_table1 modify 字段名 数据类型 [约束条件] [默认值];
-- 重命名字段
alter table test_table1 change column 字段名 新字段名 新数据类型 [约束条件] [默认值];
-- 删除一个列
alter table test_table1 drop column password;
-- 修改表名
rename table test_table1 to test_table;
-- 清空表
truncate table test_table;
-- 删除表
drop table if exists test_table;
注意:约束条件和默认值是可选项。字段名和数据类型是必选项。
insert into 表名(字段1,字段2,...)
values
(value1, value2),
(value1, value2);
delete from 表名 [删除条件]
update 表名 set 字段名1=value1, 字段名2=value2,.... [更新条件]
select [查询字段] from 表名 [查询条件]
-- 去重
select distinct [查询字段] from 表名 [查询条件]
使用order by关键字进行排序,asc代表升序,desc代表降序。
-- 单列排序
select .... from 表名 order by 字段名;
-- 多列排序(如果字段名1的值能区分出顺序,就不会去比较字段2的值)
select ... from 表名 order by 字段名1 字段名2 asc;
基本语法:limit [位置偏移量], 行数。
-- 显示查询的前10条数据
select * from test_table limit 10;
-- 指定偏移量10(相当于偏移10条元素,从第11条数据开始输出10条)
select * from test_table limit 10,10;
-- 分页公式:每页展示18条数据。显示第n页的数据。
select * from test_table limit (n-1)*18,18
from -> on -> join -> where -> group by -> having -> select -> distinct -> order by -> limit;
作用于一组数据,并对该组数据返回一个值。通常使用在经过分组的数据之后。
聚合函数的注意事项:
having:通过group by进行了分组,根据一些条件筛选想要的分组,就可以使用having,主要起过滤分组的作用。
使用having的前提条件:
在一条查询语句中内嵌一条查询语句,内层查询结果作为外层查询的查询条件。
需求:例如有一张表user字段分别为姓名、年龄,查询比obstar年龄更大的有谁。
select name, age from user where age>(select age from user where name = 'obstar')
单比较操作符:
多行比较操作符:
= any:和结果集中的任意一个相等即为真。
>any:比结果集中的任意一个大即为真。
<> any:和结果集中的任意一个不相等即为真。
= all:和结果集中的所有相等即为真。
> all:大于结果集中的所有即为真
<> all:和结果集中的所有不相等即为真
多个表或单张表之间进行关联查询。一般是多张表之间存在关联关系使用的方式。
内连接(INNER JOIN):它返回两个表中匹配的行。只有当两个表中的指定列具有相同的值时,它才会返回行。
外连接(OUTER JOIN):即使其中一个表中没有匹配的行。根据你选择的类型(左、右或全外连接),未匹配的行将包含NULL值。
联合连接(UNION ):操作用于组合两个或多个SELECT语句的结果集,但每个SELECT语句必须具有相同的数量的列和相似的数据类型。它默认删除重复的行,但可以使用UNION ALL
来保留重复的行。
需求:存在一张表student表字段分别为st_id、st_name,grade,存在一张表成绩表(scores),字段分别为st_id、sc_type、sc_score。查询名为obstar同学的成绩。
create table students(
st_id int,
st_name varchar(16),
grade varchar(8)
);
insert into students
values
(1, 'tom', '1'),
(2, 'jary', '2'),
(3, 'michael', '1'),
(4, 'obstar', '2');
create table scores(
st_id int,
sc_type varchar(16),
sc_score double
);
insert into scores
values
(1, '语文', 92.5),
(1, '数学', 82),
(1, '英语', 100),
(2, '语文', 80),
(2, '数学', 82),
(2, '英语', 60),
(3, '语文', 99.5),
(3, '数学', 84),
(3, '英语', 66),
(4, '语文', 88),
(4, '数学', 78),
(4, '英语', 98);
SELECT sc.sc_type, sc.sc_score, st.grade FROM students st INNER JOIN scores sc on sc.st_id = st.st_id where
st.st_id in (select st_id FROM students WHERE st_name = 'obstar');
需求:查询每个同学的总分是多少
SELECT st.st_id, st.st_name, st.grade, sa.sum FROM students st LEFT JOIN (SELECT st_id, SUM(sc_score) sum FROM scores GROUP BY st_id) sa ON st.st_id = sa.st_id;
tinyint、smallint、mediumint、int(integer)、bigint。
可选属性:
float(4字节)、double(8字节)。
decimal(M,D):表示高精度的小数,M为精度,D为标度(小数点的位数)。1<=M<=65。D必须小于M。
decimal(6,3):表示最多可以存储6为数字,其中3位是小数,最大值为999.999。
decimal在MySQL内部是以字符串的形式进行存储,这就决定了它一定是精准的。
注意:当DECIMAL类型不指定精度和标度时,其默认为DECIMAL(10,0)。当数据的精度超出了定点数类型的
精度范围时,则MySQL会进行四舍五入处理。
year、time、date、datetime、timestamp。
主键约束的字段值是唯一的且不能为空。
create table test(
phone char(11),
username char(32),
primary key(phone, username)
);
注意:一个表中只能有一个主键约束,主键约束可以由多个字段组成。
限制表中某个/多个字段值是唯一的。
create table test(
phone char(11),
username char(32),
unique(phone, username)
);
注意:在创建唯一约束的时候,如果不给唯一约束命名,就默认和列名相同。
例如有一张学生表(主表)、成绩表(从表)。成绩表中的成绩对应的一定是一个同学,因此成绩表可以设置外键约束。
create table students(
st_id int unique not null,
st_name varchar(16),
grade varchar(8)
);
create table scores(
st_id int,
sc_type varchar(16),
sc_score double,
foreign key (st_id) references students(st_id)
);
注意:从表引用的外键字段一定是主表的主键/唯一约束字段。
关键字:not null。
注意:在MySQL中,所有的数据类型都可以是null。只能对单独的字段设置为空,不能组合非空。
MySQL8.0.16版本之前可以使用check约束,但check约束对数据验证没有任何作用。添加数据时,没有任何错误或警告但是MySQL 8.0.16中可以使用check约束了。
限制字段只能为男女。
create table users (
gender char check('男' or '女')
);
限制字段值范围
create table users (
age tinyint unsigned ,
check(age<=150)
);
关键字:default。
存储引擎是组织数据的一种方式
查看数据库支持的存储引擎。
show engines;
Transactions:事务
XA:分布式事务。
Savepoints:中断点。
-- 查询系统默认存储引擎
show variables like '%storage_engine%';
-- 修改默认存储引擎
set default_storage_engine = InnoDB;
-- 永久修改 修改my.cnf文件,然后重启服务
default-storage-engine=InnoDB
-- 设置表的存储引擎
create table test(
字段名 数据类型 [约束条件] [默认值],
...
)engine = InnoDB;
-- 修改表的存储引擎(谨慎修改)
alter table test engine = MyISAM;
ransactions:事务
XA:分布式事务。
Savepoints:中断点。
-- 查询系统默认存储引擎
show variables like '%storage_engine%';
-- 修改默认存储引擎
set default_storage_engine = InnoDB;
-- 永久修改 修改my.cnf文件,然后重启服务
default-storage-engine=InnoDB
-- 设置表的存储引擎
create table test(
字段名 数据类型 [约束条件] [默认值],
...
)engine = InnoDB;
-- 修改表的存储引擎(谨慎修改)
alter table test engine = MyISAM;