MySQL学习笔记
目录
第一部分,数据库介绍
第二部分,SQL语言
第三部分,数据完整性
第四部分,多表查询
第五部分,子查询
第六部分,事务
第七部分,视图
第八部分,自定义函数和存储过程
第九部分,索引
第一部分,数据库介绍
1. DBMS:数据库管理系统,一个管理数据库的软件,通常所说的数据库(Oracle、DB2、MySQL、SQL Server)都是指的数据库管理系统。
2. 常见数据库:
a. Oracle:运行稳定,可移植性高,功能齐全,性能超群,适用于大型企业领域,甲骨文公司的产品,收费!
b. DB2:速度快,可靠性好,适用于海量数据,恢复性极强,适用于大中型企业领域,IBM公司的产品,收费!
c. MySQL,开源,体积小,速度快,适用于中小型企业领域,甲骨文公司产品,免费!
d. SQL Server:全面,效率高,界面好,操作容易,但是不跨平台,适用于中小型企业领域,微软公司产品,收费!
3. 数据库类型:关系型数据库(Oracle、DB2、MySQL、SQL Server),非关系型数据库NOsql(MongoDB、Redis、HBase)。
4. RDBMS(关系型数据库)专业术语:数据库,表,列,行,主键,外键,索引。
5. 修改MySQL数据库的密码:
方法一:命令提示符中,在数据库”MySQL”下执行:alter user
‘root’@’localhost’ identidied by ‘新密码’;
方法二:在命令提示符下执行:mysqladmin -u root –p ‘新密码’; 回车后 输入’旧密码’。
6. 语句结束要用分号;。
7. MySQL数据库:
A. 系统数据库(安装完成之后默认自带4个):
a. Information_schema:存储数据库对象信息,如用户表信息,列信息,里面的内容不能动。
b. Performance_schema:存储数据库服务器性能参数信息,里面的内容不能动。
c. Mysql:存储数据库用户权限信息。
d. Sys:通过这个库可以快速的了解系统的元数据信息,以视图的形式把Information_schema和Performance_schema结合起来,让用户更容易理解相关的数据。
B. 用户数据库,用户自己创建的数据库。
8. 常用命令:
a. 创建数据库:Create database 数据库名;
b. 删除数据库:drop database 数据库名;
c. 查看数据库:show databases;
d. 使用数据库:use 数据库名;
e. 查看数据库表:show tables;
9. 常用的图形化管理工具:Navicat,要先安装好数据库才能安装Navicat,否则会报错。
10. MySQL 的端口号:3306
11. 目前通用的字符集编码是:utf-8
12. 数据库对象:存储、管理和使用数据的不用结构形式,如:表,视图,存储过程,函数,触发器,事件等。
13. 数据库:存储数据库对象的容器。
14. 存储引擎:MySQL中的数据都使用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制,索引技巧,锁定水平,并且最终提供不同的功能和能力,这种存储技术就叫做存储引擎,存储引擎分为以下几种:
a. MYISAM:不支持事务,也不支持外键,访问速度快,对事务完整性没有要求或者以select、insert为主的应用基本都可以使用这个引擎。MySQL5.5及以前的版本默认的
存储引擎就是MYISAM。
b. INNODB:支持事务,提供了具有提交、回滚、崩溃恢复能力的事务安全。但是处理效率没有MYISAM高。MySQL5.5之后的版本默认的存储引擎为INNODB。
c. MEMORY:使用内存来存储数据,访问非常快,但是不安全,一旦服务器关闭数据就会丢失。
15. 文件.frm存储表定义,.myd(mydata)存储数据,.MYI(myindex)存储索引。(在data文件夹下)
第二部分,SQL语言
16. Sql分类:
a. DDL:数据定义语言(跟表结构相关的操作,与表里面的数据无关),用来定义数据库对象,常用的语句有:
Create database 创建数据库,命令:Create database 数据库名 character set utf8;
create table创建数据库表,命令:create table 表名(列名1 数据类型,列名2 数据类型);
rename table原表名 to 新表名; 修改表的名字
Desc 查看表的字段信息,命令:dese 表名;
Show create table 查看创建表的信息,命令:show create table 表名;
create index创建数据库表的索引,
drop table删除数据库表,
drop index删除数据库表的索引,
truncate删除表中的所有行,
alter table更改表结构(如增加、修改、删除列) ,命令:
alter table 表名 add 列名 数据类型;添加列
Alter table 表名 drop 列名;删除列
Alter table 表名 modify 列名 数据类型; 修改列的数据类型
Alter table 表名 change 原列名 新列名 数据类型;修改列名
alter table add constraint在已有的表上增加约束,
b. DML:数据操作语言(针对表里面的数据),用来操作数据库表中的记录,常用的语句有:
Insert添加数据到数据库中,命令:insert into 表名(列1,列2,列3,列4) values (值1,值2,值3,值4);
Update修改数据表中的数据,命令:update 表名 set 列名=新数据 where 列名=值;
Delete删除数据库中的数据,命令:delete from 表名 where 条件;
c. DQL:数据查询语言,用来查询数据,常用的语句有:
Select选择(查询)数据,
Select语句的书写顺序:
Selectfromwheregroup byhavingorder bylimit;
Select语句的执行顺序:
Fromwheregroup byhavingselectorder bylimit;
模糊查询:使用like关键字,下划线‘_’代表一个字符,百分号%代表任意字符。
字段控制查询:
--去除重复记录,命令:select distinct 字段名 from 表名;
--把查询字段的结果进行运算生成新的字段,必须都是数据型,例如:SELECT * , IFNULL(age ,0) + IFNULL(score,0) FROM student;
--对查询结果取别名,用as关键字。
查询结果排序:使用关键字order by,ASC升序(默认),DESC降序。
聚合函数:
Count():统计制定列不为NULL的记录行数;与NULL值的字段进行计算时,结果都为NULL,可以使用IFNULL(字段名,0),把NULL字段设置为0再参加计算。
Max():计算制定列的最大值;
Min():计算制定列的最小值;
Sum():计算制定列的和;
AVG():计算制定列的平均值;
分组查询,在使用分组查询时,select后面直接跟的字段一般都要在group by后面出现。
--Group by 只显示每个组的第一条记录,但与distinct去重复不一样。
--Group by + group_concat(),可以显示每个分组里面包含的记录的集合。
--Group by + 聚合函数,对分组之后的数据做计算。
--Group by + having ,用来分组查询后指定一些条件来输出查询结果。Having的作用于where一样,但having只能用在group by 后面。
Having 与where的区别:
--Having是指分组后对数据进行过滤;
--Where是在分组前对数据进行过滤;
--Having后面可以使用聚合函数;
--Where后面不能使用聚合函数;
Limit,指定从哪一行开始,总共查询几行(行数从0开始计数)。
格式:select * from 表名 limit 参数1,参数2;,
例如,limit 0,3,表示从第1行开始查询,一共查3条数据。
条件查询运算符及关键字有:
运算符:=(等于)、!=(不等于)、<>(不等于)、<(小于)、<=(小于等于)、>(大于)、>=(大于等于)
关键字有:
Between….and;值在什么范围内。
In(集合);值包含在集合中。
Is null;值为空,is not null;值不为空。
And;与
Or; 或
Not;非
d. DCL:数据控制语言,用来定义访问权限和安全级别,常用的语句有:
Grant将权限或角色授予用户,
Revoke从用户或数据库角色中回收权限,
Lock对数据库的特定部分进行锁定,
e. TCL:事务控制语言,常用语句有:
Commit提交事务处理,
Rollback事务处理回滚,
Savepoint设置保存点,
17. 结果集指的是查询结果显示的表格。
18. 常用数据类型:
Double:浮点型,例如double(5,2)表示最多5位,其中必须有2位小数;
Char:固定长度字符串类型;
Varchar:可变长度字符串类型;
Text:字符串类型,用于存储大文本;
Blob:二进制类型,可用于存储二进制文件,如声音、视频、图片;
Date:日期类型,格式为:yyyy-mm-dd
Time:时间类型,格式为:hh:mm:ss
Datetime:日期时间型,格式为:yyyy-mm-dd hh:mm:ss
19. 在MySQL中,字符串类型和日期类型都要用单引号括起来,比如:’mysql’,’2020-01-01’
20. 在命令提示行窗口里面用select语句,可以在语句结尾处加上 \\G ;,来改变显示的效果(按每条记录来显示)。
21. Ctrl键加/,可以对一行进行注释。
第三部分,数据完整性
22. 数据完整性,是指保证用户输入的数据是正确的,分为:
a.实体完整性:表中的一行就是一个实体,标识每一行数据不重复,属于行级约束,类型有:
主键约束(primary key),每个表中要有一个主键,数据唯一,并且不能为NULL。添加方式:
--Create table 表名(字段1 数据类型primary key,字段2 数据类型);
--create table 表名(字段1 数据类型,字段2 数据类型,primary key(要设置主键的字段名));
--create table 表名(字段1 数据类型,字段2 数据类型,primary key(主键1,主键2));---联合主键
--Alter table 表名 add constraint primary key(主键);
唯一约束(unique),指定列的数据不能重复,但可以为空值。添加方式:
Create table 表名 (字段1 数据类型,字段2 数据类型 Unique);
自动增长列(auto_increment),制定列的数据自动增长,即使数据删除了,还是会从删除的序号继续往下增长。添加方式:
Create table 表名(字段1 数据类型 primary key auto_increment,字段2 数据类型 unique);
b.域完整性,单元格的数据正确,域代表单元格。分为:
数据类型约束,数值型,字符型,日期型
非空约束(not null)
默认值约束(default)
d. 引用完整性,表与表之间的对应关系,通过外键来实现,创建外键的条件:
--两个表的主键和外键的数据类型要一致;
--两个表必须都是innodb类型。
第四部分,多表查询
23. 表之间的关系:一对一,一对多(添加外键实现,不需要创建中间表),多对多(需要创建中间表,通过中间与其他表之间创建外键来实现)。
24. 拆分表可以避免大量冗余数据的出现。
25. 多表查询
合并结果集,指的是把两个select语句的查询结果合并到一起,被合并的两个结果列数和列的数据类型必须相同,合并方式有:
--Union,合并时去除重复记录(一行);
格式:select * from 表1 UNION select * from 表2;
--Union all,合并时不会移除重复记录(一行);
格式:select * from 表1 UNION ALL select * from 表2;
连接查询,通过主外键一致可以解决笛卡尔积的问题。
--99查询法,例子:select * from A,B where A.id=B.id;
--内连接,例子:select * from A INNER JOIN B ON A.id=B.id;(inner可以省略)。 内连接与99查询法效果一样。
--外连接
左外连接,左边表中的所有数据全部查出,右边表中只查出满足条件的数据,例子:select * from A LEFT OUTER JOIN B ON A.id=B.id;(outer可以省略)。
右外连接,右边表中的数据全部查出,左边表中只查出满足条件的数据,例子select * from A RIGHT OUTER JOIN B ON A.id=B.id;(outer可以省略)。
--自然连接,连接查询会产生笛卡尔积,通常使用主外键关系等式来去除,但是自然连接无需手动给出主外键等式,它会自动找到这一等式,将两个表中列名和类型完全一致列作为条件。例子,SELECT * FROM A NATURAL JOIN B;
26. 多表查询时不一定非要创建参照完整性(主外键关系),参照完整性的目的主要是保证数据的正确性。
第五部分,子查询
27. 子查询,一个select语句中包含另一个select语句或者两个以上的select语句。
28. 子查询出现的位置:
Where后,把select查询出的结果当做另一个select的条件,要放在括号里面,例如:SELECT ename,depno FROM employee WHERE depno=(SELECT depno FROM employee WHERE ename ='项羽');。
From后,把查询出的结果当做一个新表,必须为新表取别名。例子:SELECT ename,salary,depno FROM (SELECT ename,salary,depno FROM employee WHERE depno=30) ss WHERE ss.salary>1200;
29. 自连接,自己跟自己连接,一个表用两次,取不同的别名,例子:
SELECT e1.empno,e1.ename,e2.empno,e2.ename FROM employee
e1,employee e2 WHERE e1.mgr=e2.empno AND e1.empno=7369;
30. 事务:一件事分为多个步骤,只有每个步骤都完成了,这件事才算完成。完成这件事的过程就叫事务。
31. 每条SQL语句就是一个事务,事务只对DML语句有效,对DQL语句无效。
第六部分,事务
32. 事务的特性:
原子性:指事务包含的所有操作要么全部成功,要么全部失败回滚。
一致性:一个商品出库时,仓库商品数减1,对应用户的购物车中商品数加1。
隔离性:一个事务完成了,另一个事务才会有反应,比如,只有张三转账的事务完成了,李四查询账户余额的事务才会生效。
持久性:一旦事务提交了就写入了数据库,就不可更改了。
33. Mysql 中默认是已经开启事务的,一条语句就是一个事务,一旦回车就相当于提交了事务。
34. 事务的使用:
开启事务:start transaction;
回滚事务:rollback;
提交事务:commit;
35. 事务的并发问题:
脏读,一个事务正在进行时,另一个事务访问了里面的数据。解决办法提升事务隔离级别,read committed。
不可重复读,一个事务范围内两次相同的查询却返回了不同的数据,解决办法提升事务隔离级别,repeatable read。
重复读,解决办法提升事务隔离级别,repeatable read
幻读,解决办法提升事务隔离级别,Serializable
对应关系,
36. 事务的隔离级别:由低到高。
Read-uncommitted(读未提交),一个事务可以读取另一个事务未提交的数据。
Read-committed(不可重复读),一个事务要等另一个事务提交后才能读取数据。
Repeatable-read(可重复读),默认的隔离级别。
Serializable(串行化),这种级别效率低下,比较耗数据库性能,一般不用。
37. 查看事务隔离级别:
select @@global.tx_isolation,@@tx_isolation;
38. 设置隔离级别:
Set globle transaction isolation level read committed;
第七部分,视图
39. 视图,是指由select结果组成的表。
40. 视图特性:
视图是对若干张基本表的引用,一张虚表,查询语句执行的结果;
不存储具体的数据(基本表数据发生变化,视图也会随之改变);
可以跟基本一样,进行增删改查操作(增删改有条件);
41. 视图的作用:
提高安全性:创建一个视图,定义好该视图的所有操作数据,然后将该视图的权限分配给用户,可以避免用户直接访问到基本表的数据。
提高查询性能:可以从视图中直接查询到指定的数据,而不必每次都从基本表去查询。
提高数据性:可以把指定的数据单独保存成视图。
42. 创建视图:格式:create [algorithm=merge|temptable|undefined] view 视图名 AS (select语句) [with[local|cascaded]check option];
例子:CREATE VIEW emp_salary_view AS (SELECT * FROM employee WHERE salary>2000);
43. 创建视图的参数:
algorithm
--Merge(替换式):默认方式可以省略,这种方式创建的视图可以更新真实表中的数据。
--Temptable(具化式):数据存在临时表中, 不可以进行更新操作。
--Undefined:不定义,则使用默认。
With check option:更新数据时,如果数据不符合条件,则无法更新。
Local和cascaded:可选参数,决定检查测试的范围,默认为cascaded。
44. 修改视图:例子:CREATE OR REPLACE VIEW emp_salary_view AS (SELECT * FROM employee WHERE salary>1000);
45. 删除视图:drop view 视图名;
46. 视图不可更新部分,只要视图当中的数据不是直接来自于基表,就不能直接修改。比如使用聚合函数,distinct关键字,group by子句,having子句,union运算符,from子句中包含多个表,select语句中引用了不可更新的视图等。
第八部分,自定义函数和存储过程
47. Delimiter $,作用把SQL语句的结束标志由’;’分号该为美元符号’$’,避免在写自定义函数和存储过程的时候遇到分号就结束,写完自定义函数和存储过程之后需要再修改回来,每当有用到begin。。and语句的时候都需修改。
48. 自定义函数,语法格式:
elimiter $
Create function 函数名(参数)
Returns 数据类型;
BEGIN
函数体
Return 返回值;
END $
elimiter ;
49. 删除自定义函数,drop function [if exists]函数名;
50. 存储过程,指一组可编程的函数,是为了完成特定功能的SQL语句的集合。也就是具有名字的一段代码,用来完成一个特定的功能。
51. 存储过程的作用:
将重复性很高的一些操作,封装到一个存储过程中,简化了对这些SQL语句的调用。
批量处理
统一接口,确保数据的安全
相对于Oracle数据库来说,MySQL数据库的存储过程相对功能较弱,使用较少。
52. 存储过程的创建
创建存储过程:
Delimiter $
Create procedure 名字(参数)
Begin
语句;
End$
Delimiter ;
调用存储过程:call 名称();
53. 存储过程的参数可以为,in,out,inout,默认为in。
. 删除存储过程,drop procedure [if exists]存储过程名;
55. 创建和调用带有输入参数的存储过程,举例:
delimiter $ -- 更改语句结束符
CREATE PROCEDURE testin(in eno int)
BEGIN
SELECT * FROM employee WHERE empno=eno;
END $
delimiter ; -- 恢复语句结束符
call testin(7902); -- 调用带有输入参数的存储过程
56. 创建和调用带有输出参数的存储过程,举例:
delimiter $ -- 更改语句结束符
CREATE PROCEDURE testout(out sa DOUBLE)
BEGIN
SELECT AVG(salary) into sa FROM employee; --将结果赋值给输出变量
END $
delimiter ; -- 恢复语句结束符
CALL testout(@sa); 调用存储过程,要用@符号加变量名。
SELECT @sa; -- 查看变量的值
57. 对输出变量的使用都需要加@符号。
58. 存储过程中申明变量,用declare,
例如:declare a int default 0;
59. 存储过程中给变量赋值
Set a=值;
Select x into a from xxx;
60. 存储过程与函数的区别
功能上:
--存储过程实现的功能要复杂一点,强大一点,可以执行包括修改表等一系列数据库操作。
--函数的功能正对性比较强。
返回值上的不同:
--存储过程:可以返回多个值,也可以不返回值,只是实现某种效果或动作。
--函数:必须有返回值,而且只能有一个返回值。
参数的不同:
--存储过程:参数有三种,in,out,inout。
--函数:参数只有一种,类似于in参数,调用函数时需要按照参数的类型指定值。
语法结构上的不同:
--存储过程:声明时不需要指定返回类型。
--函数:声明时需要指定返回类型,而且在函数体中必须包含一个有效的return语句。
调用方式上的不同:
--存储过程:一般是作为一个的部分来执行,用call语句进行调用。
--函数:一般是嵌入在SQL中使用,可以在select中调用。
61. MySQL中流程控制的使用,常用的流程控制语句有:
IF语句,语法格式:
IF condition THEN
。。。。。。
ELSEIF condition THEN
。。。。。。
ELSE
。。。。。。
END IF;
CASE语句,
--格式1:
CASE 表达式
WHEN 表达式为值1 THEN 语句
WHEN 表达式为值2 THEN 语句
。。。。。。
ELSE 语句
END CASE;
--格式2:
CASE
WHEN 表达式1 THEN 语句
WHEN 表达式2 THEN 语句
。。。。。。
ELSE 语句
END CASE;
WHILE循环语句,判断循环条件,满足条件就执行循环体,否则退出,格式为:
WHILE 条件 DO
循环体;
END WHILE;
LOOP循环语句,没有内置循环条件,但可以通过leave语句退出循环,格式:
循环名:LOOP
循环体;
IF 条件 THEN -- 手工设置结束条件
Leave 循环名;
END IF;
END LOOP 循环名;
REPEAT循环语句,执行一次循环体,然后判断条件是否为真,为真则退出循环,否则继续执行循环体,格式:
REPEAT
循环体;
UNTIL 条件
END REPEAT;
第九部分,索引
62. 索引,属于数据库优化的内容。用于快速找出在某个列中有一特定值的行。不使用索引的化,MySQL必须从第一条记录开始读完整个表,直到找出相关的行,表越大,查询数据所花的时间越多。
63. 索引的优势与劣势:
优势:提高检索效率,降低数据排序成本,降低数据库的IO成本,降低CPU的消耗,
劣势:索引需要占用空间,同时会降低更新表的速度。
. 索引的分类:
单值索引,即一个索引只包含单个列,一个表可以有多个单值索引。
唯一索引,索引列的值必须是唯一的,但允许为空值。
复合索引,一个索引包含多个列。
全文索引,只有在MYISAM存储引擎上才能使用,并且只能在char,varchar,text类型的字段上使用。
空间索引,只有在MYISAM存储引擎上才能使用,并且只能在空间数据类型的字段上使用。
65. 索引操作
自动创建索引,在表上定义了主键时,会自动创建对应的唯一索引。在表上定义了外键时,会自动创建一个普通索引(单值索引)。
手工创建索引,create index 索引名 on 表名(列名);
查看索引,show index from 表名;
删除索引,drop index 索引名 on 表名;
66. Explain ,用来查看索引是否被正确使用,并输出其使用的索引信息。例子:explain select * from employee where ID=1001 \\G; 其中\\G用来分行显示。
67. 索引结构,先对数据进行排序,分为:
Btree索引,即B+树索引,生成一颗倒立的平衡多叉树。
Hash索引,只有在memery存储引擎中使用,不常用。
68. 哪些情况需要创建索引:
主键自动建立唯一索引
频繁作为查询条件的字段应该创建索引
查询中与其他表关联的字段,外键关系建立索引
查询中排序的字段
查询中统计或者分组的字段
69. 哪些情况不需要创建索引:
表记录太少
频繁更新(增删改)的字段
Where条件里用不到的字段
包含许多重复值的字段
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- zicool.com 版权所有 湘ICP备2023022495号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务