Mysql基础复习

SQL语言

DDL数据库操作(对库的操作)

1.show databases   # 查询所有数据库
2.create database [if not exists] [databaseName] [default charset 字符集] [collate 排序规则] # 创建数据库
3.select database() # 查询当前数据库
4.drop database [if exists] [databaseName] # 删除数据库
5.use [databaseName] # 使用对应数据库
6.show tables # 查询当前数据库所有的表
7.desc 表名 # 查看表结构
8.show create table 表名 # 查询指定表的建表语句
9.create table emp(
		id int commit '编号',
		name varchar(20) commit '姓名',
		gender char(1) commit '性别'
	)engine = InnoDB default charset = 'utf8' comment '员工表'  # 创建表
10.alter table 表名 add 字段名 类型 [comment 注释][约束]  # 向表中添加字段
11.alter table 表名 change 旧字段 新字段 类型 [comment 注释][约束] # 修改表中字段
12.alter table 表名 drop 字段名 # 删除表中字段
13.alter table 表名 rename to [newName] # 修改表名
14.drop table [if exists] 表名 # 删除表
15.truncate table 表名 # 删除表并重新创建表

DML 增删改

1.insert into 表名(...字段名) values (...值),(...值) # 添加数据
2.update 表名 set 字段名1 = 值1,字段名2 = 值2 where 条件  # 修改数据
3.delete from 表名 where 条件 # 删除数据,如果没有条件,则全部删除

DQL 查询

select 字段列表
 from 表名
 where 条件
 group by 分组字段列表
 having 分组后条件列表
 order by 排序字段列表
 limit 分页参数
聚合函数

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

1.count  # 统计数量
	SELECT COUNT(age) from emp;   # 不会统计null值  * 统计全部
2.max	# 最大值
	SELECT MAX(age) from emp;
3.min	# 最小值
	SELECT MIN(age) from emp;
4.avg	# 平均值
	SELECT AVG(age) from emp;
5.sum	# 和
	SELECT SUM(age) from emp where gender = 'F';
	
分组查询

主要配合聚合函数使用

select 字段列表
 from 表名
 where 条件
 group by 分组字段列表
 having 分组后条件列表,对每个分组进行判断

where 在分组之前进行过滤,不满足where,不参与分组; having是分组之后进行过滤
where 不能对聚合函数过滤

# 根据性别进行分组,查询个数
SELECT gender,count(*) from emp group by gender;

# 根据性别进行分组,查询每个性别员工的平均年龄
SELECT gender,avg(age) from emp group by gender;

# 根据性别进行分组,查询总数大于4的性别人数
SELECT gender,count(*) from emp group by gender HAVING count(*)>4;

排序查询
select 字段列表
 from 表名
 where 条件
 order by 排序字段列表

# 按age排序查询
select name,age from emp order by age asc;   # 升序 默认
select name,age from emp order by age desc;	 # 降序

分页查询
select 字段列表
 from 表名
 limit 起始索引,查询记录数

# 索引从0开始  如果是选择从0开始,0可以省略  limit 3;
select name,age from emp limit 0,3;

DCL 用户权限管理

# 查询用户
use mysql;
select * from user;

# 创建用户
create user '用户名'@'主机名' identified by '密码';

# 修改用户密码
alter user '用户名'@'主机名' identified with mysql_native_password by '新密码';

# 删除用户
drop user '用户名'@'主机名'

# 查询权限
show grants for '用户名'@'主机名'

# 授予权限
grant 权限列表 on 数据库名.表名 to '用户名'@'主机名' # *.*代表所有数据库和表

# 撤销权限
revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名'

在这里插入图片描述

函数

字符串函数

1.concat(s1,s2,...)	# 字符串拼接
	select * from emp where name like concat('%','三','%');
	select CONCAT(name,age)	as component from emp
2.lower(str)	# 小写
	select name,lower(gender) as gender from emp
3.upper(str)	# 大写
	select name,upper(gender) as gender from emp
4.lpad(str,n,pad)	# 左填充,用字符串pad对str的左边进行填充,达到n个字符串长度
	select LPAD('z',10,1);
5.rpad(str,n,pad)	# 右填充,用字符串pad对str的右边进行填充,达到n个字符串长度
	select RPAD('z',10,1);
6.trim(str)	# 去掉首尾空格
	select trim('    5   ')
7.substring(str,start,len)	# 字符串截取,从start开始,截取len个长度
	select substring('123456789',1,5)  # start从1开始
	

数值函数

1.ceil(x)	# 向上取整
	select ceil(2.6)
2.floor(x)	# 向下取整
	select floor(2.6)
3.mod(x,y)	# 返回x/y的模(余数)
	select mod(9,4)
4.rand()	# 返回0-1随机数
	select rand()
	select floor(rand()*10+1)	# 随机1-10的数
	select lpad(floor(rand()*1000000),6,'0')  # 6位验证码  填充0
5.round(x,y)	# 求参数x的四舍五入的值,保留y位小数
	select round(2.666666,3)

日期函数

1.curdate()	# 返回当前日期
	select curdate()
2.curtime()	# 返回当前时间
	select curtime()
3.now()		# 返回当前日期和时间
	select now()
4.year(date)# 获取指定date的年份
	select year(now())
5.month(date) # 获取指定date的月份
	select month('2022-03-06')
6.day(date)	# 获取指定date的日期
	select day(now())
7.date_add(date,interval expr type)	# 返回一个日期/时间值加上一个时间间隔expr后的时间值
	select date_add(now(),INTERVAL 70 day) 	# type: day/year/month;	expr数值
8.datediff(date1,date2)	# 返回起始时间date1和结束时间date2之间的天数,减法
	select datediff('2022-03-10','2022-03-06')
9.date(date)	# 返回date的日期
	select date(now())

流程函数

1.if(value,t,f)	# 如果value为true,则返回t,否则返回f
2.ifnull(value1,value2)	# 如果value1不为空,返回value1,否则返回value2
3.case [expr] when [val1] then [res1] ... else [default] end
	# 如果expr的值等于val1,返回res1,否则返回default默认值	类似于switch-case

约束

1.not null	# 非空约束,限制该字段的数据不能为null
2.unique	# 唯一约束 保证该字段的所有数据都是唯一,不重复的
3.primary key # 主键约束 主键是一行数据的唯一标识,要求非空且唯一
4.default	# 默认约束 保存数据时,如果未指定该字段的值,则采用默认值
5.check	# 检查约束 保证字段值满足一个条件(8.0.16之后)
6.foreign key	# 外键约束 用来让两张表的数据之间建立连接,保证数据的一致性和完整性
# 创建用户表
create table user(
	id int primary key auto_increment comment '主键',
	name varchar(20) not null unique comment '姓名',
	age int check (age > 0 && age<=120) comment '年龄',
	status char(1) default '1' comment '状态',
	gender char(1) comment '性别'
)	comment '用户表'

# 插入数据
insert into user(name,age,status,gender) values 
('tom1',19,'1','M'),('tom2',20,'0','F');

insert into user(name,age,gender) values ('tom4',30,'M')

# 创建部门表
create table dept(
	id int primary key auto_increment,
	name varchar(20)
)comment '部门表'

insert into dept(name) values('安保部'),('研发部'),('销售部'),('财务部')

# 添加外键 
alter table emp add constraint dept_fk foreign key(did) references dept(id)

# 删除外键
alter table emp drop foreign key dept_fk
外键删除/更新行为
1. no action # 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许被删除/更新
2. restrict # 同上
3. cascade	# 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,则也删除/更新子表记录
4. set null # 当在父表中删除对应记录时,首先检查是否有对应外键,如果有则设置子表中该外键值为null

# 修改外键删除修改行为    emp表数据会跟着dept表的数据变化而变化(删除/修改)
	alter table emp add CONSTRAINT dept_fk foreign key(did)
		references dept(id) on update cascade on delete cascade

多表查询

多表关系

1.一对多(多对一)
	例子:一个班主任对应着一群学生,多个学生有一个班主任
2.多对多
	例子:一个学生可以选多门课,每门课可以被多个学生选
3.一对一
	例子:每个人只有一个身份证号

多表查询

笛卡尔积	两个集合中的每个元素都互相匹配
消除笛卡尔积使用条件查询
select * from emp,dept where dept.id = emp.did
内连接

内连接查询的是两张表交集的部分

# 隐式内连接 使用逗号
select * from emp,dept where dept.id = emp.did
# 显示内连接  inner join
select * from emp [inner] join dept where dept.id = emp.did
外连接
# 左外连接  左表所有数据和右表交集数据
select * from emp left [outer] join dept on 条件
# 右外连接  右表所有数据和左表交集数据
select * from emp right [outer] join dept on 条件
自连接

自己连接自己查询,使用别名,可以使用内连接,也可以外连接

# 通过managerId字段内连接查询manager姓名
select e1.name as emp,e2.name as manager from emp as e1,emp as e2 where e1.managerId = e1.id
联合查询

把多次查询的结果合并起来,形成一个新的结果集

select 字段列表 from 表A
union [ALL]
select 字段列表 from 表B

子查询

sql语句嵌套查询

select * from t1 where column1 = (select column1 from t2)

# 标量子查询 子查询结果为一个值
	select * from emp where id = (select id from dept where name = '销售部')
# 列子查询	子查询结果为一列(常用操作符 IN ,NOT IN, ANY,SOME,ALL)
	select * from emp where id = in (select id from dept where name = '销售部' or name = '市场部')
# 行子查询	子查询结果为一行(常用操作符 =,<>,IN,NOT IN)  组合条件
	select * from emp where (salary,managerId) = (select salary,managerId from emp where name = '张无忌')
# 表子查询	子查询结果为一张表 组合条件,查询出多个组合条件,使用IN来包含
	select * from emp where (salary,managerId) in (select salary,managerId from emp where name = '张无忌' or name = '宋远桥')
	

事务

# 查看/设置事务提交方式
	select @@autocommit; # 默认1,自动提交
	set @@autocommit = 0;
# 提交事务
	commit;
# 回滚事务
	rollback;

事务隔离级别

# 查看事务隔离级别
	select @@transaction_isolation;
# 设置事务隔离级别
	set session transaction isolation level [read uncommited/read commited];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值