MySQL的基础知识

什么是数据库

1.数据库

1.概念

按照数据结构来组织、存储和管理数据的仓库、是一个长期存储在计算机内的、有组织的、有共享的、统一管理的数据集合

2.分类

在这里插入图片描述

2.数据库管理系统

概念

操作和管理数据库的大型软件,用于建立、使用和维护数据库

常见的数据库管理系在这里插入图片描述

MySQL

概念

在这里插入图片描述

卸载

在这里插入图片描述

配置环境变量

在这里插入图片描述

MySQL目录结构及配置文件

在这里插入图片描述

SQL语言

概念

用于存取数据、更新、查询和管理关系型数据库系统的结构化查询语言

分类

数据查询语言DQL(Date Query Language)

数据库命令
#创建数据库
create DATABASE if not exists gp9_02;
##create database gp9_02;
##create database gp9_02 character set gbk;
#查看数据库的创建信息
show create database gp9_02;
#修改数据库
ALTER database gp9_02 character set utf8mb4;
#删除数据库
drop DATABASE gp9_02;
#查看选择的数据库
select DATABASE();
#切换数据库
use gp9_02;
数据查询(DQL)

注意:执行数据库查询时,返回的结果集是一张虚拟表

基本查询
#基本查询
#1.查询所有列
select * from t_employees;
#1.2.查询部分列
select first_name,salary,hire_date from t_employees;
#1.3查询员工表中所有员工的编号、年薪、名字
select employee_id,first_name,salary *12 from t_employees;
#1.4执行算数运算
select 100 + 200;
select 10/5;
select 10%4;
#1.5起别名
select employee_id as '编号',first_name as'姓名',salary *12 as '年薪'
from t_employees;
#1.6去掉重复工具(去掉工资和相同数据)
select distinct salary,commission_pct from t_employees;
排序查询
#排序查询
#2.1查询员工的编号、名字、工资并按照工升序排序
select employee_id,first_name,salary 
from t_employees order by salary asc;
#2.2查询员工的编号、名字、工资并按照工资升序排列,工资一样按照编号降序
select employee_id,first_name,salary 
from t_employees order by salary asc,employee_id desc;
条件查询

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

在这里插入图片描述

#条件查询
#3.1查询工资等于11000的员工
select employee_id,first_name,salary from t_employees where salary=11000;
#3.2查询工资等于11000且提成等于0.3的员工
select employee_id,first_name,salary,commission_pct from t_employees where salary=11000 and commission_pct = 0.3;
#3.3查询工资等于11000或提成等于0.3的员工
select employee_id,first_name,salary,commission_pct from t_employees where salary=11000 or commission_pct = 0.3;
#3.4 查询工资大于20000的员工信息
select employee_id,first_name,salary
from t_employees 
where salary>20000;
#3.5查询工资在10000到20000之间的员工信息
select employee_id,first_name,salary
from t_employees
where salary between 10000 and 20000;
#3.6查询提成为null的员工信息
select employee_id,first_name,salary,commission_pct
from t_employees
where commission_pct is null;
#查询提成不为空的员工的信息
select employee_id,first_name,salary,commission_pct
from t_employees
where commission_pct is not null;
#3.8查询员工编号为188,199,200的员工(枚举查询)
select employee_id,first_name,salary
from t_employees
where employee_id in(188,199,200);

#3.9查询名字‘l’开头的员工信息(like 模糊查询)
select employee_id,first_name,salary
from t_employees
where first_name like'L%';
分支结构查询(基本不用)
#4.分支结构查询(了解就好)
select employee_id,first_name,
case
when salary < 10000 then '低'
when salary < 20000 then '低'
else'高'
end
from t_employees;
时间函数

在这里插入图片描述

#时间函数
#获取系统时间
select SYSDATE();
select NOW();
#获取日期
select curdate();
#获取时间
select curTime();
#获取当前时间是一年中的第几周
select week(curdate());
select week('2021-07-5');
#获取两个时间差
select datediff('2021-08-22','2019-05-01');
#获取五天后的时间
select adddate('2021-8-22',5);
字符串函数

在这里插入图片描述
注意:在mysql中下标从1开始

#字符串函数
#concat();字符串的拼接
select concat(employee_id,'的姓名是',first_name,'工资是',salary) as info from t_employees;
#insert():替换
select insert('java是世界上最好的语言',1,4,'php');
#lower():小写
select lower('JAVA');
#upper():大写
select upper('java');
#subString():截取
select substring('java是最好的语言',1,4);
#length():获取字符串的字节长度
select length('java是世界上最好的语言');
#char_length():获取字符串的字符长度
select char_length('java是世界上最好的语言');
聚合函数

按照效率的话count(字段)<count(主键id) <count(1)约等于count(*)
在这里插入图片描述
在这里插入图片描述

#聚合函数
#3.1查询所有人的工资和
select sum(salary) from t_employees;
#3.2avg():平均值
select avg(salary)from t_employees;
#3.3max(),min():最高最低
select max(salary),min(salary)from t_employees;
#3.4count():查询数据个数
select count(*) from t_employees;
select count(0) from t_employees;
select count(employee_id) from t_employees;#不包含null值

#其他函数
#database():获取当前选择的数据库
select database();
#ifnull(str,0):如果str为null,则返回0
#计算所有人的工资和提成的和
select salary+(salary*ifnull(commission_pct,0))from t_employees;
#user():返回当前用户
select user();
#version():返回mysql版本号
select version();
分组查询

在这里插入图片描述

#5分组查询(select查询的列必须是分组列,或聚合列)
#5.1按照部门编号分组,查询每个部门的人数
select department_id,count(*)
from t_employees
group by department_id
#5.2查询各部门的平均工资
select department_id,avg(salary)
from t_employees
group by department_id;
分组过滤查询

在这里插入图片描述

#6.分组过滤查询
#6.1统计平均工资大于等于10000的部门
select department_id,avg(salary) avgw
from t_employees
group by department_id
having avgw >= 10000;
限定查询

在这里插入图片描述

#7.限制查询
#7.1查询第一页
select employee_id,first_name,salary 
from t_employees limit 0,10;
#查询第二页
select employee_id,first_name,salary 
from t_employees limit 10,10;
#查询第三页
select employee_id,first_name,salary 
from t_employees limit 20,10;
基础查询总结

在这里插入图片描述

SQL查询语句执行流程

在这里插入图片描述

子查询

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

#高级查询
#子查询:一个查询中又嵌套着一个完整的查询
#1.1查询工资大于bruce的员工信息
#先查询bruce的信息
#在查询工资高于6000的员工
select employee_id,first_name,salary from t_employees
where salary >(select salary from t_employees where first_name='bruce');
#查询姓为'king'同一部门的员工信息
select employee_id,first_name,salary from t_employees
where department_id in (select department_id from t_employees where last_name ='king');
#查询工资高于60部门所有人的员工信息
select employee_id,first_name,salary from t_employees
where salary > all(select salary from t_employees where department_id = 60);
#查询高于60部门任意人的工资的员工信息
select employee_id,first_name,salary from t_employees where salary > any(select salary from t_employees where department_id = 60);



合并查询

在这里插入图片描述

#2.合并查询:保证查询的列数相同
#把stu1和stu2.合并起来
select id,name,phone from stu1 union select id,name,phone from stu2;
#2.2把stu1表中的id和name和stu2表id和name合并,union默认去掉重复,union all包含重复数据
select id,name from stu1 union select id,name from stu2;
连接查询
表和表的关系

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
格式:From a
join b on a.Id = b.id
join c on c.Sid = a.sid

#连接查询
#交叉连接(笛卡尔积)
#标准写法
select * from t_employees cross join t_departments
#传统写法
select * from t_employees,t_departments;
#2.内连接查询(过滤掉重复的交叉连接)
#标准写法
select * from t_employees as e inner join t_departments  as d 
on e.department_id = d.department_id;
#传统写法
select * from t_employees as e,t_departments as d
where e.department_id = d.department_id;
#外连接查询
#左外连接 left join :以左表为主表,去右表匹配,匹配到返回结果,匹配不到返回null
#查询员工及其部门信息
select e.employee_id,e.first_name,e.salary,d.department_id,d.department_name
from t_employees e left outer join t_departments d
on e.department_id=d.department_id;

#右外连接 right join
select e.employee_id,d.department_name,d.department_id
from t_employees e right outer join t_departments d
on e.department_id=d.department_id
where e.employee_id is null;

数据类型

数值类型

在这里插入图片描述

日期时间类型

在这里插入图片描述

字符串类型

char:数据长度不足补空格,如果超出截断(数据太长错误)、
大数据类型 blob 存储二进制数据 text存储da文本(64k)
MediumBlob 16M longblob 4G
mediumText 16M longText 4G
在这里插入图片描述

数据定义语言DDL(Date Defination Language)

创建表

在这里插入图片描述

修改表

在这里插入图片描述

删除表

在这里插入图片描述

#1.创建表
#需求创建user表(id,username,password,email,phone,bornDate,role)
create table if not exists user(
	id int,
	username varchar(20),
	password varchar(18),
	email varchar(30),
	phone varchar(11),
	bornDate datetime,
	role int
);

#2.修改表
#2.1向现有表中添加列
alter table user add photo blob;
#2.2修改列名和类型
alter table user change photo myphoto mediumblob;
#2.3 修改表名
alter table user rename t_user;
#3.删除表
drop table t_user;

约束

概念:用于限制加入表的数据的类型和规范

实体完整性约束
主键约束

语法:primary key
作用:唯一,标识表中的一行数据,此列的值不可重复,且不能为null

#科目表
create table if not exists subject(
	subjectId int primary key,
	subjectName varchar(20),
	subjectHour int
)
#成绩表
create table if not exists score(
	sid int,
	result double,
	subjectId int,
	primary key(sid,subjectId)
)
唯一约束

语法:unique
唯一,标识表中的一行数据,不可重复,可以为null
在这里插入图片描述

自动增长列

语法:auto_increment
不能单独使用,给主键数值添加自动增长主键必须是数值类型;每个表只能有一个
默认从1开始,每次+1;可以使用auto_increment修改初始值
在这里插入图片描述

create table if not exists person(
	id int primary key auto_increment,
	name varchar(20),
	age int,
	phone varchar(11),
	address varchar(50),
	identity varchar(18)unique
)auto_increment = 100;#初始化值为1
域完整性约束

概念: 限制列的单元格的数据的正确性
在这里插入图片描述

#非空约束
#默认值约束 default
create table if not exists user(
	id int primary key,
	username varchar(20) not null,
	password varchar(18) default '000000',
	email varchar(30),
	phone varchar(11)not null,
	bornDate datetime,
	role int
);
引用完整性约束

引用完整性约束也称为外键约束
语法:constraint [外键名] foreign key(列名) references 主表(列名)
作用:foreign key 引用外部表的某个引用的值
新增数据时,结束此列的值必须数引用表中的已经存在的值
注意:当两张表存在引用关系,若要执行删除操作,一定要先删除从表(引用表),再删除主表(被引用表)。

#创建score表
create table if not exists score(
	sid int,
	result double unique,
	subjectId int,
	examTime datetime,
	primary key(sid,subjectId),
	constraint foreign key(sid) references student(id),
	constraint foreign key(subjectId) references subject(subjectId)
);

数据操作语言DML(Date Manipulation Language)

概念

对数据库的增删改操作

#DML语句
#1.添加数据 insert into 表名(列名。。。)values{值}
insert into student(id,name,age,bornDate,phone,address)
values{1,'张三',20,'男','1999-8-23','153496666668888','北京昌平'};
#添加多条数据
insert into student(id,name,age,bornDate,phone,address)
	values{2,'李四',20,'男','1999-8-23','153496666668888','北京昌平'};
	values{3,'王五',20,'男','1999-8-23','153496666668888','北京昌平'};
	values{4,'赵六',20,'男','1999-8-23','153496666668888','北京昌平'};
	values{5,'田七',20,'男','1999-8-23','153496666668888','北京昌平'};
#给所有字段都赋值可省略字段名
insert into student values(7,'haha',20,'男','1999-8-23','15340664462','北京昌平');
#给部分字段赋值
#注意:列名和值的顺序、类型个数必须一致
insert into student(id,name,age,sex) values(8,'heihei',20,'男');
修改

语法:update 表名 set 列1 = 新值1,l列2 = 新值2,…where 条件;
注意:①set后多个列名 = 值
②绝大多数情况下都要加where条件,制定修改,否则为整表更新

#修改:update 表名 set 列名 = 值,。。。。where条件
update student set bornDate= '2000-8-23',address = '上海'
where id= 1;
删除

语法:delete from 表名 where 条件
注意:删除时,如若不加where条件,删除的是整张表的数据

#4.1使用delete删除,逐行删除
delete from student where id =1;
清空

语法:truncate table 表名;

和delete区别

在这里插入图片描述


#4.2truncate删除,先删除表,然后新建表
truncate table student;
更新

在这里插入图片描述

事务控制语言TCL(Transaton Control Language)

概念:
		事务是一个原子操作,由一个或多个SQL语句组成
		在同一个事务当中所有的SQL语句要么全部执行成功,要么全部失败
原理:在这里插入图片描述
事务的边界:

在这里插入图片描述

事务的特性

原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;
一致性: 执行事务前后,数据保持一致;
隔离性: 并发访问数据库时,一个用户的事物不被其他事物所干扰,各并发事务之间数据库是独立的;
持久性: 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。
在这里插入图片描述

举例
#TCL事务
#模拟银行转账
#手动显示开启事务
-- begin;
set autocommit = 0;#禁止自动提交,mysql默认自动提交且一条语句是一个事务
update account set money = money - 1000 where id= 1;
update account set money = money + 1000 where id =2;
#手动显示提交
commit;
#手动显示回滚
rollback;
事务的隔离级别

在这里插入图片描述
四种隔离级别:
①Read committed(获取未提交的内容):Oracle默认级别
②repeatable read:mysql默认级别 mysql已经解决了幻读问题
在这里插入图片描述
在这里插入图片描述
脏读(Dirty read): 当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的。
丢失修改(Lost to modify): 指在一个事务读取一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据。这样第一个事务内的修改结果就被丢失,因此称为丢失修改。 例如:事务1读取某表中的数据A=20,事务2也读取A=20,事务1修改A=A-1,事务2也修改A=A-1,最终结果A=19,事务1的修改被丢失。
不可重复读(Unrepeatableread): 指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。
幻读(Phantom read): 幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。

权限管理

在这里插入图片描述

#创建用户
create user 'zhangsan' identified by '123';
#只有本地登录
create user 'zhangsan' @ 'localhost' identified by '123';
#所有用户都可以登录
create user 'zhangsan' @ '%' identified by '123';
#授权
grant all on gp_02.*to 'zhangsan';
#撤销权限
revoke all on gp_02.*to 'zhangsan';
#授权 查询
grant select on gp_02.*to 'zhangsan';
#删除用户
drop user 'zhangsan';
#刷新权限
flush PRIVILEGES;
视图
概念

视图就是虚拟表,从一个表或多个表中擦讯出来的表,作用和真实表一样

作用

和真实表一样,包含一系列带有行和列的数据
视图可以使用户操作方便、并保障数据库系统安全

对视图的操作

在这里插入图片描述

优点

简单、安全性高,用户只能查询或修改他们所能见的数据

缺点

在这里插入图片描述

#视图
#和真实表一样,包含一系列带有行和列的数据
#视图可以使用户操作方便,并保证数据库安全
#创建视图
create view vw_employee as
select employee_id,first_name,hire_date,salary
from t_employees;create view ve_employee as
select employee_id,first_name,hire_date,salary
from t_employees;
#使用视图
select * from vw_employee;

create or replace view vw_employee_department as
select employee_id,first_name,hire_date,salary,d.department_name
from t_employees e inner join t_departments d
on e.department_id = d.department_id;

select * from vw_employee_department;
#删除视图
drop view vw_employee;

create view vw_student as
select * from student;

#向视图添加数据
insert into vw_student(id,name,age,sex,bornDate,phone,address) values{7,'aaa',20,'男','2000-10-9','188888','上海'};
select * from vw_student;
#修改视图数据
update vw_student set address = '北京昌平';
#删除视图数据
drop view vw_student;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值