MySQL数据库学习笔记

MySQL学习笔记

数据库特点:

​ 1.持久化存储数据。即为一个文件系统。
​ 2.方便存储的管理数据。
​ 3.使用了统一的方式操作数据库———SQL

SQL

​ 概念:即结构化查询语言。
​ 作用:定义了操作所有关系型数据库的规则。

SQL通用语法

​ 1.SQL语句可以单行和多行书写,以分号结尾。
​ 2.可使用空格和缩进来增强语句的可读性。
​ 3.MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。
​ 4.3中注释d

​ 单行注释: – 注释内容 或 # 注释内容(–和#后有一个空格)

​ 多行注释:/* 注释内容 */

SQL分类

DDL 操作数据库和表
DQL 查询表中的数据
DML 增删改表中的数据
DCL 授权,安全方面

DDL

1.操作数据库:CRUD

​ 1.C(Create):创建
​ *创建数据库并判断是否存在:
​ create database if not exists 数据库名称;
​ *创建数据库指定字符集:
​ create database 数据库名称 character set 字符集名;

​ 2.R(Retrieve):查询
​ *查询所有数据库的名称:
​ show databases;
​ *查询某个数据库的字符集(即查询某个数据库的创建语句):
​ show create database 数据库名称;

​ 3.U(Update):修改
​ *修改数据库的字符集
​ alter database 数据库名称 character set 字符集名称;
​ 4.D(Delete):删除
​ *删除数据库
​ drop database 数据库名称;
​ *删除数据库如果该数据库存在
​ drop database if exists 数据库名称

​ 5.使用数据库
​ *查询当前正在使用的数据库名称
​ select database();
​ *使用数据库
​ use 数据库名称;

2.操作表

​ 1.C(Create):创建
​ *创建表的语法:
​ create table 表名(
​ 列名1 数据类型,
​ 列名2 数据类型,
​ …
​ 列名3 数据类型);

​ *复制表
​ *语法:
​ create table 新表名 like 被复制表名;

​ 2.R(Retrieve):查询
​ *查询某个数据库中所有的表的名称
​ show tables;
​ *查询表结构
​ desc 表名;

​ 3.D(Delect):删除表
​ *判断表是否存在并删除
​ drop table if exist 表名;
​ 4.U(Updata):修改
​ 1.修改表名
​ alert table 表名 rename to 新表名;
​ 2.修改表的字符集
​ alert table 表名 character set 字符集名称;
​ 3.添加一列
​ alter table 表名 add 列名 数据类型;
​ 4.修改列名称 类型
​ *改名同改类型
​ alter table 表名 change 列名 新列名 新数据类型;
​ *只改某列类型
​ alter table 表名 modify 列名 新数据类型;
​ 5.删除列
​ alter table 表名 drop 列名;

3.数据库常用类型:

​ 1.int :整数类型
​ 2.double:小数类型
​ 3.date:日期,只包含年月日,yyyy-MM-dd
​ 4.datetime:日期,包含年月日时分秒,yyyy-MM-dd HH:mm:ss
​ 5.timestamp:时间戳类型,包含年月日时分秒,yyyy-MM-dd HH:mm:ss
​ 注意:该类型如果没有指定时间,或者赋值为null,则默认使用当前系统时间,来自动赋值。
​ 6.varchar:字符串类型
​ 若指定字符数,可使用:varchar(num)

DML

添加数据:

​ *语法:
​ insert into 表名(列名,列名,…,列名n) VALUES (值1,值2,…,值n);
​ *注意:
​ 1.列名和值须一一对应、
​ 2.如果表名后,不定义列名,则默认给所有列添加值
​ insert into 表名 values(值1,…,值2);
​ 3.除了数字类型,其他类型需要使用引号(单双都可以)包裹。

删除数据:

​ *语法:
​ delete from 表名 [where 条件]; //如果不加条件则删除表中所有数据。

​ *删除表中所有数据
​ 1.delete from 表名; //不推荐,有多少条数据就会执行多少次删除操作。 2.TRUNCATE TABLE 表名; //推荐使用效率高,先删除表,再创建一张一样的表。

修改数据:

​ *语法
​ update 表名 set 列名1 = 值1,列名2 = 值2,…,列名n = 值n [where 条件];
​ *注意:如果不加任何条件,则会将表中所有数据全部修改。

DQL

基础查询

​ 基本语法:
​ select 字段名1,字段2… from 表名;
​ 注意:如果查询所有所有字段,可使用*代替。
​ *去除重复
​ 使用 distinct
​ 例如:
​ *计算列:
​ 一般可以使用s四则运算计算一些列的值(一般只会进行数值型的计算)

​ *起别名
​ 使用 as 关键字,as关键字也可省略。

条件查询

​ *where子句后跟条件
​ *运算符:

​ 1.>、<、<=、>=、=、<>
​ 2.BETWEEN…AND (在…之间,含头尾)
​ 3.IN(集合) //相当于多个OR
​ 4.IS NULL (值为NULL时,不能用=判断,必须使用IS(IS NOT) 判断)
​ 5.AND 或 &&
​ 6.OR 或 ||
​ 7.NOT 或 !
​ 8.LIKE : 模糊查询
​ *占位符(如果为字符串,应都放在引号内)

​ _ :代表单个任意字符;
​ %:代表多个任意字符;

排序查询

​ 语法:一个字句,一般添加查询语句后面。
​ order by 排序字段1 排序方式1,排序字段2 排序方式2 …;
​ 排序方式:
​ ASC:升序,默认方式。
​ DESC:降序。
​ 注意:如果有多个排序方式,则当前面的条件值一样时,才会判断第二方式。

聚合函数

​ 即将一列数据作为一个整体,进行纵向计算。(可以拼接查询更多)

​ 1.count 计算个数
​ 如:select count(列名) from 表名;

​ 2.max 计算最大值
​ 如:select max(列名) from 表名;

	3.min  计算最小值  
		如:select min(列名) from 表名;

​ 4.sum 计算和
​ 如:select sum(列名) from 表名;

​ 5.avg 计算平均值
​ 如:select avg(列名) from 表名;

​ 注意:聚合函数计算时排除null值。
​ 解决方案:
​ 1.选择不包含非空的列进行计算。
​ 2.IFNULL函数(用0代替空)
​ 如:select count(IFNULL(列名,0)) from 表名;(其他相同)

分组查询

​ 语法:一个字句
​ group by 分组字段;
​ 例如:SELECT sex,count(id) FROM stu WHERE math > 90 GROUP BY sex HAVING sex;

​ 注意:
​ 1.分组之后的查询的字段:分组字段,聚合函数(其它字段即使不报错也无意义)
​ 2.where 和 having 的区别?(面试重点
​ 1.where 在分组之前进行限定,如果不满足条件,则不参与分组;
​ having在分组之后进行限定,如果不满足结果,则不会显示出来。
​ 2.where后不可以跟聚合函数,having可以进行聚合函数的判断。

分页查询

​ 语法:一个字句
​ limit 开始的索引,每页查询的条数。(从0开始,不包含每页查询的条数的值)
​ 公式:开始的索引 = (当前的页码 - 1) * 每页显示的条数
​ 例子:每页显示三条数据
​ SELECT * FORM 表名 LIMIT 0,3; //第一页
​ SELECT * FORM 表名 LIMIT 3,3; //第二页
​ 注意:
​ 1.如果最后一页数据不够,则只显示剩下的数据。

​ 2.limit语法只能在MySQL中使用,其他数据库分页查询语法与此不同。

约束

*概念:

​ 对表中的数据进行限定,保证数据的正确性,有效性和完整性。

*分类:
1.主键约束:primary key

​ 概念:非空且唯一
​ 注意:一张表只能有一个字段为主键(主键就是表中记录的唯一表示)
​ 使用方式:
​ 1.创建表时添加主键约束
​ CREATE TABLE 表名(
​ id INT PRIMARY KEY);
​ 2.删除主键
​ ALTER TABLE 表名 DROP PRIMARY KEY;
​ 3.创建完表后添加主键
​ ALTER TABLE 表名 列名 数据类型 PRIMARY KEY;
​ 4.自动增长
​ 概念:如果某一列是数值类型的,使用auto_increment 可以完成主键自动增长
​ 使用方式:
​ 1.在创建表时,添加主键约束并且添加自动增长。
​ 例如:CREATE TABLE 表名(id INT PRIMARY KEY auto_increment);
​ 2.删除自动增长
​ ALTER TABLE 表名 MODIFY 列名 数据类型;
​ 3.创建表后添加自动增长
​ ALTER TABLE 表名 MODIFY 列名 数据类型 auto_increment;

2.非空约束:not null

​ 创建表时添加约束:
​ 例如: CREATE TABLE stu( id INT NOT NULL);
​ 更改表的非空约束:
​ ALTER TABLE 表名 MODIFY 列 数据类型 NOT NULL(如果删除非空约束,不加NOT NULL即可);

3.唯一约束:unique

​ 即被约束的内容不可以重复。
​ 注意:Null不参与约束,可以有多个。
​ 使用方式:
​ 1.添加唯一约束(与非空约束相同)
​ 例如:CREATE TABLE stu( id INT UNIQUE);
​ 2.删除唯一约束
​ 例如:ALTER TABLE 表名 DROP INDEX 被约束的列名;

4.外键约束:foreign key

​ 特点:外键的作用是让表与表产生关系,从而保证数据的正确性。
​ 语法:
​ 1.在创建表时,可以添加外键
​ CREATE TABLE 表名(
​ …
​ constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称) //外键名称自定义
​ );
​ 2.删除外键
​ ALTER TABLE 表名 DROP FOREIGN 外键名称;
​ 3.添加外键(创建表后)
​ ALTER TABLE 表名 ADD constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称);

​ 4.级联操作
​ 更改了主表的列,被连接的表指定的关联的数据也会自动更改
​ 1.级联更新
​ ON UPDATE CASCADE;
​ 2.级联删除
​ ON DELETE CASCADE;
​ 3.语法:
​ ALTER TABLE 表名 ADD constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称) ON UPDATE CASCADE ON DELETE CASCADE;

数据库的设计

多表之间的关系
1.一对一

​ 实现方式:在任意一方添加唯一约束外键指向另一方的主键

2.一对多(多对一)

​ 实现方式:在多的一方建立外键,指向一的一方的主键。

3.多对多

​ 实现方式:需要借助第三张中间表。中间表至少包含两个字段,这两个字段作为第三张表的外键,分别指向两张表的主键。

范式
概念:

​ 设计数据库时,需要遵循的一些规范。要遵循后边的范式要求,必须先遵循前边的所有范式要求。
​ 分类:
​ 1.第一范式(1NF)
​ 每一列都是不可分割的原子数据项。

​ 2.第二范式(2NF)
​ 在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)
几个概念:
​ 函数依赖:A —>B,如果通过A属性(属性组)的值,可以确定唯一B的属性,则称B依赖于A。
​ 例如:学号—>姓名, (学号,课程名) —>分数

​ 完全函数依赖:A–>B,如果A是一个属性组,则B属性值的确定需要依赖于A属性组中所有的属性值。
​ 例如:(学号,课程名)–>分数

​ 部分函数依赖:A–>B,如果A是一个属性组,则B属性值的确定只需要依赖于A属性组中的某一些值即可。
​ 例如:(学号,课程名)–>姓名

​ 传递函数依赖:A–>B,B–>C,如果通过A属性(属性组)的值,可以确定唯一的B属性的值,再通过B属性(属性组)的值可以确定唯一C属性的值,则称C传递函数依赖于A。
​ 例如:学号–>系名,系名–>系主任

​ 码:如果在一张表中,一个属性或属性组,被其他属性所有完全依赖,则称这个属性(属性组)为该表的吗。
​ 例如:(学号,课程名)–>系,系主任,分数…
​ *主属性:码属性组中的所有属性。
​ *非主属性:除去主码属性组的属性。

​ 3.第三范式(3NF)
​ 在2NF的基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)

数据库的备份和还原

方式:

​ 1.命令行:
​ 语法:
​ 备份:mysqldump -u用户名 -p密码 数据库名 > 保存的路径(不用登录)
​ 还原:
​ 1.登录数据库
​ 2.创建数据库
​ 3.使用数据库
​ 4.执行文件。source 文件路径
​ 2.图形化工具

多表查询

笛卡尔积:

​ 有两个集合A,B,取这两个集合的所有组成情况。
​ 要完成多表查询,需要消除无用数据。

多表查询的分类:
内连接查询:

​ *隐式内连接:使用WHERE条件
​ 例子:
​ --查询员工表的名称,性别。部门表的名称
​ SELECT
​ emp.name,
​ emp.gender,
​ dept,name
​ FROM
​ emp,
​ dept
​ WHERE
​ emp.‘dept_id’ = dept.‘id’;

​ (上述语句书写格式为标准格式)

​ *显示内连接

​ 语法:select 字段列表 from 表名1 [inner] join 表名2 ON 条件;

​ 例子:
​ SELECT * FROM emp INNER JOIN dept ON emp.‘dept_id’ = dept.‘id’;

​ *注意事项

​ 1.从哪些表中查询数据
​ 2.条件是什么
​ 3.查询哪些字段

外链接查询:

​ *左外连接
​ 语法:SELECT 字段名称 FROM 表1 LEFT [Outer] JOIN 表2 ON 条件;
​ 查询的是左表所有数据以及其交集部分(即使右表有空也可查询)。
​ *右外连接
​ 语法:SELECT 字段名称 FROM 表1 RIGTH [Outer] JOIN 表2 ON 条件;
​ 查询的是右表所有数据以及其交集部分(即使左表有空也可查询)。

子查询:

​ *概念:
​ 查询中嵌套查询,称嵌套查询为子查询。
​ 例如:SELECT * FROM stumsg WHERE stumsg.english = (SELECT MAX(english) FROM stumsg);

​ *子查询不同情况
​ 1.子查询的结果时单行单列的:
​ *子查询可以作为条件,使用运算符去判断。运算符:>,<,<=,>=,=
​ *SELECT * FROM emp WHERE emp.salary < (SELECT AVG(salary) FROM emp)

​ 2.;子查询的结果时多行单列的:
​ *子查询可以作为条件,使用运算符in来判断
​ *SELECT * FROM emp WHERE dept_id IN (SELECT id FROM dept WHERE NAME = “财务部” OR NAME=“市场部”);

​ 3.子查询的结果是多行多列的:
​ *子查询可以作为一张虚拟表
​ *例如:查询员工入职日期是2011-11-11日之后的员工信息和部门信息
​ 1.子查询方式:
​ SELECT * FROM dept t1,(select * from emp where emp.‘join.date’ > ‘2011-11-11’ ) t2 where t1.id = t2.dept.id;
​ 2.普通内连接方式:

​ SELECT * FROM emp t1,dept t2 WHERE t1.‘dept.id’ = t2.‘id’ and t1.‘join_date’ > ‘2011-11-11’;

事务

事务的基本介绍

​ 概念:如果一个包含多个步骤的业务操作被事务管理,那么这些操作要么同时成功,要么同时失败。
​ 操作:
​ 1.开启事务:start transaction;
​ 2.回滚:ROOLBACK
​ 3.提交:COMMIT
​ 解释:当SQL语句放在上述操作内部时,如果中间出错,结果不变,如果中间无错,结果正常。
​ 注意:MySQL数据库中事务默认自动提交(而Oracle是手动提交事务)
​ *事务提交的两种方式:
​ 1.自动提交
​ *一条DML语句会自动提交一次事务。
​ *MySQL就是自动提交的
​ 2.手动提交
​ *需要开启事务再提交
​ *修改事务的默认提交方式:
​ 1.查看事务的默认提交方式: SELECT @@autocommit; – 1代表自动提交,0代表手动提交;
​ 2.修改事务的默认提交方式:SET @autocommit = 0;

事务的四大特征(面试重点)
1.原子性

​ 是不可分割的最小操作单位,要么同时成功,要么同时失败。

2.持久性

​ 当事务提交或回滚后,数据库会持久化的保存数据。

3.隔离性

​ 多个事务之间,相互独立。

4.一致性

​ 表示事务操作前后,数据总量不变。

事务的隔离级别(了解)

​ 概念:多个事务之间是隔离的,相互独立的,但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。

​ 存在问题:
​ 1.脏读:一个事务,读取到另一个事务中没有提交的数据

​ 2.不可重复读(虚读):在同一个事务中,两次读取到的数据不一样。

​ 3.幻读:一个事务操作(DML)数据表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改。

​ 隔离级别:
​ 1.read uncommitted: 读未提交
​ *产生的问题:脏读,虚读,幻读。
​ 2.read committed:读已提交 (Oracle默认)
​ *产生的问题:虚读,幻读。
​ 3.repeatable read:可重复读 (MySQL默认)
​ *产生的问题:幻读
​ 4.serializable:串行化
​ *可以解决所有的问题

​ *注意:隔离级别从1-4安全性越来越高,但是效率越来越低
​ *数据库查询隔离级别:
​ *select @tx_isolation;
​ *数据库设置隔离级别:
​ *set global transaction isolation level 级别字符串;

DCL

概念:

​ 管理用户与授权。

管理用户:

​ 1.添加用户:
​ 语法: CREATE USER ‘用户名’ @‘主机名’ IDENTIFIED BY ‘密码’;
​ 注意:通配符%代表可以在所有主机使用用户登录数据库。

​ 2.删除用户:
​ 语法:DROP USER ‘用户名’ @ ‘主机名’;

​ 3.修改用户密码:
​ 方式一:UPDATE 密码表名 SET PASSWORD = PASSWORD(‘新密码’) WHERE USER = ‘用户名’;
​ 方式二:SET PASSWORD FOR ‘用户名’ @ ‘主机名’ = PASSWORD(‘新密码’);
​ *注意:MySQL中忘记了root用户的密码怎么办?
​ 第一步:cmd命令 —> net stop mysql 停止mysql服务
​ *需要管理员运行该cmd.
​ 第二步:使用无验证方式启动mysql服务:mysqld --skip-grant-tables
​ 第三步:打开新的cmd窗口,直接输入mysql命令无需密码。回车,即可直接登录成功
​ 第四步:use mysql
​ 第五步:UPDATE 密码表名 SET PASSWORD = PASSWORD(‘新密码’) WHERE USER = ‘root’;(设置新密码)
​ 第六步:关闭两个窗口
​ 第七步:打开任务管理器,手动结束mysqld.exe的进行
​ 第八步:启动mysql服务
​ 第九步:使用新密码登录

​ 4.查询用户:
​ 1.切换到MySQL数据库
​ USER mysql;

​ 2.查询USER表
​ SELECT * FROM USER;

权限管理

​ 1.查询权限:
​ 语法:SHOW GRANTS FOR ‘用户名’@‘主机名’ ;
​ 2.授予权限:
​ 语法:
​ *GRANT 权限列表 ON 数据库名.表名 TO ‘用户名’ @ ‘主机名’;
​ *GRANT ALL ON * . * TO ‘用户名’ @ ‘主机名’; --给某用户赋所有数据库的所有表的所有权限。
​ 3.撤销权限
​ 语法:
​ *revoke 权限列表 ON 数据库名.表名 FROM ‘用户名’ @ ‘主机名’;
​ *revoke ALL ON * . * FROM ‘用户名’ @ ‘主机名’; --给某用户撤销所有表的所有权限


你可能感兴趣的:(数据库)