2.MySQL数据库操作
一.MySQL数据库介绍
数据库目前标准指令集是SQL,即结构化查询语言。SQL语言主要由以下几部分组成
DDL(数据定义语言):用来建立数据库、数据库对象和定义字段,如create、alter、drop。
DML(数据操纵语言):用来插入、删除和修改数据库中的数据,如insert、update、delete。
DQL(数据查询语言):用来查询数据库中的数据,如select,show。
DCL(数据控制语言):用来控制数据库组件的存取许可、存取权限等,如commit、rollback、grant、revoke。
二.数据库操作
1.系统数据库
经初始化后的MySQL服务器,默认建立了四个数据库:sys、mysql、information_schema、performance_schema。
information_schema:虚拟库,不占磁盘空间,存储的是数据库启动后的一些参数,如用户表信息、列信息、权限信息、字符信息等
performance_schema:主要用于收集数据库服务器性能参数,记录处理查询请求时发生的各种事件、锁等现象
mysql:授权库,主要存储系统用户的权限信息
sys:主要用于存储系统性能信息和监控数据,对数据库的性能优化和故障排除具有关键作用
2.数据库操作
2.1创建数据库
语法:
mysql>create database 数据库名;
2.2数据库命名规则
可以有字母、数字、下划线、@、#、$
区分大小写
唯一性
不能使用关键字,如create、select
不能单独使用数字
最长128位
2.3选择数据库
语法:
mysql>USE 数据库名;
2.4查看数据库
mysql>show databases; (查看当前数据库中有哪些表)
mysql>show create database db1; (显示创建名为db1的数据库时所使用的SQL语句)
mysql>select database(); (返回当前选中的数据库名称)
2.5删除数据库
mysql>drop database 数据库名;
三.MySQL表操作
1.表介绍
库相当于文件夹,而表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有相应的标题,称为表的字段
例:
ID | name | age | sex |
1 | 张三 | 18 | male |
2 | 李四 | 68 | female |
3 | 王五 | 20 | male |
id、name、age、sex称为字段,其余的,一行内容称为一条数据记录。
2.查看表
使用show tables查看当前所在的数据库中包含的表。操作之前,需要先使用use语句切换到所使用的数据库。
mysql>use msyql;
mysql>show tables;
3.创建表
3.1语法
mysql>create table 表名 (字段名1 类型[(宽度) 约束条件],字段名2 类型[(宽度) 约束条件],字段名3 类型[(宽度) 约束条件];
注意:
a.在同一张表中,字段名是不能相同的
b.宽度和约束条件可选
c.字段名和类型是必须的,字段的类型宽度和约束条件是可选项
d.表中最后一个字段不要加逗号
3.2类型介绍
表内存放的数据有不同的类型,类似于使用excel存储数据时也需要设置的数据类型,每种数据类型都有自己的宽度,但宽度是可选的,不设置宽度时,会使用字段的默认宽度。
MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串类型。对于约束数据的类型有很大帮助
数值类型:
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
INT | 4字节 | (-2147483648,2147483647) | (0,4294967295) | 大整数值 |
DOUBLE | 8字节 | (-1797E+308,-222E-308) | (0,222E-308,1797E+308) | 双精度浮点数值 |
DOUBLE(M,D) | 8个字节,M表示长度,D表示小数位数 | 同上,受M和D的约束DOUBLE(5,2)-999.99-999.99 | 同上,受M和D的约束 | 双精度浮点数值 |
DECIMAL(M,D) | DECIMAL(M,D) | 依赖于M和D的值,M最大值为65 | 依赖于M和D的值,M最大值为65 | 小数值 |
日期类型:
类型 | 大小 | 范围 | 格式 | 用途 |
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | ‘838:59:59'/838:59:59’ | HH:MM:SS | 时间值或持续时间 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
TIMESTAMP | 4 | 1970-01-01 00:00:00/2038 结束时间是第 2147483647 秒北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日凌晨03:14:07 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
字符串类型:
类型 | 大小 | 用途 |
CHAR | 0-255字符 | 定长字符串 char(10) 10个字符 |
VARCHAR | 0-65535 字节 | 变长字符串 varchar(10) 10个字符 |
BLOB(binarylarge object) | 0-65535字节 | 二进制形式的长文本数据 |
TEXT | 0-65535字节 | 长文本数据 |
3.3约束条件
约束条件与数据类型的宽度一样,都是可选参数,类似于使用excel存储数据时,可以利用excel的公示限制员工ID列:禁止重复值,且不能为空
约束条件作用:用于保证数据的完整性和一致性,只要分为:
约束条件 | 说明 |
PRIMARY KEY (PK) | 标识该字段为该表的主键,可以唯一的标识记录 |
FOREIGN KEY(FK) | 标识该字段为该表的外键 |
NOT NULL | 标识该字段不能为空 |
UNIQUE KEY (UK) | 标识该字段的值是唯一的 |
AUTO_INCREMENT | 标识该字段的值自动增长(整数类型而且为主键) |
DEFAULT | 为该字段设置默认值 |
UNSIGNED | 无符号 |
ZEROFILL | 使用 0填充 |
ENMU () | 限制字段可以存储的值集合 |
3.4创建表示例
mysql>create database db1; (创建db1库)
msyql>use db1; (进入db1库)
msyql>create table t1(id int,name varchar(50), age int(3), sex enum('male','female'));
mysql>show tables;
4.查看表结构
DESCRIBE语句:用于显示表的结构,即组成表的各字段(列)的信息。需要指定“数据库名.表名”作为参数;若只指定表名参数,则需先通过USE语句切换到目标数据库
mysql>describe t1; (describe可简写成desc)
查看详细表结构或者创建表所使用的语句可以执行show create table t1\G;(查看表详细结构),可以加\G,表示以长格式展示结果
5.修改表
5.1修改表名
mysql>alter 表名 rename 新表名;
5.2增加字段
语法:
ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件],ADD字段名 数据类型 [完整性约束条件...];
ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件] FLRST;
ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件] AFTER 字段名;
5.3删除字段
语法:
ALTER TABLE 表名 DROP 字段名;
5.4修改字段
ALTER TABLE 表名 MODIFY 字段名 数据类型 [完整性约束条件...];
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件...];
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件...];
6.复制表
只复制表结构,不复制表中数据
mysql>create table t3 like t2;
复制表结构+记录(key不会复制:主键、外键和索引)
create table t4 select * from t2;
7.删除表
删除数据库中的表,需要指定“数据库名.表名”作为参数;若只指定表名参数,则需先通过执行“USE”语句切换到目标数据库
语法:
mysql>drop table t2;
msyql>drop table db1.t3;
四.MySQL数据操作
1.介绍
在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包括使用INSERT实现数据的插入、使用UPDATE实现数据的更新、使用DELETE实现数据的删除、使用SELECT查询数据
创建示例表
msyql>use db1; (进入db1库)
msyql>create table t1(id int,name varchar(50),age int(3),sex enum('male','female'));
mysql>show tables;
2.插入数据INSERT
insert into 语句:用于向表中插入新的数据记录
格式:insert into 表名 values(值1,值2,值3....);
指定字段插入数据:insert into 表名(字段1,字段2,字段3...) values(值1,值2,值3..);
插入多条记录:insert into 表名 values(值1,值2,值3....),(值1,值2,值3....),(值1,值2,值3....);
3.删除数据insert
delete语句:用于删除表中指定的数据记录
语法:delete from 表名 where 条件表达式
例:delete from t1 where id=1;
4.更新数据insert
update语句:用于修改、更新表中的数据记录
语法:update 表名 set 字段名 1=字段值 1[,字段名 2=字段值 2] where 条件表达式
例:update t1 set age=100 where name="wangwu";
需要注意的是,在执行update、delete语句时,通常都带where条件,否则会修改或删除所有的记录,是非常危险的操作
5.查询数据INSERT
select语句:用于从指定的表中查找符合条件的数据记录
1.单表查询
语法:
select 字段1,字段2... from 表名
where 条件
group by 字段
having 筛选
order by 字段
linit 限制条数
1.2关键字执行的优先级
from>where>group by>having>select>order by>limit
说明:
1.找到表:from
2.拿着where指定的约束条件,去文件/表中取出一条条记录
3.将取出的一条条记录进行分组group by,如果没有group by,则整体作为一组
4.将分组的结果进行having过滤
5.执行select
6.将结果按条件排序:order by
7.限制结果的显示条数:limit
1.3where条件
作用是通过指定条件从表中过滤出符合条件的记录,可应用于select、update、delete等语句,控制操作范围
where字句中可以使用:
1.比较运算符:> < >= <= <> !=
2.between 80 and 100 值在10到20之间
3.in(80,90,100)值是10或20或30
4.like 'egon%'
pattern 可以是%或_,
%表示多字符
_表示一个字符
5.逻辑运算符:在多个条件直接可以使用逻辑运算符and or not
例:
薪资大于10000的人姓名
select name, salary from renyuan where salary > 10000;
不是403办公室的人姓名
select name,office from renyuan where office !=403;
薪资在10000至15000之间的人姓名
select name,salary from renyuan where salary between 10000 and 15000;
薪资是9000或10000或30000的人姓名
select name,salary from renyuan where salary in(9000,10000,30000);
名字以“程”开头的人的信息
select * from renyuan where name like "程咬_";
select * from renyuan where name like "程%";
薪资17000或者办公室是403的人
select * from renyuan where office=403 or salary=17000;
薪资17000并且办公室是403的人
select * from renyuan where office=403 and salary=17000;
薪资不是9000或10000或30000的人姓名
select name,salary from renyuan where salary not in(9000,10000,30000);
1.4group by 分组
(1)分组
分组指的是:将所有记录按照某个相同的字段进行归类,比如针对员工信息表职位分组,或者按照性别进行分组
例:
select * from renyuan group by sex; (以sex分组,查看除了sex以外的字段会报错)
select sex from renyuan group by sex;
但是只查看sex字段没有任何意义,因为需要的是组内信息,所以结合聚合函数查看
(2)聚合函数:count() avg() max() min() sum()
sount():计数
例:计算男生和女生的人数
命令:select sex,count(*) from renyuan group by sex;
avg():平均数
例:每个岗位的平均薪资
命令:select post,avg(salary) from renyuan group by post;
max():最大值
例:每个岗位的最高薪资
命令:select post,max(salary) from renyuan group by post;
min():最小值
例:每个岗位的最高薪资
命令:select post,min(salary) from renyuan group by post;
sum():总和
例:每个岗位的薪资总和
命令:select post,sum(salary) from renyuan group by post;
1.5having过滤
having和where区别:
执行优先级从高到低:where>groupby>having
Where 发生在分组 group by 之前,因而 Where 中可以有任意字段,但是绝对不能使用聚合函数。
Having 发生在分组 group by之后,因而 Having 中可以使用分组的字段,无法直接取到其他字段,但可以使用聚合函数
例:有哪些岗位是平均工资大于 10000的
命令:select post,avg(salary) from renyuan group by post having avg(salary)>10000;
1.6order by排序
使用 SELECT 语句可以将需要的数据从 MySQL 数据库中查询出来,如果对查询的结果进行排序,该如何去实现呢?可以使用0RDERBY 语句来完成排序,并最终将排序后的结果返回给用户
排序的关键字可以使用 ASC或者 DESC。ASC 是按照升序进行排序的,是默认的排序方式,即 ASC 可以省略。SELECT语句中如果没有指定具体的排序方式,则默认按 ASC 方式进行排序。DESC是按降序方式进行排列
命令:select * from renyuan order by id asc; (默认是正序asc可以忽略)
select * from renyuan order by id desc; (倒叙)
1.7limit限制结果条目
在使用 MySQL SELECT 语句进行查询时,结果集返回的是所有匹配的记录。有时候仅需要返回第一行或者前几行,这时候就需要用到LIMIT 子句
例:倒叙排列后仅显示第一行
命令:select * from renyuan order by id desc limit 1;
1.8正则匹配
MySQL 正则表达式通常是在检索数据库记录的时候,根据指定的匹配模式匹配记录中符合要求的特殊字符串。MySQL的正则表达式使用 REGEXP 这个关键字来指定正则表达式的匹配模式
例:Name 是1开头的姓名
命令:select * from renyuan where name regexp " ^1";
例:Name 是u结尾的姓名
命令:select * from renyuan where name regexp "u$";
例:Name 是 wan 和 wu 之间至少1个g的姓名
命令:select * from renyuan where name regexp "wangtwu";