MySQL学习笔记(上)

1.MySQL概述

数据库:数据存储的仓库 DB

数据库管理系统:操纵和管理数据库的大型软件 DBMS

SQL:操作关系型数据库的编程语言 SQL

关系型数据库(RDBMS)

概念:建立在关系模型基础上,由多张相互连接的二维表组成的数据库。

特点:1.使用表存储结构,格式统一,便于维护 2.使用SQL语言操作,标准统一,使用方便

2.SQL

SQL通用语法

1.单行或多行,以分号结尾

2.用空格/缩进来增强可读性

3.SQL语句不分大小写,关键字建议使用大写

4.注释:

1.单行注释 --注释 #注释

2. 多行注释:/注释/

SQL分类

数据类型

MySQL 数据类型 | 菜鸟教程

数值类型

日期和时间类型

字符串类型

定长:char() 性能好

变长:varchar() 性能差

DDL-数据定义语言

数据库操作

查询

查询所有数据库

SHOW DATABASES;

查询当前数据库

SHOW DATABASE();

创建

SELECT DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARSET 字符集][COLLATE 排序规则] #方括号中可选

删除

DROP DATABASE [IF EXISTS] 数据库名;

使用

USE 数据库名;

表操作

查询

1.查询所有表

SHOW TABLES;

2.查询表结构

DESC 表名;

3.查询指定表的建表语句

SHOW CREATE TABLE 表名;

创建

CREATE TABLE 表名{
	字段1 字段1类型[COMMENT 字段1注释],
	字段2 字段2类型[COMMENT 字段2注释],
	字段3 字段3类型[COMMENT 字段3注释],
	......
	字段n 字段n类型[COMMENT 字段n注释],
}[COMMENT 表注释];

create table employee
(
    id     int comment '学号',
    name   varchar(30) comment '姓名',
    gender char(1) comment '性别',
    id_card int comment '身份证号'
)comment '员工表';

修改

添加字段

ALTER TABLE 表名 ADD字段名类型(长度) [COMMENT 注释] [约束];

alter table employee add grade smallint comment '成绩';

修改数据类型

ALTER TABLE 表名 MODIFY 字段名 新的数据类型(长度);

alter table employee modify id_card char(18);

修改字段名和字段类型

ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度) [COMMENT 注释] [约束];

删除字段

ALTER TABLE 表名 DROP 字段名;

修改表名

ALTER TABLE 表名 RENAME TO 新表名;

删除表

DROP TABLE [IF EXISTS] 表名;

DML-数据操作语言

添加数据

1.给指定字段添加数据

INSERT INTO 表名(字段1,字段2,...) VALUES(值1,值2...);

2.给全部字段添加数据

INSERT INTO 表名 VALUES(值1,值2,...);

3.批量添加数据

INSERT INTO 表名(字段名1,字段名2,...) VALUES(值1,值2,...)(值1,值2,...)(值1,值2,...);
INSERT INTO 表名 VALUES(值1,值2,...)(值1,值2,...)(值1,值2,...);

insert into employee(id,name,gender,id_card,grade) values(1,'张三','男','1234567',100),(2,'李四','男','1236666',60);

修改数据

UPDATE 表名 SET 字段名1=值1,字段名2=值2,...[WHERE 条件];

删除数据

DELETE FROM 表名 [WHERE 条件]

DQL-数据查询语言

SELECT
	字段列表
FROM 
	表名列表
WHERE
	条件列表
GROUP BY
	分组字段列表
HAVING
	分组后条件列表
ORDER BY
	排序字段列表
LIMIT
	分页参数

基本查询

1.查询多个字段

SELECT 字段1,字段2,字段3... FROM 表名;
​
SELECT * FROM 表名;

2.设置别名

SELECT 字段1 [AS 别名1],字段2 [AS 别名2]...FROM  表名;

3.去除重复记录

SELECT DISTINCT 字段列表 FROM 表名;

条件查询

1.语法

SELECT 字段列表 FROM 表名 WHERE 条件列表;

2.条件

聚合函数

注意:null值不参与计算

SELECT 聚合函数(字段列表) FROM 表名

select sum(age) from emp where workaddress = '西安';

分组查询

分组之后查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。

SELECT 字段列表 FROM 表名 [WHERE 条件] GROUP BY 分组字段名 [HAVING 分组后过滤条件];

select workaddress, count(*) address_count from emp where age < 45 group by workaddress having address_count >=3;

where和having的区别

执行时机:where在分组前过滤,having是在分组之后对结果进行过滤

判断条件不同:where不能对聚合函数进行判断,having可以

排序查询

1.语法

SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1,字段2 排序方式2;
​
select *from emp order by age asc; #默认升序
select *from emp order by age desc;
​
select * from emp order by age asc, entrydate desc; #多字段,先按照age升序排序,age一样时才会根据entrydate降序排序

2.排序方式

ASC:升序

DESC:降序

多字段排序时,当第一个字段相同时才会按照第二个排序

分页查询

1.语法

SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询记录数;

DCL-数据控制语言

1.管理用户

主机名可以用通配符%

USE mysql;
SELECT *FROM user;

2.创建用户

CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';

3.修改用户密码

ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码';

4.删除用户

DROP USER '用户名'@'主机名';

权限控制

1.查询权限

SHOW GRANTS FOR '用户名'@'主机名';

2.授予权限

GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
​
grant all on itcast.* to 'heima'@'%';

3.撤销权限

REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';

3.函数

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

字符串函数

select concat('Hello','MySQL');

select lower('Hello');

select lpad('01',5,'-') #---01

select rpad('01',5,'-') #01---

select trim(' Hello MySQL ') #Hello MySQL

将员工工号变为5位,不足补0

update emp set workno = lpad(workno,5,'0');

数值函数

生成一个6位数的随机验证码

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

日期函数

查询入职天数,根据天数倒序排序

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

流程函数

需求:查询emp表的员工姓名和工作地址,如果是北京上海则显示一线城市,否则显示二线城市

select 
	name,
	(case workaddress when '北京' then '一线城市' when '上海' then '一线城市' else '二线城市' end) as '工作地址'
from emp;	

需求:对成绩进行分级

select 
	id,
	name,
	(case when math >= 85 then '优秀' when math >= 60 then '及格' else '不及格' end) '数学',
	(case when english >= 85 then '优秀' when english >= 60 then '及格' else '不及格' end) '英语',
	(case when chinese >=85 then '优秀' when chinese >= 60 then '及格' else '不及格' end) '语文'
from score;

4.约束

概念:作用于表中字段上的规则,用于限制存储在表中的数据。

目的:保证数据库中数据的正确、有效性和完整性。

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 '用户表';

外键约束

两张表之间建立连接,保证数据的一致性和完整性。

子表:具有外键的表

父表:外键关联的表

CREATE TABLE 表名(
	字段名 数据类型,
    ...
    [CONSTRAINT] [外键名称] FOREIGN KEY(外键字段名) REFERENCES 主表(主表列名)
);

ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY(外键字段名) REFERENCES 主表(主表列名);

ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;

添加外键

alter table emp add constraint fk_emp_dept_id foreign key(dept_id) references dept(id);

删除外键

alter table emp drop foreign key fk_emp_dept_id;

删除/更新行为

ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY(外键字段) REFERENCES 主表名(主表字段名) ON UPDATE CASCADE ON DELETE CASCADE;

5.多表查询

多表关系

各个表结构之间的联系:一对多、多对多、一对一

一对多

部门一,员工多

实现:再多的一方建立外键,指向一的一方

多对多

学生和课程的关系

实现:建立第三张表,中间表至少包含两个外键,分别关联两方主键。

一对一

用户和用户详情的关系,多用于单表拆分

实现:在任意一方加入外键,关联另一方主键,并且设置外键为唯一的。

多表查询概述

指从多张表中查询数据

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

SELECT *FROM 表名1, 表名2 WHERE 条件;

多表查询分类

查询连接:内连接、外连接、子查询

子查询

内连接

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

隐式内连接

SELECT 字段列表 FROM 表1,表2 WHERE 条件...;

select e.name, d.name from emp e, dept d where e.dept_id = d.id; #起了别名后就不能再用表名了

显示内连接

SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 连接条件...;

select e.name,d.name from emp e inner join dept d on e.dept_id= d.id;

外连接

左外连接

包含表1的所有数据和两表的交集

SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件...;
​
select e.*, d.name from emp e left outer join dept d on e.dept_id= d.id;

包含表2的所有数据和两表的交集

右外连接

SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件...;
​
select d.*, d.* from emp e right outer join dept d on e.dept_id= d.id;

自连接

可以是内连接,也可以是外连接

SELECT 字段列表 DROM 表A 别名A JOIN 表A 别名B ON 条件...;
​
#内连接
select a.name, b.name from emp a, emp b where a.mangerid= b.id; 
​
#外连接,左外,包含员工表所有信息
select a.name '员工', b.name '领导' from emp a left join emp b on a.mangerid= b .id;

联合查询

把多次查询结果合并

SELECT 字段列表 FROM 表A...
UNION[ALL]
SELECT 字段列表 FROM 表B...;

select *from emp when salary < 5000;
union all #有重复
select * from emp where age > 50;

select *from emp when salary < 5000;
union #去重
select * from emp where age > 50;

子查询

嵌套SELECT语句,称为嵌套查询,又称子查询

SELECT *FROM t1 WHERE column1= (SELECT column1 FROM t2);

标量子查询

子查询返回结果是单个值,如一个部门的id,一个员工的入职时间

select * from emp where dept_id= (select id from dept where name= '销售部'); #查询销售部的人
​
select* from emp where entrydate> (select entrydate from emp where name  = '方东白');

列子查询

子查询返回结果是一列

常用操作符:IN 、NOT IN、ANY、SOME、ALL

select * from emp where dept_id in (select id from dept where name = '销售部' or name= '市场部');

select * from emp where salary > all (select salary from emp where dept_id= (select id from dept where name = '财务部'));

行子查询

子查询返回的结果是一行

表子查询

子表返回的结果是多行多列

select * from emp where (job,salary) in (select job, salary from emp where name= 'zhangsan' or name= 'lisi');

综合应用

查询工资所有低于本部门员工平均薪资的员工信息

select * from emp e2 where e2.salary <(select avg(e1.salary) from emp e1 where e1.dept_id = e2.dept_id);    

6.事务

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

事务操作

select @@autocommit;
--设置为提交方式 0位手动 1位自动
set @@autocommit = 0;
--转账操作
start transaction;
​
select * from account where name= '张三';
​
update account set money = money - 1000 where name = '张三';
​
update account set money = money + 1000 where name= '李四';
​
--提交事务
commit;
--回滚事务
rollback;

事务四大特性

原子性:事务是不可分割的最小操作单元,要么全成功,要么全失败

一致性:事务完成时,必须使所有的数据都保持一致状态。

隔离性:数据库提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。

持久性:事务一旦提交或回滚,他对数据库中的数据的改变就是永久的。

并发事务问题

事务隔离级别

--查看事务隔离级别
SELECT @@TRANSACTION_ISOLATION;

--设置事务隔离级别
SET [SESSION\GLOBAL] TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE];

  • 13
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

捕赤鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值