一、MySQL数据库基本操作-DDL
1.1 什么是DDL
DDL(Data Definition Language),数据定义语言,该语言部分包括以下内容:
- 对数据库的常用操作
- 对表结构的常用操作
- 修改表结构
1.2 对数据库的常用操作
show databases; -- 查看所有的数据库
create database [if not exists] mydb1 [charset=utf8] -- 创建数据库
use mydb1 -- 切换(选择要操作的)数据库
drop database [if exists] mydb1; -- 删除数据库
alter database mydb1 character set utf8; -- 修改数据库编码
1.3 对表结构的常用操作
1.3.1 创建表
create table [if not exists]表名(
字段名1 类型[(宽度)] [约束条件] [comment '字段说明'],
字段名2 类型[(宽度)] [约束条件] [comment '字段说明'],
字段名3 类型[(宽度)] [约束条件] [comment '字段说明']
)[表的一些设置];
1.3.2 修改表结构格式
- 修改表添加列
alter table 表名 add 列名 类型(长度) [约束];
- 修改列名和类型
alter table 表名 change 旧列名 新列名 类型(长度) 约束;
- 修改表删除列
alter table 表名 drop 列名;
- 修改表名
rename table 表名 to 新表名;
1.3.3 其他操作
show tables; -- 查看当前数据库的所有表名称
show create table 表名; -- 查看指定某个表的创建语句
desc 表名; -- 查看表结构
drop table 表名; -- 删除表
二、MySQL数据库基本操作-DML
2.1 什么是DML
DML是指数据操作语言,英文全称是Data Manipulation Language,用来对数据库中表的数据记录进行更新。关键字:
- 插入insert
- 删除delete
- 更新update
2.2 数据插入
insert into 表 (列名1,列名2,列名3...) values (值1,值2,值3...); //向表中插入某些
insert into 表 values (值1,值2,值3...); //向表中插入所有列
2.3 数据修改
update 表名 set 字段名=值,字段名=值...;
update 表名 set 字段名=值,字段名=值... where 条件;
2.4 数据删除
delete from 表名 [where 条件];
truncate table 表名 或者 truncate 表名
delete只删除内容,而truncate类似于drop table ,可以理解为是将整个表删除,然后再创建该表
三、MySql约束
3.1 什么是约束
约束(constraint)实际上就是表中数据的限制条件,表在设计的时候加入约束的目的就是为了保证表中的记录完整性和有效性,比如用户表有些列的值(手机号)不能为空,有些列的值(身份证号)不能重复,可以分为下面几类
- 主键约束(primary key) PK
- 自增长约束(auto_increment)
- 非空约束(not null)
- 唯一性约束(unique)
- 默认约束(default)
- 零填充约束(zerofill)
- 外键约束(foreign key) FK
3.2 主键约束
3.2.1 主键约束的概念
MySQL主键约束(primary key)是一个列或者多个列的组合,其值能唯一地标识表中的每一行,方便在RDBMS中尽快的找到某一行。主键约束相当于 唯一约束 + 非空约束 的组合,主键约束列不允许重复,也不允许出现空值。每个表最多只允许一个主键,当创建主键的约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。
3.2.2 操作——添加单列主键
创建单列主键有两种方式,一种是在定义字段的同时指定主键,一种是定义完字段之后指定主键
方法1
-- 在 create table 语句中,通过 PRIMARY KEY 关键字来指定主键。
-- 在定义字段的同时指定主键,语法格式如下:
create table 表名(
...
<字段名> <数据类型> primary key -- 这个字段非空且唯一
...
)
方法2
-- 在定义字段之后再指定主键,语法格式如下:
create table 表名(
...
[constraint <约束名>] primary key [字段名]
);
3.2.3 操作——添加多列主键(联合主键)
所谓的联合主键,就是这个主键是由一张表中多个字段组成的。
当主键是由多个字段组成时,不能直接在字段名后面声明主键约束。
一张表只能有一个主键,联合主键也是一个主键
create table 表名(
...
primary key (字段1,字段2,…,字段n)
);
联合主键的每列都不能为空,且联合内容不能完全一样
3.2.4 通过修改表结构添加主键
主键约束不仅可以在创建表的同时创建,也可以在修改表时添加。
create table 表名(
...
);
alter table <表名> add primary key(字段列表);
3.2.5 删除主键约束
一个表中不需要主键约束时,就需要从表中将其删除。删除主键约束的方法要比创建主键约束容易的多。
alter table <数据表名> drop primary key;
3.3 自增长约束
3.3.1 自增长约束的概念
在 MySQL 中,当主键定义为自增长(auto_increment)后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值。每增加一条记录,主键会自动以相同的步长进行增长。
默认情况下,auto_increment的初始值是 1,每新增一条记录,字段值自动加 1。
一个表中只能有一个字段使用 auto_increment约束,且该字段必须有唯一索引,以避免序号重复(即为主键或主键的一部分)。
auto_increment约束的字段必须具备 NOT NULL 属性。
auto_increment约束的字段只能是整数类型(TINYINT、SMALLINT、INT、BIGINT 等。
auto_increment约束字段的最大值受该字段的数据类型约束,如果达到上限,auto_increment就会失效。
3.3.2 自增长约束的赋予
字段名 数据类型 auto_increment
3.3.3 指定自增字段初始值
如果第一条记录设置了该字段的初始值,那么新增加的记录就从这个初始值开始自增。例如,如果表中插入的第一条记录的 id 值设置为 5,那么再插入记录时,id 值就会从 5 开始往上增加
-- 方式1,创建表时指定
create table t_user2 (
id int primary key auto_increment,
name varchar(20)
)auto_increment=100;
-- 方式2,创建表之后指定
create table t_user3 (
id int primary key auto_increment,
name varchar(20)
);
alter table t_user2 auto_increment=100;
删除表delete和truncate在删除后自增列的变化
delete数据之后自动增长从断点开始
truncate数据之后自动增长从默认起始值开始
3.4 非空约束
MySQL 非空约束(not null)指字段的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统就会报错。
# 方式1:
<字段名><数据类型> not null;
# 方式2:
alter table 表名 modify 字段 类型 not null;
删除非空约束
-- alter table 表名 modify 字段 类型
alter table t_user7 modify name varchar(20) ;
alter table t_user7 modify address varchar(20) ;
3.5 唯一约束
唯一约束(Unique Key)是指所有记录中字段的值不能重复出现。例如,为 id 字段加上唯一性约束后,每条记录的 id 值都是唯一的,不能出现重复的情况。
# 方式1:
<字段名> <数据类型> unique
# 方式2:
alter table 表名 add constraint 约束名 unique(列);
注意:NULL和任何值都不相同,甚至NULL和NULL也不相同
-- 创建表后指定
create table t_user9 (
id int ,
name varchar(20) ,
phone_number varchar(20) -- 指定唯一约束
);
alter table t_user9 add constraint unique_ph unique(phone_number);
删除唯一约束:
-- alter table <表名> drop index <唯一约束名>;
alter table t_user9 drop index unique_ph;
3.6 默认约束
MySQL 默认值约束(default)用来指定某列的默认值。
# 方式1:
<字段名> <数据类型> default <默认值>;
# 方式2:
alter table 表名 modify 列名 类型 default 默认值;
删除默认约束
-- alter table <表名> modify column <字段名> <类型> default null;
alter table t_user11 modify column address varchar(20) default null;
3.7 零填充约束(zerofill)
插入数据时,当该字段的值的长度小于定义的长度时,会在该值的前面补上相应的0。zerofill默认为int(10),当使用zerofill 时,默认会自动加unsigned(无符号)属性,使用unsigned属性后,数值范围是原值的2倍,
create table t_user12 (
id int zerofill , -- 零填充约束
name varchar(20)
);
删除零填充约束
alter table t_user12 modify id int;
四、MySQL数据库基本操作-DQL-基本查询
数据库管理系统一个重要功能就是数据查询,数据查询不应只是简单返回数据库中存储的数据,还应该根据需要对数据进行筛选以及确定数据以什么样的格式显示。MySQL提供了功能强大、灵活的语句来实现这些操作。MySQL数据库使用select语句来查询数据。
4.1 DQL的基本语法
select
[all|distinct]
<目标列的表达式1> [别名],
<目标列的表达式2> [别名]...
from <表名或视图名> [别名],<表名或视图名> [别名]...
[where<条件表达式>]
[group by <列名> -- 分组
[having <条件表达式>]] -- 分组后的结果再筛选
[order by <列名> [asc|desc]] -- 排序
[limit <数字或者列表>]; -- 对最终的结果筛选
简化版:
select *|列名 from 表 where 条件
4.2 简单查询
例子
-- 1.查询所有的商品.
select * from product;
-- 2.查询商品名和商品价格.
select pname,price from product;
-- 3.别名查询.使用的关键字是as(as可以省略的).
-- 3.1表别名:
select * from product as p;
-- 3.2列别名:
select pname as pn from product;
-- 4.去掉重复值.
select distinct price from product;
-- 5.查询结果是表达式(运算查询):将所有商品的价格+10元进行显示.
select pname,price+10 from product;
4.3 条件查询
例子
-- 查询商品名称为“海尔洗衣机”的商品所有信息:
select * from product where pname = '海尔洗衣机';
-- 查询价格为800商品
select * from product where price = 800;
-- 查询价格不是800的所有商品
select * from product where price != 800;
select * from product where price <> 800;
select * from product where not(price = 800);
-- 查询商品价格大于60元的所有商品信息
select * from product where price > 60;
-- 查询商品价格在200到1000之间所有商品
select * from product where price >= 200 and price <=1000;
select * from product where price between 200 and 1000;
4.4 运算符查询
例子
-- 查询商品价格是200或800的所有商品
select * from product where price = 200 or price = 800;
select * from product where price in (200,800);
-- 查询含有‘裤'字的所有商品
select * from product where pname like '%裤%'; -- 百分号匹配任意字符
-- 查询以'海'开头的所有商品
select * from product where pname like '海%';
-- 查询第二个字为'蔻'的所有商品
select * from product where pname like '_蔻%'; -- 下划线匹配单个字符
-- 查询category_id为null的商品
select * from product where category_id is null;
-- 查询category_id不为null分类的商品
select * from product where category_id is not null;
-- 使用least求最小值
select least(10, 20, 30); -- 10
select least(10, null , 30); -- null
-- 使用greatest求最大值
select greatest(10, 20, 30);
select greatest(10, null, 30); -- null
4.5 排序查询
如果我们需要对读取的数据进行排序,我们就可以使用 MySQL 的 order by 子句来设定你想按哪个字段哪种方式来进行排序,再返回搜索结果。
select
字段名1,字段名2,……
from 表名
order by 字段名1 [asc|desc],字段名2[asc|desc]…… -- 以字段名1为主,字段名2为辅
- asc代表升序,desc代表降序,如果不写默认升序
- order by用于子句中可以支持单个字段,多个字段,表达式,函数,别名
- order by子句,放在查询语句的最后面。LIMIT子句除外
例如
-- 1.使用价格排序(降序)
select * from product order by price desc;
-- 2.在价格排序(降序)的基础上,以分类排序(降序)
select * from product order by price desc,category_id asc;
-- 3.显示商品的价格(去重复),并排序(降序)
select distinct price from product order by price desc;
4.6 聚合查询
之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个单一的值;另外聚合函数会忽略空值。
聚合函数 | 作用 |
---|---|
count() | 统计指定列不为NULL的记录行数; |
sum() | 计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0 |
max() | 计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算; |
min() | 计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算; |
avg() | 计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0 |
例如
-- 1 查询商品的总条数
select count(*) from product;
-- 2 查询价格大于200商品的总条数
select count(*) from product where price > 200;
-- 3 查询分类为'c001'的所有商品的总和
select sum(price) from product where category_id = 'c001';
-- 4 查询商品的最大价格
select max(price) from product;
-- 5 查询商品的最小价格
select min(price) from product;
-- 6 查询分类为'c002'所有商品的平均价格
select avg(price) from product where category_id = 'c002';
4.7 分组查询
分组查询是指使用group by字句对查询信息进行分组。
select 字段1,字段2… from 表名 group by 分组字段 having 分组条件;
分组之后对统计结果进行筛选的话必须使用having,不能使用where
where子句用来筛选 FROM 子句中指定的操作所产生的行
group by 子句用来分组 WHERE 子句的输出。
having 子句用来从分组的结果中筛选行
例如
-- 1 统计各个分类商品的个数
select category_id ,count(*) from product group by category_id ;
-- 2.统计各个分类商品的个数,且只显示个数大于1的信息
select category_id ,count(*) from product group by category_id having count(*) > 1;
4.8 分页查询
分页查询在项目开发中常见,由于数据量很大,显示屏长度有限,因此对数据需要采取分页显示方式。例如数据共有30条,每页显示5条,第一页显示1-5条,第二页显示6-10条。
-- 方式1-显示前n条
select 字段1,字段2... from 表明 limit n
-- 方式2-分页显示
select 字段1,字段2... from 表明 limit m,n
-- m: 整数,表示从第几条索引开始,计算方式 (当前页-1)*每页显示条数
-- n: 整数,表示查询多少条数据
例如
-- 查询product表的前5条记录
select * from product limit 5
-- 从第4条开始显示,显示5条
select * from product limit 3,5
4.9 其他
- INSERT INTO SELECT语句
将一张表的数据导入到另一张表中,可以使用INSERT INTO SELECT语句 。
insert into Table2(field1,field2,…) select value1,value2,… from Table1 或者:
insert into Table2 select * from Table1
要求目标表Table2必须存在
- SELECT INTO FROM语句
将一张表的数据导入到另一张表中,有两种选择 SELECT INTO 和 INSERT INTO SELECT 。
SELECT vale1, value2 into Table2 from Table1
要求目标表Table2不存在,因为在插入时会自动创建表Table2,并将Table1中指定字段数据复制到Table2中。
4.10 正则表达式
正则表达式(regular expression)描述了一种字符串匹配的规则,正则表达式本身就是一个字符串,使用这个字符串来描述、用来定义匹配规则,匹配一系列符合某个句法规则的字符串。在开发中,正则表达式通常被用来检索、替换那些符合某个规则的文本。
MySQL通过REGEXP关键字支持正则表达式进行字符串匹配。
模式 | 描述 |
---|---|
^ | 匹配输入字符串的开始位置。 |
$ | 匹配输入字符串的结束位置。 |
. | 匹配除 "\n" 之外的任何单个字符。 |
[...] | 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。 |
[^...] | 负值字符集合。匹配未包含的任意字符。例如, '[ ^ abc]' 可以匹配 "plain" 中的'p'。 |
p1|p2|p3 | 匹配 p1 或 p2 或 p3。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。 |
* | 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。 |
+ | 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。 |
{n} | n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。 |
{n,m} | m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。 |
例子
-- ^ 在字符串开始处进行匹配
-- 显示以海开头的所有商品
SELECT * FROM product WHERE pname REGEXP '^海';