Mysql基础篇笔记 (黑马)

MySQL基础篇

目录

MySQL基础篇

一、MySQL概述

1.1 概念

1.2 MySQL的安装与启动 

1.安装

 2.启动

 3.连接数据库

 二、SQL

 2.1 SQL通用语法

2.2 SQL分类

 2.3 DDL

1.数据库操作

2 表操作

3 数据类型

 2.4 DML

1 添加数据

 2 修改数据

3 删除数据

2.5 DQL

1 DQL的语法前后顺序

2 DQL关键字执行的前后顺序

​编辑

3 基本查询

4 条件查询

 5 聚合函数

6 分组查询

7 排序查询

8 分页查询

2.6 DCL

1 用户管理

2 权限控制

三 函数

3.1 字符串函数

3.2 数值函数

3.3 日期函数

3.4 流程函数

四、约束

4.1 概述

4.2 约束演示

4.3 外键约束

五、多表查询

5.1 多表关系

5.2 多表查询概述

5.3 内连接

5.4 外连接

5.5 自连接

5.6 联合查询、子查询

1 联合查询

2 子查询

六、事务

6.1 事务操作

6.2 事务的四大特性

6.3 并发事务问题

6.4 事务隔离级别


一、MySQL概述

1.1 概念

  1. 数据库:存储数据的仓库,数据有组织的进行存储 DataBase (DB)
  2. 数据库管理系统:操纵和管理数据库的大型软件 DataBase Management System(DBMS)
  3. SQL:操纵关系型数据库的编程语言,定义了一套操作关系型数据库统一标准 Struactured Query Language (SQL)
  4. 关系型数据库:建立在干洗模型基础上,由多张相互连接的二维表注册的数据库
  5.             特点:使用表存储数据,格式统一,便于维护

                           使用SQL语言操作,标准统一,使用方便,学习成本低               

  6. MySQLSession如何存储数据:

1.2 MySQL的安装与启动 

1.安装

①进入Mysql官网:MySQL

②点击downloads

③下滑选择社区免费版  

④选择对应操作系统的版本

⑤下载安装包  

 2.启动

安装完毕后默认是开机自动启动

也可以在cmd窗口进行命令行控制

# 启动

net start mysql80

# 停止

net start mysql80

 3.连接数据库

在cmd窗口使用系统自带的命令行工具执行命令

如果想随处使用及得配置环境变量

环境变量配置完毕后  输入mysql [-h 127.0.0.1] [-p 3306] -u root -p \

 二、SQL

 2.1 SQL通用语法

  1. SQL语句可以单行或者多行书写,以分号结尾
  2. SQL语句可以使用空格或缩进来增强语句的可读性
  3. MySQL数据库的SQL语句不区分大小写,关键字建议使用大写
  4. 注释   单行注释:    - - 注释内容  或者 # 注释内容(MySQL特有)  多行注释: /* 注释内容 */

2.2 SQL分类

分类全称说明
DDLData Definition Lauguage数据定义语言,用来定义数据库对象(数据库,表,字段)
DMLData Manipulation Lauguage数据操作语言,用来对数据库表中的数据进行增删改
DQLData Query Lauguage数据查询语言,用来查询数据库中表的记录
DCLData Control Lauguage数据控制语言,用来创建数据库用户、控制数据库的访问权限

 2.3 DDL

1.数据库操作

1.1 查询

查询所有数据库

show databases;

查询当前数据库名称

select database();

1.2 创建

create database [if not exists] 数据库名 [default char set 字符集] [collate 排序规则];

create database if not exists mysql_test default char set 'utf8mb4';

1.3 删除

drop database if exists 数据库名;

1.4 使用数据库

use 数据库

2 表操作

2.1 查询当前数据库中所以表

show tables;

 2.2 查询表结构

desc 表名;

 2.3 查询制定本IAO的建表语句

show create table 表名;

2.4 表结构创建  

CREATE TABLE 表名 (
    字段1 字段1类型 [COMMENT 字段1注释],
    字段2 字段2类型 [COMMENT 字段2注释],
    字段3 字段3类型 [COMMENT 字段3注释]
)[COMMENT 表注释];


CREATE TABLE `drug`  (
  `id` int primary key auto_increment,
  `schedule_id` varchar(255) ,
  `create_time` timestamp  COMMENT '创建时间',
  `update_time` timestamp COMMENT '更新时间'  
); COMMENT '数据字典'

2.5 修改表字段,表名

-- 添加字段
alter table 表名 add 字段名称 类型 [comment 注释] [约束];

-- 修改字段类型
alter table 表名 modify 字段名 新数据类型;

--修改字段名称和字段类型
alter table 表名 change 旧字段名 新字段名 新数据类型 [comment 注释] [约束];

-- 修改表名
alter table 表名 rename to 新表名;

2.6 删除表字段和表

-- 删除表字段
alter table 表名 drop 字段名;

-- 删除表
drop table if exists 表名

-- 删除指定表,并重新创建该表  即清空数据
truncate table 表名;

3 数据类型

3.1 数值类型

  

3.2 字符串类型

 3.3 日期类型

 2.4 DML

数据操作语言,用来对数据库表中的数据进行增删改

1 添加数据

给指定字段添加数据

insert info 表名(字段1,字段2,...) values(值1,值2,.....);

给全部字段添加数据

insert into 表名 values(值1,值2,....)

批量添加数据

insert info 表名(字段1,字段2,...) values(值1,值2,.....),values(值1,值2,.....);

insert into 表名 values(值1,值2,....),values(值1,值2,....)

例如:

INSERT INTO drug VALUES(1,1,1,'张三','李四','www','ww',1,'2023-2-12','2023-2-12',1);

注意:

  • 插入数据时,指定的字段顺序需要与值的顺序是一一对应
  • 字符串和日期类型的数据应该包含在引号中  单引号双引号都行
  • 初入的数据大小,应该在字段的规定范围内

 2 修改数据

update 表名 set 字段1  = 值1 ,字段2 = 值2 ,。。。[where 条件];

注意:修改语句的条件可以有,也可以没有,如果没有条件,则会修改整张表的所有数据

3 删除数据

delete form 表名 [where 条件] 

注意:delete语句的条件可以有,也可以么有,如果没有条件,则会删除整张表的所有数据。

          delete语句不能删除某一字段的值,只能删除一列或者多列              

2.5 DQL

数据查询语言,用来查询数据库中表的记录

1 DQL的语法前后顺序

2 DQL关键字执行的前后顺序

3 基本查询

查询多个字段

select 字段1,字段2,字段3,....from 表名;

select * from 表名; 一般尽量不使用* 效率不高,可读性也不高

设置别名

select 字段1 [as 别名],字段2 [as 别名] ...from 表名;

as可以省略 写成字段1 别名的格式

去除重复记录

select distinct 字段列表 from 表名

4 条件查询

select 字段1,字段2 from 表名 where 条件列表

 这里注意: _点任意单个字符  %匹配任意个字符

例如 匹配身份证号为最后一个为x   _的表示就是 infoNO = ——————x(前面是17个_)

                                                        %的表示就是infoNo=%x

 5 聚合函数

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

常见的聚合函数:

注意:所有的null不参与聚合函数的运算 

6 分组查询

select 字段列表 form 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件] 

where和having的区别:

执行时机不同:where是分组之前进行过滤,不满足where条件不进行分组;having是分组之后对结果进行过滤

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

7 排序查询

select 字段列表 form 表名 order by 字段1 排列方式1 ,字段2 排列方式2

排列方式:ASC升序排列(默认) DESC降序排列

注意:如果是多字段排序,当第一个字段相同的时候,才会根据第二个字段进行排序

8 分页查询

select 字段列表 form 表名 limit 起始索引,查询记录数;

注意:

  • 起始索引是从0开始,其实索引 = (查询页码 -1) *每页显示记录数
  • 分页穿线是数据库的方言,不同数据库有不同的实现,MySQL是Limit
  • 如果查询的是第一个数据,起始索引可以省略,直接简写为Limit 10 

举例: 查一个每页显示10条 limit 0,10 或者 limit 10 

            查第二页每页显示10条 limit 10 ,10

2.6 DCL

数据控制语言,用来创建数据库用户、控制数据库的访问权限

1 用户管理

 查询用户

use mysql;

select * from user

创建用户

create user '用户名'@'主机名' identified by '密码'

如果只能是当前主机 主机名写localhost

如果是任意主机  主机名写%

修改用户密码

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

删除用户

drop user '用户名'@'主机名';

2 权限控制

权限列表:

2.1 查询权限

show grants for '用户名'@'主机名';

2.2 收授予权限

grant 权限列表 on 数据库名.表名 TO '用户名'@'主机名'

2.3 撤销权限

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

注意:多个权限之间,使用逗号分隔

           授权时,数据库名和表名可以使用*进行通配,代表所有

三 函数

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

3.1 字符串函数

select concat('ww','tt');  -- wwtt
select lower('Hello'); -- hello
select upper('Hello'); -- HELLO
select lpad('1',5,'0'); -- 00001
select rpad('1',5,'0'); -- 10000
select trim(' mysql test '); -- mysql test
select substring('hello test', 1, 5); -- hello

3.2 数值函数

select ceil(1.1); -- 2
select floor(1.6); -- 1
select mod(3,4); -- 3
select rand(); -- [0,1)
select round(2.345,2);  -- 2.35

3.3 日期函数

select curdate(); -- 2023-02-13
select curtime(); -- 6:21:33
select now();-- 2023-02-13 06:22:29
​
select year(now()); -- 2023
select month(now()); -- 2
select day(now()); -- 13
​
select  date_add(now(),INTERVAL 70 DAY ); -- 2023-04-24 06:25:00
select  date_add(now(),INTERVAL 70 MONTH ); -- 2028-12-13 06:25:38
​
select datediff('2020-09-01','2018-05-12'); -- 843天

3.4 流程函数

select  if(true,'ok','error');  -- ok
​
select ifnull('ok','default'); -- ok
select ifnull('','default'); -- ''
select ifnull(null,'default'); -- default
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) '语文'
rom score;
-- case when then else end
-- 需求:查询mp表的员工姓名和工作地址(北京/上海--->一线城市,其他-->二线城市)
select
name,
(case workaddress when '北京' then '一线城市' when '上海' then '二线城市' else '三线城市 
 end) as '工作地址'
from emp;

四、约束

4.1 概述

1 概念

约束是作用于表中字段上的规则,用于限制存储在表中的数据

2 目的

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

3 分类

注意:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。

4.2 约束演示

CREATE TABLE user_test (
    id int PRIMARY KEY AUTO_INCREMENT COMMENT 'id唯一标识',
    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 '性别'
)

4.3 外键约束

阿里开发规约:强制不得使用外键与级联,一切外键概念必须在应用层解决。

因此这里不记录笔记

五、多表查询

5.1 多表关系

项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:

一对多 、多对多、一对一

5.2 多表查询概述

1 概述

指从多张表中查询数据

2 笛卡尔积

笛卡尔积是指在数学中,两个集合A集合和B集合的所有组合情况(在多表查询中,需要消除无效的笛卡尔集)

3 多表查询的分类

连接查询

内连接:相当于查询A、B交集部分数据

外连接:

左外连接:查询左表所有数据,以及两张表中交集部分数据

右外连接:查询右表所有数据,以及两张表中交集部分数据

自连接:当前表与自身的连接查询,连接必须使用表别名

子查询

5.3 内连接

1 隐式内连接

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

举例:

SELECT emp.name,dept.name FROM emp,dept WHERE emp.dept_id = dept.id;
或者
SELECT e.name,d.name FROM emp e,dept d WHERE e.dept_id = d.id;

2 显示内连接

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

举例:

SELECT emp.name,dept.name FROM emp INNER JOIN dept on emp.dept_id = dept.id
或者
SELECT e.name,d.name FROM emp e INNER JOIN dept d on e.dept_id = d.id;

5.4 外连接

1 左外连接

SELECT 字段列表 FROM 表1 LEFT JOIN 表2 ON 条件

相当于查询左表和两个表交集部门的数据

2 右外连接

SELECT 字段列表 FROM 表1 RIGHT JOIN 表2 ON 条件

为什么使用外连接:

当没有关联数据的时候(条件不符合为null的时候),使用内连接的时候不会显示这条数据,为了保持数据的全面性,这时候使用外连接

5.5 自连接

SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件

自连接查询可以是内连接也可以是外连接。

当出现这种查询员工所属领导信息的时候, 领导也是员工涉及的表结构就是一个表,我们使用自连接

案例:

-- 1。查询员工及其所属领导的名字
-- 表结构:emp a,emp b
select a.name,b.name from emp a,emp b where a.managerid= b.id;
-- 2。查询所有员工的名字及其领导的名字,如果员工没有领导,也需要查询出来
-- 表结构:emp a,emp b
select a.name '员工',b.name '领导' from emp a left join emp b on a.managerid=b.id;

5.6 联合查询、子查询

1 联合查询

对于union查询,就是把多次查询的结果合并起来,形成一个新的查询结果集。

SELECT 字段列表 FROM 表A 
UNION
SELECT 字段列表 FROM 表B 

举例:

注意: 多张表的列数必须保持一致,字段类型也需要保持一致

UNION ALL 会将全部的数据直接合并在一起,union会对合并之后的数据去重。

2 子查询

①语法

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

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

子查询外部的语句可以是INSERT,UPDATE,DELETE,SELECT的任何一个。

②子查询分类

子查询结果不同分为:

  • 标量子查询(子查询为单个值)

  • 列子查询(子查询为一列)

  • 行子查询(自查询为一行)

  • 表子查询(子查询结果为多行多列)

根据子查询的位置分为:

  • WHERE之后

  • FROM之后

  • SELECT之后

③标量子查询

子查询返回结果是单个值(数字、字符串、日期),最简单的形式,这种 子查询称为标量子查询

常见的操作符:= <> >= < <=

SELECT * FROM emp WHERE dept_id = (SELECT id FROM dept where name = '销售部')

④列子查询

子查询返回的结构是一列(可以是多行),这种子查询称为列子查询

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

SELECT * FORM emp WHERE dept_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 (job,salary) in (SELECT job,salary FROM emp WHERE name = '鹿杖客' or name = '宋远桥')
或者是
SELECT e.*,d.* FROM (SELECT * FROM emp WHERE entrydate > '2006-01-01') e LEFT JOIN dept d ON e.dept_id = d.id;

六、事务

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

6.1 事务操作

  • 查看/设置事务提交方式

    # 1代表自动提交   0代表手动提交
    SELECT @@autocommit;
    SET @@autocommit = 0;
  • 提交事务

    COMMIT;
  • 回滚事务

    ROLLBACK
  • 开启事务

    START TRANSACTION 或者 BEGIN;
  • 提交事务

    COMMIT
  • 回滚事务

    ROLLBACK

6.2 事务的四大特性

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

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

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

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

6.3 并发事务问题

  • 脏读:一个事务读取到另一个事务还没有提交的数据。

为什么一个事务可以读取到另一个事务还没有提交的数据?
  目前主流的关系型数据库例如mysql、oracle都是基于文件系统进行数据存储的,即数据是持久化到文件系统的,但是基于文件系统的随机IO读写是非常慢的,故数据库都会引入内存池,完成对磁盘数据的缓存,提高读写效率
  
  内存池是对所有线程共享的,也就是对所有数据库事务是共享的,所谓的未提交,指的是事务未提交,但此时数据已经存储在共享内存中,数据已经进入数据库服务器,所有是可见的。
  脏读,是指的最终效果,其实是在数据库中对应读到未提交的数据。

 当事务1,2需要访问同一条数据,事务2从数据库读取的数据是事务1未提交的数据,但当事务1回滚,导致事务2读到的数据并不是最终存储在数据库中的数据,导致所谓的脏读发生
​
​
  这个是最低级别的隔离机制,此隔离级别基本不会在实际生产过程中使用
  • 不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。

  • 幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据的时候,有发现这行数据已经存在,好像出现了幻影

6.4 事务隔离级别

隔离界别脏读不可重复读幻读
Read uncommitted 读未提交无法解决无法解决无法解决
Read committed 读已提交解决无法解决无法解决
Repeatable Read (MySQL默认) 可重复读解决解决无法解决
Serializable 串行化解决解决解决
-- 查看事务的隔离级别
SELECT @@TRANSACTION_ISOLATION;
​
-- 设置事务隔离级别
​
SET  TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
​
SET  TRANSACTION ISOLATION LEVEL  READ UNCOMMITTED; 

注意:事务隔离级别越高,数据越安全,但是性能越低。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值