MySQL基础

(一)、MySQL概述

数据库:储存数据的仓库,数据有组织的进行存储
数据库管理系统:操纵和管理数据库的大型软件
SQL:操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准

1.1 MySQL安装及启动

下载链接:https://dev.mysql.com/downloads/installer/

启动:net start mysql80
停止:net stop mysql80

默认mysql开机自启动

客户端连接:
1.mysql提供的客户端命令行工具
在这里插入图片描述
2.使用系统自带的命令行工具执行指令
mysql [127.0.0.1] [-p 3306] -u root -p
第一个括号是ip,第二个是端口,可以不输入,默认使用本地

配置环境变量:
在Path中添加路径:C:\Program Files\MySQL\MySQL Server 8.0\bin

1.2 MySQL数据模型

关系型数据库:建立在关系模型基础上,由多张相互连接的二维表组成的数据库
特点:
1.使用表存储数据,格式统一,便于维护
2.使用SQL语言操作,标准统一,使用方便

MySQL的数据模型:
在这里插入图片描述

(二)、SQL

SQL通用语法:
在这里插入图片描述

SQL语句分类:
在这里插入图片描述

2.1 DDL

[] 是可选参数
在这里插入图片描述

2.1.1 表操作-查询
select * from 表名;//可以查询指定表格

在这里插入图片描述

2.1.2 表操作-创建

在这里插入图片描述
最后一个字段后面无逗号

创建此表结构:字符串是varchar
在这里插入图片描述

create table tb_user(
    -> id int comment '编号',
    ->  name varchar(50) comment '姓名',
    -> age int comment '年龄',
    -> gender varchar(1) comment '性别'
    -> )comment '用户表';
2.1.3 表操作-数据类型

数值类型:
在这里插入图片描述
decimal:精度指一个数的整个长度,标度是几位小数

例:描述一个年龄
age TINYINT UNSIGNED(用的是无符号的TINYINT)
描述一个分数 3位数,一位小数
score double(4,1) 4代表长度 ,1代表几位小数

字符串类型:
在这里插入图片描述
使用char和varchar后面跟一个参数,代表能够存储的字符数量
char定义完大小,不管存储了几个字符,都是占用定义好了的空间。(性能好)
varchar会根据存入的字符数量改变占用空间 。(性能较差)

确定的内容就可以使用char,如性别
不确定的内容使用varchar,如用户名

日期类型:
在这里插入图片描述

练习:
在这里插入图片描述

create table emp(
	id int comment '编号',
	workno varchar(10) comment '工号',
	name varchar(10) comment '姓名',
	gender char(1) comment '性别',
	age tinyint unsigned comment '年龄',
	idcard char(18) comment '身份证号', 
	entrydata date comment '入职时间'
)comment '员工表';
2.1.4 表操作-修改

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.1.5 表操作-删除

在这里插入图片描述
删除表时,表中数据也会全部删除

2.2 DML

对数据库表中的数据记录进行增删改操作
* 在实际开发中尽量不使用

2.2.1 DML-插入

在这里插入图片描述
注:
1.插入数据时,指定的字段顺序需要与值的顺序是一一对应的
2. 字符串和日期型数据应该包含在引号中
3. 插入的数据大小,应该在字段的规定范围内

2.2.2 DML-更新和删除

在这里插入图片描述
注:修改语句的条件可以有,也可以没有,如果没有条件,则会修改整张表的所有数据

在这里插入图片描述
注:delete语句的条件可以有,也可以没有,如果没有条件就是删除整张表的所有数据
delete语句不能删除某一个字段的值(可以使用update)

2.3 DQL

用来查询数据库中表的记录
编写顺序:
在这里插入图片描述

2.3.1 DQL-基础查询

查询多个字段:第二个是查询所有字段
在这里插入图片描述
设置别名:对查询返回的字段起一个别的名字。as可以省略
在这里插入图片描述
去重:对查询返回的结果进行去重操作
在这里插入图片描述

2.3.2 DQL-条件查询

语法:where后的条件可以是一个也可以是多个
在这里插入图片描述
条件可以使用的运算符
在这里插入图片描述
in是多个数据满足一个即可
查询名字是两位的员工:select * from emp where name like '__';
身份证最后一位是X的员工:select * from emp where idcard like '%X'; //%表示前面任意个字符,最后一个是X就行

2.3.3 DQL-聚合函数

将一列数据作为一个整体,进行纵向计算

常见的聚合函数:
在这里插入图片描述

语法:select 聚合函数(字段列表) from 表名;
注:null值不参与所有的聚合函数运算

2.3.4 DQL-分组查询

语法:
在这里插入图片描述
注:where和having的区别
1.执行时机不同,where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤
2.判断条件不同:where不能对聚合函数判断,而having可以

执行顺序:where>聚合函数>having
分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义

例:
1.根据性别分组,统计男员工和女员工数量:select gender,count(*) from emp group by gender;
2.根据性别分组,统计男员工和女员工平均年龄:select gender,avg(age) from emp group by gender;
3.查询年龄小于45,并根据工作地址分组,获取员工数量大于等于3的工作地址:
select workadress,count(*) from emp where age<45 group by workadress having count(*)>=3;

2.3.5 DQL-排序查询

语法:
在这里插入图片描述
排序方式:
ASC:升序(默认值)(小到大)
DESC:降序(大到小)

注:如果是多字段排序,当第一个字段值相同时,才会按第二个字段排序

2.3.6 DQL-分页查询

语法:
在这里插入图片描述

注:

  1. 起始索引从0开始,起始索引=(查询页码-1)*每页显示记录数
  2. 分页查询是数据库的方言,不同数据库有不同的实现,mysql是limit
  3. 如果查询的是第一页数据,起始索引可以省略,直接简写为limit 10。

例:
从第一页开始查询,每页10条数据:select * from emp limit 0,10;
从第二页开始查询,每页10条数据:select * from emp limit 10,10;

2.3.7 DQL-案例练习

在这里插入图片描述

-- 1.
select * from emp where gender='女' and age in (20,21,22,23);

-- 2.
select * from emp where gender='男' and  age>=20 and age<=40 and name like '___';

-- 3.
select gender,count(*) from emp where name<60 group by gender;

-- 4.
select name,age from emp where age<=35   order by age asc ,entrydate desc;

-- 5.
select * from emp where gender='男' and  age<=40 and age>=20 order by age asc ,entrydate asc limit 0,5;

2.3.8 DQL-执行顺序

在这里插入图片描述

2.4 DCL

管理数据库的用户,控制数据库的访问权限
在这里插入图片描述

在任意主机上访问该数据库:主机名用%(通配符,代表任意主机)
注:这类SQL开发人员较少,主要是DBA(数据库管理员)使用

2.4.1 DCL-权限控制

常用控制权限:
在这里插入图片描述

语法:
在这里插入图片描述

(三)、MySQL图形化界面

DataGrip,下载地址:https://www.jetbrains.com/zh-cn/datagrip/download/#section=windows
学生邮箱申请免费使用

(四)、函数

是指一段可以直接被另一段程序调用的程序或代码

4.1 字符串函数

常用的函数:
在这里插入图片描述
调用语法:select 函数(参数);

注:substring的索引值是从1开始的

4.2 数值函数

常见数值函数:
在这里插入图片描述
mod的结果就是除完的余数

练习:生成一个六位数的随机验证码
对随机数进行四舍五入,不保留小数,然后如果四舍五入后不足6位,在左边补0(右边补0也可以)

select lpad(round(rand()*1000000,0),6,'0');

4.3 日期函数

常用函数:
在这里插入图片描述
练:查询员工入职天数,并根据入职天数进行倒序排序
对计算完的入职天数取一个别名,方便使用

select name,datediff(curdate(),entrydate) as 'entrydates' from emp order by entrydate desc ;

4.4 流程函数

常用函数:
在这里插入图片描述
有范围的参数时,一般用第一种case

(五)、约束

概念:作用于表中字段上的规则,用于限制存储在表中的数据
目的:保证数据库中数据的正确、有效性和完整性
在这里插入图片描述
注意:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束

例:按需求建立表
在这里插入图片描述
主键的自动增长,不需要手动添加数据,但是无论添加数据是否成功,id都会增加1

create table user(
    id  int primary key auto_increment comment '主键',
    name varchar(10) not null  unique comment '姓名',
    age int check ( age>0 and age<=120 ) comment '年龄',
    status char(1) default '1' comment '状态',
    gender char(1) comment '性别'
)comment '用户表';

5.1 外键约束

具有外键的表叫子表
另一个表叫父表

添加外键的语法:
在这里插入图片描述
删除外键:
在这里插入图片描述
删除和更新行为:
在这里插入图片描述
设置行为的语法:
在这里插入图片描述

在DataGrip中可以通过右键-> Modify - >点击Foreign Keys ,双击修改规则

(六)、多表查询

从多个表中查询数据
笛卡尔积:两个集合的所有组合情况(在多表查询时,需要消除无效的笛卡尔积)

多表查询分类:
在这里插入图片描述

6.1 多表关系

1.一对多
关系:如一个部门对应多个员工,一个员工对应一个部门
实现 :在多的一方建立外键,指向一的一方的主键

2.多对多
关系:如一个学生可以选多门课程,一门课程也可以被多名学生选择
实现:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键

3.一对一
关系:多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另外一张表中,以提升操作效率
实现:在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(unique)

6.2 内连接

内连接查询的是两张表交集的部分
查询语法:
在这里插入图片描述

6.2 外连接

在这里插入图片描述
outer可写可不写

6.3 自连接

语法:
在这里插入图片描述
可以是内连接查询,也可以是外连接查询

查询时,要将表看成两张表,a表,b表

6.4 联合查询

把多次查询结果合并起来,形成一个新的查询结果集
在这里插入图片描述
例:查询薪资低于5000和年龄大于50的员工

select  * from emp where salary<5000
union  all
select  * from emp where age>50;

将两次查询的结果直接合并为一个结果集(可能会有重复数据)

注:
1.对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致
2.union all会将全部的数据全部合并在一起,union会对合并之后的数据去重

6.5 子查询

SQL语句中嵌套select语句,称为嵌套查询,又称子查询

语法:
在这里插入图片描述
子查询的外部语句可以是 insert / update / delete / select的任何一个

根据子查询结果不同,分为:
在这里插入图片描述
根据子查询位置,分为:where之后,from之后,select之后

6.5.1 标量子查询

在这里插入图片描述
如:查询销售部员工,

select * from emp where `dept.id`=(select id from dept where depart='销售部');
括号里的查询语句返回的是销售部的id
6.5.2 列子查询

常用操作符:
在这里插入图片描述

6.5.3 行子查询

常用操作符:
在这里插入图片描述
如:查询与张无忌相同薪资和领导的员工信息

select * from emp where (salary,managerid) =(select  salary,managerid from  emp where name='张无忌');
括号内返回薪资和领导id,一行数据
6.5.4 表子查询

常用操作符:in

如:查询入职日期是 2006-01-01 的员工信息,及其部门信息

select e.*,d.* from (select * from emp where entrydate >'2006-01-01') e left join dept d on `dept.id`=d.id;
括号内返回的结果是一张表,用来和另一种表连接
6.5.5 练习

练1:
在这里插入图片描述

-- 1.
select e.name,e.age,e.job,d.depart from emp e,dept d where e.`dept.id`=d.id;

-- 2.
select e.name,e.age,e.job,d.depart from emp e join  dept d on e.`dept.id`=d.id where e.age<30;

-- 3.
select distinct d.id ,d.depart from emp e,dept d where e.`dept.id`=d.id;

-- 4.
select e.*,d.depart from emp e left join dept d on e.`dept.id`=d.id where e.age>40;

-- 5.
select e.name,s.grade from emp e,salgrade s where e.salary>=s.losal and e.salary<=s.hisal;

-- 6.
select e.*, s.grade
from emp e,
     dept d,
     salgrade s
where e.`dept.id` = d.id
  and (e.salary between s.losal and s.hisal)
  and d.depart = '研发部';

-- 7.
select avg(e.salary) from emp e,dept d where e.`dept.id`=d.id and d.depart='研发部';

-- 8.
select * from  emp where salary > (select salary from emp where name='灭绝');

-- 9.子查询
select * from emp where salary > (select avg(salary) from emp);

-- 10.后面括号内获取的是当前行的部门的平均薪资
select * from  emp e2 where e2.salary<(select avg(e.salary) from emp e where e.`dept.id`=e2.`dept.id`);
-- 11.括号内获取的是人数,让emp表的dept.id=dept表的id(每一个部门的id) 然后count函数统计人数
select d.id ,d.depart,(select count(*) from emp e where e.`dept.id`=d.id) '人数' from dept d;

-- 12.
select s.name,s.no,c.name from student s,student_course sc ,course c where s.id=sc.studentid and sc.courseid = c.id;

(七)、事务

事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,既这些操作要么同时成功,要么同时失败

默认mysql的事务是自动提交的,也就是说,当执行一条DML语句,mysql会立即隐式提交事务

7.1 事务操作

语法:
方式一:
0是设置为手动提交
在这里插入图片描述

方式二:
开启事务:
在这里插入图片描述
成功就执行提交事务
失败就执行回滚事务

7.2 事务四大特性

在这里插入图片描述

7.3 并发事务问题

在这里插入图片描述
多个并发事务在执行过程中出现的问题

7.4 隔离级别

在这里插入图片描述
mysql默认是第三种

Read uncommitted 的性能最好,但是安全性最差
Serializable 的安全性最好,但性能最差
事务隔离级别越高,数据越安全,性能越低

语法:
在这里插入图片描述
session是只针对当前窗口设置
global是所有窗口设置

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值