)
课程介绍数据库DataBaseDB是存储和管理数据的仓库。数据库管理系统DataBase Management System(DBMS)操纵和管理数据库的大型软件。SQLStructured Query Language操作关系型数据库的编程语言定义了一套操作关系型数据库统一标准。一、MySQL概述1、安装1解压并添加环境变量文件解压后放到自己的路径中添加环境变量path环境变量中验证2对mysql初始化管理员方式打开命令行输入mysqld --initialize-insecure此时mysql的安装目录出现这个文件夹存放mysql的数据文件3注册MySQL服务管理员方式命令行输入mysqld -install4启动MySQL服务管理员方式命令行输入net start mysql启动服务管理员方式命令行输入net stop mysql停止服务5修改默认账户密码mysqladmin -u root password root6登录MySQL管理员方式命令行输入mysql -uroot -proot语法语法mysql-u用户名-p密码[-h数据库服务器IP地址 -P端口号] 默认端口号为33067卸载管理员方式命令行输入net stop mysqlmysqld -remove mysql2、数据库模型关系型数据库建立在关系模型基础上由多张相互连接的二维表组成的数据库。二维表有行有列的表特点 使用表存储数据格式统一便于维护。 使用SQL语言操作标准统一使用方便可用于复杂查询。mysql中创建数据库create database db01;此时在mysql的安装目录的data文件夹中就会出现db01的文件夹代表该数据库二、SQL语句SQL一门操作关系型数据库的编程语言定义操作所有关系型数据库的统一标准。1、数据库操作--查询所有数据库 show databases; --查询当前数据库 select database(); --使用/切换数据库 use 数据库名 --创建数据库 create database[if not exists]数据库名[default charset utf8mb4]; --删除数据库 drop database[if exists]数据库名;注意(不常用) 上述语法中的database也可以替换成schema。如:create schema dbo1;MySQL8版本中默认字符集为utf8mb4。2、图形化工具命令行无提示、操作繁琐、无历史记录常用的图形化工具介绍DataGrip是JetBrains旗下的一款数据库管理工具是管理和开发MySQL、Oracle、PostgreSQL的理想解决方案。官网DataGrip | JetBrains for Data1安装安装完成之后双击安装.bat输入激活码点击Activate激活continue2创建项目创建项目输入项目名字创建连接下载驱动测试连接点击Apply和OK3界面使用界面介绍若查询语句不小心关掉了在这里重新打开新建数据库在这里删除数据库同时刷新一下3、表操作-创建1语法最后一个字段结尾不要加逗号create table tablename( 字段1 字段类型[约束][comment字段1注释], 字段2 字段类型[约束][comment字段2注释] )[comment表注释];在正在使用的数据库中创建表例如db02-- 创建表(无约束) create table user( id int comment ID, 唯一标识, username varchar(50) comment 用户名, name varchar(10) comment 姓名, age int comment 年龄, gender char(1) comment 性别 ) comment 用户信息表;此时在db02中会创建一个表里面有这5个字段鼠标悬浮可以查看备注信息2插入数据4、表操作-约束约束约束是作用于表中字段上的规则用于限制存储在表中的数据。目的保证数据库中数据的正确性、有效性和完整性。1语法非空约束限制该字段值不能为null not null 唯一约束保证字段的所有数据都是唯一、不重复的 unique 主键约束主键是一行数据的唯一标识要求非空且唯一 primary key 默认约束保存数据时如果未指定该字段值则采用默认值 default 外键约束让两张表的数据建立连接保证数据的一致性和完整性 foreign key主键自增关键字auto_increment-- 创建表(约束) create table user( id int primary key auto_increment comment ID, 唯一标识, -- 主键约束 auto_increment username varchar(50) not null unique comment 用户名, -- 非空 唯一 name varchar(10) not null comment 姓名, -- 非空 age int comment 年龄, gender char(1) default 男 comment 性别 -- 默认 ) comment 用户信息表;2图形化图标解释右下角钥匙代表主键约束左边蓝框代表唯一约束左下角圆圈代表非空约束5、表操作-数据类型1数值类型类型大小(byte)有符号(SIGNED)范围无符号(UNSIGNED)范围描述备注tinyint1(-128127)(0255)小整数值smallint2(-3276832767)(065535)大整数值mediumint3(-83886088388607)(016777215)大整数值int4(-21474836482147483647)(04294967295)大整数值bigint8(-2^632^63-1)(02^64-1)极大整数值float4(-3.402823466 E383.402823466351 E38)0 和 (1.175494351 E-383.402823466 E38)单精度浮点数值float(5,2)5表示整个数字长度2 表示小数位个数double8(-1.7976931348623157 E3081.7976931348623157 E308)0 和 (2.2250738585072014 E-3081.7976931348623157 E308)双精度浮点数值double(5,2)5表示整个数字长度2 表示小数位个decimal小数值(精度更高)decimal(5,2)5表示整个数字长度2 表示小数位个数数值类型的选取原则: 在满足业务需求的前提下, 尽可能选择占用磁盘空间小的数据类型例如age tinyint unsignedid int unsigned2字符串类型类型大小描述char0-255 bytes定长字符串varchar0-65535 bytes变长字符串tinyblob0-255 bytes不超过255个字符的二进制数据tinytext0-255 bytes短文本字符串blob0-65 535 bytes二进制形式的长文本数据text0-65 535 bytes长文本数据mediumblob0-16 777 215 bytes二进制形式的中等长度文本数据mediumtext0-16 777 215 bytes中等长度文本数据longblob0-4 294 967 295 bytes二进制形式的极大文本数据longtext0-4 294 967 295 bytes极大文本数据以lob为结尾的是以二进制形式存储的以text为结尾的是以普通文本存储的数据库开发中主要用到前两个字符串类型char(10):固定占用10个字符空间; 存储A, 占用10个空间; 存储ABC, 占用10个空间性能略高、浪费磁盘空间varchar(10):最多占用10个字符空间; 存储A, 占用1个空间; 存储ABC, 占用3个空间节约磁盘空间、性能略低例如username varchar(50)idcard char(18)phone char(11)3日期时间类型类型大小(byte)范围格式描述date31000-01-01 至 9999-12-31YYYY-MM-DD日期值time3-838:59:59 至 838:59:59HH:MM:SS时间值或持续时间year11901 至 2155YYYY年份值datetime81000-01-01 00:00:00 至 9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS混合日期和时间值timestamp41970-01-01 00:00:01 至 2038-01-19 03:14:07YYYY-MM-DD HH:MM:SS混合日期和时间值时间戳开发中常用到date和datetime类型例如bithday dateoperateTime datetime4小结1.数值类型在定义的时候后面加了unsigned关键字是什么意思?unsigned表示无符号类型表示只能取o及正数不加默认是signed表示可以取负数2.char与varchar的区别是什么什么时候用char什么时候用varchar?char是定长字符串varchar是变长字符串如果一个字段的长度是固定的建议使用char如身份证号、手机号如果一个字段的长度不是固定的建议使用varchar如用户名、姓名6、表操作-设计案例21设计表过程1.阅读并分析页面原型及需求2分析表中包含哪些字段以及字段的类型、约束3.创建表结构添加基础字段id、create_time、update_time2设计员工表-- 案例: 设计员工表 emp -- 基础字段: id 主键, create_time 创建时间, update_time 更新时间 create table emp ( id int unsigned primary key auto_increment comment ID,主键, username varchar(20) not null unique comment 用户名, password varchar(50) default 123456 comment 密码, name varchar(10) not null comment 姓名, gender tinyint unsigned not null comment 性别, 1:男, 2:女, phone char(11) not null unique comment 手机号, job tinyint unsigned comment 职位, 1:班主任, 2:讲师, 3:学工主管, 4:教研主管, 5:咨询师, salary int unsigned comment 薪资, entry_date date comment 入职日期, image varchar(300) comment 头像, create_time datetime comment 创建时间, update_time datetime comment 更新时间 ) comment 员工表;7、表操作-查询-修改-删除1语法-- 查询当前数据库的所有表 show tables; -- 查询表结构 desc 表名; -- 查询建表语句 show create table表名; -- 添加字段 alter table 表名 add 字段名类型(长度) [comment注释][约束]; -- 修改字段类型 alter table 表名 modify 字段名 新数据类型(长度); -- 修改字段名与字段类型 alter table 表名 change 旧字段名 新字段名 类型(长度)[comment注释][约束]; -- 删除字段 alter table 表名 drop column 字段名; -- 修改表名 alter table 表名 rename to 新表名; -- 删除表 -- 注意在删除表时表中的全部数据也会被删除。 drop table[if exists]表名;2案例-- 查询当前数据库所有表 show tables; -- 查看表结构 desc emp; -- 查询建表语句 show create table emp; -- 字段: 添加字段 qq varchar(13) alter table emp add qq varchar(13) comment QQ号码; -- 字段: 修改字段类型 qq varchar(15) alter table emp modify qq varchar(15) comment QQ号码; -- 字段: 修改字段名 qq - qq_num varchar(15) alter table emp change qq qq_num varchar(15) comment QQ号码; -- 字段: 删除字段 qq_num alter table emp drop column qq_num; -- 修改表名 alter table emp rename to employee; -- 删除表 drop table employee;3图形化操作鼠标悬浮自动显示建表语句修改表结构右键表新增字段字段类型三、数据操作语言DML英文全称是DataManipulationLanguage(数据操作语言)用来对数据库中表的数据记录进行增、删、改操作。添加数据(INSERT)修改数据(UPDATE)删除数据(DELETE)1、insert1语法-- 指定字段添加数据 insert into 表名(字段名1, 字段名2) values (值1, 值2); -- 全部字段添加数据 insert into 表名 values (值1, 值2, ...); -- 批量添加数据指定字段 insert into 表名 (字段名1, 字段名2) values (值1, 值2), (值1, 值2); -- 批量添加数据全部字段 insert into 表名 values (值1, 值2, ...), (值1, 值2, ...);2范例-- DML : 数据操作语言 -- DML : 插入数据 - insert -- 1. 为 emp 表的 username, password, name, gender, phone 字段插入值 insert into emp(username, password, name, gender, phone) values (songjiang,12345678,宋江,1,13300001111); -- insert into emp(username, password, name, gender, phone) values (songjiang2songjiang222,12345678,宋江2,1,13300001117); -- 2. 为 emp 表的 所有字段插入值 -- 方式1: insert into emp(id, username, password, name, gender, phone, job, salary, entry_date, image, create_time, update_time) values(null, linchong,12345678,林冲,1,13300001112,1,6000,2020-01-01,1.jpg,now(),now()); -- 方式2: insert into emp values(null, likui,12345678,李逵,1,13300001113,1,6000,2020-01-01,1.jpg,now(),now()); -- 3. 批量为 emp 表的 username, password, name, gender, phone 字段插入数据 insert into emp(username, password, name, gender, phone) values (ruanxiaoer,12345678,阮小二,1,13300001114),(ruanxiaowu,12345678,阮小五,1,13300001115);3注意1.插入数据时指定的字段顺序需要与值的顺序是一一对应的。2.字符串和日期型数据应该包含在引号中单引号、双引号都可以。3.插入的数据大小/长度应该在字段的规定范围内。2、update1语法-- 修改数据 update 表名 set 字段名1 值1, 字段名2 值2, ... [where 条件];2范例-- DML : 更新数据 - update -- 1. 将 emp 表的ID为1员工 用户名更新为 zhangsan, 姓名name字段更新为 张三 update emp set username zhangsan , name 张三 where id 1; -- 2. 将 emp 表的所有员工的入职日期更新为 2010-01-01 update emp set entry_date 2010-01-01;3注意修改语句的条件可以有也可以没有如果没有条件则会修改整张表的所有数据。2、delete1语法-- 删除数据 delete from 表名 [where条件];2范例-- DML : 删除数据 - delete -- 1. 删除 emp 表中 ID为1的员工 delete from emp where id 1; -- 2. 删除 emp 表中的所有员工 delete from emp ;3注意1DELETE语句的条件可以有也可以没有如果没有条件则会删除整张表的所有数据。2.DELETE语句不能删除某一个字段的值(如果要操作可以使用UPDATE将该字段的值置为NULL)。四、DQLDQL英文全称是Data Query Language(数据查询语言)用来查询数据库表中的记录。关键字SELECT1、基础查询1语法-- 查询多个字段 select 字段1,字段2,字段3 from 表名; -- 查询所有字段(通配符) select * from 表名; -- 为查询字段设置别名as关键字可以省略 select 字段1 [as 别名1], 字段2 [as 别名2] from 表名; -- 去除重复记录 select distinct 字段列表 from 表名;3范例-- DQL: 基本查询 -- 1. 查询指定字段 name,entry_date 并返回 select name, entry_date from emp; -- 2. 查询返回所有字段 -- 方式1: 推荐 select id, username, password, name, gender, phone, job, salary, entry_date, image, create_time, update_time from emp; -- 方式2: 不推荐 select * from emp; -- 3. 查询所有员工的 name,entry_date, 并起别名(姓名、入职日期)as可以省略 select name as 姓名, entry_date as 入职日期 from emp; select name 姓名, entry_date 入职日期 from emp; -- 4. 查询已有的员工关联了哪几种职位(不要重复) - distinct select distinct job from emp;2、条件查询1语法-- 条件查询 select 字段列表 from 表名 where 条件列表;2运算符3范例-- DQL: 条件查询 -- 1. 查询 姓名 为 柴进 的员工 select * from emp where name 柴进; -- 2. 查询 薪资小于等于5000 的员工信息 select * from emp where salary 5000; -- 3. 查询 没有分配职位 的员工信息 select * from emp where job is null; -- 4. 查询 有职位 的员工信息 select * from emp where job is not null ; -- 5. 查询 密码不等于 123456 的员工信息 select * from emp where password ! 123456; select * from emp where password 123456; -- 6. 查询 入职日期 在 2000-01-01 (包含) 到 2010-01-01(包含) 之间的员工信息 select * from emp where entry_date between 2000-01-01 and 2010-01-01; -- select * from emp where entry_date between 最小值 and 最大值; -- 7. 查询 入职时间 在 2000-01-01 (包含) 到 2010-01-01(包含) 之间 且 性别为女 的员工信息 select * from emp where entry_date between 2000-01-01 and 2010-01-01 and gender 2; select * from emp where (entry_date between 2000-01-01 and 2010-01-01) and gender 2; -- 8. 查询 职位是 2 (讲师), 3 (学工主管), 4 (教研主管) 的员工信息 select * from emp where job 2 or job 3 or job 4; select * from emp where job in (2,3,4); -- 9. 查询 姓名 为两个字的员工信息 (_: 单个字符; % 任意个字符) select * from emp where name like __; -- 10. 查询 姓 李 的员工信息 select * from emp where name like 李%; -- 11. 查询 姓名中包含 二 的员工信息 select * from emp where name like %二%;4小结1如何进行null值的判断?is nullis not null2模糊匹配中的通配符?%[任意个字符】_[一个字符】3.如何组装多个查询条件?and/or3、分组查询1聚合函数-- 聚合函数 -- 注意: 所有的聚合函数不参与null的统计 -- 1. 统计该企业员工数量 - count -- count(字段) select count(id) from emp; -- count(*) : 推荐 select count(*) from emp; -- count(常量): 推荐 select count(1) from emp; -- 2. 统计该企业员工的平均薪资 - avg select avg(salary) from emp; -- 3. 统计该企业员工的最低薪资 - min select min(salary) from emp; -- 4. 统计该企业员工的最高薪资 - max select max(salary) from emp; -- 5. 统计该企业每月要给员工发放的薪资总额(薪资之和) - sum select sum(salary) from emp;2语法-- 分组查询 select 字段列表 from 表名[where 条件列表] group by 分组字段名 [having 分组后过滤条件];where与having的区别1执行时机不同where是分组之前进行过滤不满足where条件不参与分组而having是分组之后对结果进行过滤。2判断条件不同where不能对聚合函数进行判断而having可以。3范例-- 分组 -- 注意: 分组之后, select后的字段列表不能随意书写, 能写的一般是 分组字段 聚合函数; -- 1. 根据性别分组 , 统计男性和女性员工的数量 select gender, count(*) from emp group by gender; -- 2. 先查询入职时间在 2015-01-01 (包含) 以前的员工 , 并对结果根据职位分组 , 获取员工数量大于等于2的职位 select job, count(*) from emp where entry_date 2015-01-01 group by job having count(*) 2;4注意1分组之后查询的字段一般为聚合函数和分组字段查询其他字段无任何意义。2.执行顺序where聚合函数having。4、排序查询1语法-- 排序查询 select 字段列表 from 表名 [where 条件列表] [group by 分组字段名 having 分组后过滤条件] order by 排序字段排序方式;排序方式升序asc降序desc默认为升序asc是可以不写的。注意如果是多字段排序当第一个字段值相同时才会根据第二个字段进行排序。2范例-- 排序查询 -- 1. 根据入职时间, 对员工进行升序排序 - asc select * from emp order by entry_date asc; select * from emp order by entry_date; -- 2. 根据入职时间, 对员工进行降序排序 - desc select * from emp order by entry_date desc; -- 3. 根据 入职时间 对公司的员工进行 升序排序 入职时间相同 , 再按照 更新时间 进行降序排序 select * from emp order by entry_date , update_time desc;5、分页查询1语法-- 排序查询 select 字段 from 表名 [where条件] [group by 分组字段 having 过滤条件] [order by排序字段] limit 起始索引,查询记录数;说明起始索引从0开始。分页查询是数据库的方言不同的数据库有不同的实现MySQL中是LIMIT。如果起始索引为0起始索引可以省略直接简写为limit 10。2范例-- 分页查询 -- 1. 从起始索引0开始查询员工数据, 每页展示5条记录 select * from emp limit 0,5; select * from emp limit 5; -- 2. 查询 第1页 员工数据, 每页展示5条记录 select * from emp limit 0,5; -- 3. 查询 第2页 员工数据, 每页展示5条记录 select * from emp limit 5,5; -- 4. 查询 第3页 员工数据, 每页展示5条记录 select * from emp limit 10,5; -- 页码 -- 起始索引 (页码 - 1) * 每页展示记录数