MySQL必知必会学习笔记(详细)
阅读原文时间:2023年07月09日阅读:3

目录

01 了解SQL

02 MySQL简介

03 使用MySQL

04 检索数据 select, from, distinct, limit, offset

05 排序 order by

06 过滤数据 where,between and,is null

07 数据过滤 where,and,or,not,in

08 用通配符进行过滤 LIKE %为匹配任意字符,_为匹配一个字符

09 用正则表达式搜索 REGEXP

10 创建计算字段 concat()

11 使用数据处理函数 文本,日期,数值函数

12 聚合函数 avg,count,max,min,sum

13 分组 group by,having

14 子查询 (嵌套查询)

15 连接表

16 高级连接

17 组合查询 UNION

18 全文本搜索 MATCH AGAINST

19 插入数据 INSERT INTO

20 更新和删除 UPDATE,DELETE,TRUNCATE

21 创建和操纵表CREATE

22 使用视图

23 使用存储过程

24 使用游标

25 使用触发器

26 管理事务处理

27 全球化和本地化

28 安全管理

29 数据库维护

30 改善性能


01 了解SQL

  • 数据库、表、列、行、数据类型、主键

02 MySQL简介

  • MySQL、Oracle及SQL server等数据库是基于客户机-服务器的数据库
  • MySQL命令行,图形交互客户机,navicat

03 使用MySQL

  • 连接数据库,选择crashcourse数据库 USE crashcourse; 使用use 打开数据库才能使用其中的数据。
  • 查看数据库:SHOW DATABASES;
  • 查看数据库中的表:SHOW TABLES; 返回当前数据库内可用的表。
  • 查看表列:SHOW COLUMN FROM customers; 快捷方式 DESCRIBE customers;
  • SHOW STATUS; 用于显示广泛的服务器状态信息。
  • SHOW CREATE DATABASE 和SHOW CREATE TABLE 分别用来显示创建特定数据库和表的MySQL语句。
  • SHOW GRANTS; 显示授权用户的安全权限。
  • SHOW ERRORS 和 SHOW WARNINGS 用来显示服务器错误或警告信息。
  • HELP SHOW; 显示所有允许的SHOW 语句。

04 检索数据 select, from, distinct, limit, offset

# 检索单个列
SELECT prod_name FROM products;
# 检索多个列
SELECT prod_id, prod_name, prod_price FROM products;
# 显示所有列 使用通配符 *
SELECT * FROM product;
# 只返回不同(唯一)的行
SELECT DISTINCT vend_id FROM products;
# 返回不多于5行
SELECT prod_name FROM products LIMIT 5;
# 返回不多于5行,偏移1个数据,表示之前有多少个被忽略(第一行为行0)
SELECT prod_name FROM products LIMIT 1, 5; # 等价于LIMIT 5 OFFSET 1;

05 排序 order by

# order by 放在from子句后面,limit放在最后
SELECT prod_price
FROM products
ORDER BY prod_price DESC
LIMIT 1;

06 过滤数据 where,between and,is null

  • where,between a and b,空值检查 IS NULL
  • 过滤时选择不具有特定的值时,你不会返回具有NULL值的行,因为NULL是未知具有特殊的含义,数据库不知道是否匹配,在匹配过滤或不匹配过滤时不返回它们。

07 数据过滤 where,and,or,not,in

  • 组合where子句 and,or(注意使用括号明确的分组操作符),not,in

    SELECT prod_name, prod_price
    FROM products
    WHERE (ven_id = 1002 OR ven_id = 1003) AND (prod_price >= 10) # 使用括号扩起来各个条件

    SELECT prod_name, prod_price
    FROM products
    WHERE ven_id IN (1002, 1003)
    ORDER BY prod_name;

  • 使用 IN 的优点,1》在使用长的清单时,更清楚更直观;2》计算次序更容易管理;3》一般比OR执行的快;4》可以包含其他SELECT语句

  • NOT 否定WHERER后面的条件,也可以对IN,BETWEEN,EXISTS子句取反

08 用通配符进行过滤 LIKE %为匹配任意字符,_为匹配一个字符

  • 尽量不要使用通配符,搜索时间长;

    SELECT prod_name, prod_price
    FROM products
    WHERE prod_name LIKE '%jet%'

09 用正则表达式搜索 REGEXP

  • REGEXP,.匹配任意一个字符;正则表达式中的'|'为OR的意思;[abc]匹配几个字符之一;[^abc]否定一个字符集,即匹配除指定字符以外的任何东西;[1-9]匹配范围;匹配特殊字符使用\\(MySQL自己解释一个,正则表达式库解释一个),如【._[]\】以及\\f,换页 \\n,换行 \\r,回车 \\t,制表 \\v纵向制表
  • LIKE匹配整个列,REGEXP 匹配正则表达式不是匹配整个列,例如 LIKE ‘1000’ 和REXEXP ‘1000’ 不一样,前者不匹配,后者匹配‘01000’,‘ 1000’等
  • 不区分大小写,若区分则在REGEXP后面加BINARY
  • 为了更方便的工作,可以使用预定义的字符集。

使用重复元字符控制匹配字符的数量。定位元字符

可以使用SELECT在不使用数据库的情况下测试正则表达式:SELECT ‘hello’ REGEXP ‘[0-9]’

10 创建计算字段 concat()

  • concat()拼接串,把多个串拼接在一起;RTrim()去除右侧多余的空格;LTRIM()去掉左边的空格;TRIM()去掉两边的空格
  • 别名使用AS
  • 可以使用SELECT作为计算测试一些东西,比如SELECT NOW();

11 使用数据处理函数 文本,日期,数值函数

常用的文本处理函数

常用的日期处理函数和数值处理函数

12 聚合函数 avg,count,max,min,sum

  • count()可以使用distinct + 列名计算行值不同的数目

13 分组 group by,having

  • group by对数据进行分组,having对分组进行过滤

  • group by后面跟with rollup 可以得到每个分组以及每个分组的汇总级别

    select vend_id count(1) as num_prod
    from products
    group by vend_id with rollup

使用顺序:select,from,where,group by,having,order by,limit

14 子查询 (嵌套查询)

  • 常见于where子句的in操作符中,in后面跟一个select语句

  • 也可以添加计算字段使用where连接多表

    SELECT c1
    FROM tb
    WHERE c1 in (SELECT c1 FROM …)

    SELECT c1,
    (SELECT count(*) # 添加计算字段
    FROM tb2
    WHERE tb2.c1=tb1.c1) AS newname
    FROM tb1

15 连接表

  • from后面跟多个表,在where里面使用两个表的连接条件(等值连接)

16 高级连接

  • 自连接:使用表别名使表自身和自身连接
  • 自然连接:多个表对于相同列进行连接
  • 内连接、外连接:join,left join,right join,full join

17 组合查询 UNION

  • UNION可以组合多个SELECT语句,要求字段兼容,几乎完成了WHERE条件相同的工作。会自动去除重复的数据,如果要返回所有匹配行使用UNION ALL。在最后使用ORDER BY排序,对所有结果排序,前面所有实际上是一条语句

18 全文本搜索 MATCH AGAINST

  • MyISAM支持全文本搜索,InonDB不支持

  • 在创建表时使用FULLTEXT创建索引

    SELECT note_text
    FROM productnotes
    WHERE MATCH(note_text) AGAINST('rabbit')

    SELECT note_text, MATCH(note_text) AGAINST('rabbit') AS rank # 查询所有的
    FROM productnotes

    SELECT note_text FROM productnotes
    WHERE MATCH(note_text) AGAINST('rabbit' WITH QUERY EXPANSION) # 使用查询扩展

    SELECT note_text FROM productnotes
    WHERE MATCH(note_text) AGAINST('rabbit' IN BOOLEAN MODE) # 使用布尔查询

    要使用其他布尔查询的操作符

19 插入数据 INSERT INTO

  • 要写插入表的列名,SELECT语句后面的列不要带括号

    INSERT INTO tb(c1, c2,…) # 根据值插入
    VALUES
    (C1,C2,…)

    INSERT INTO tb(c1, c2,…) # 从SELECT语句插入
    SELECT C1,C2,…

20 更新和删除 UPDATE,DELETE,TRUNCATE

没有where条件更新删除所有行,先试用select查询要删除的数据是否是想要删除的数据

UPDATE tb
SET c1 = newValue,
    c2 = newValue
WHERE ....  # 可以使用子查询,WHERE id IN (SELECT id FROM...)

DELETE FROM tb
WHERE ...

TRUNCATE TABLE tb  # 删除所有数据(实际上是删除表然后新建一个表,速度比delete快)

21 创建和操纵表CREATE

  • 创建表

    CREATE TABLE IF NOT EXISTS tb
    ( id INT NOT NULL AUTO_INCREMENT, # 自增
    name NOT NULL DEFAULT 'AA', # 默认值
    address NULL,
    PRIMARY KEY (id) # 设置主键约束
    )ENGINE=InnoDB

last_insert_id()函数获取最后一个自增AUTO_INCREMENT值

  • 更改表

    ALTER TABLE tb # 添加列
    ADD c1 char(20),
    c2 char(20)

    ALTER TABLE tb # 删除列
    DROP c1,c2

  • 删除表:DROP TABLE tb

  • 重命名:RENAME tb1 TO tb2,tb3 TO tb4

22 使用视图

视图提供了一种MySQL的select语句层次的封装,可用来简化数据处理,重新格式化基础数据或保护基础数据

## 创建视图
create view as select ...

## 查看创建视图的语句
show create view view_name

## 删除视图
dorp view view_name

## 更新视图
先drop在create
或者
create or replace view

23 使用存储过程

## 调用存储过程
call xxx(@xxx, @xxx);

## 创建存储过程
create procedure xxx()
begin
    select...
end;

## 如果使用命令行,需要修改delimiter,因为命令行解析;为结束
开头使用delimiter //重新定义结束符,最后使用end//

## 删除存储过程
dorp procedure xxx;
dorp procedure xxx if exists;

## 使用参数, in out关键字表示输入输出变量,into表示将结果写入变量
#创建
create procedure xxx(out 变量 变量类型, in 变量 变量类型)
begin
    使用关键字into写入变量
end;

#调用
call xxx(@p1,@p2...)

## 更复杂的存储过程, 使用declare声明变量类型
declare 变量 变量类型;
if 布尔变量 then
    ...
elseif 布尔变量 then
    ...
else
    ...
end if;

## 显示所有存储过程
show procedure status;
show procedure status like 'xxx'; 限制输出,使用过滤

## 显示创建存储过程的语句
show create procedure xxx;

24 使用游标

## 声明游标
declare xxx cursor for ...

## 打开/关闭游标
open xxx;
close xxx;

## 打开游标后检索当前行
fetch xxx into xxx;

## 打开游标后遍历所有行, 注意:declare必须在任意游标之前定义
declare done boolean default 0;
declare continue handler for sqlstate '02000' set done=1; #定义一个continue handler,在条件出现时被执行,'02000'是未找到条件
repeat
    fetch xxx into xxx;
until done end repeat;

25 使用触发器

  • 自动执行的一条语句,delete,insert,update

  • 创建触发器:唯一的触发器名(表中),关联的表,响应的活动,何时执行

    创建触发器, 每个表最多支持6个触发器每条insert update delete的之前和之后

    create trigger xxx after insert on xxx
    for each row select …;

    create trigger xxx after insert on xxx
    for each row
    begin

    end;

    删除触发器, 不能更改或覆盖,必须删除再创建

    drop triggle xxx;

    insert触发器

    可以引用一个NEW的虚拟表访问被插入的行,NEW中的值也可以被更新

    delete触发器

    可以引用一个OLD的虚拟表访问被删除的行,OLD中的值是只读的

    update触发器

    可以引用NEW访问更新的值,值也可以更改,OLD访问原来的值,只读

26 管理事务处理

  • 事务管理用来管理insert,update,delete语句,不能回退create,drop

    开始事务,回滚事务,提交事务

    start transaction

    rollback; # 只能在一个事务中使用,
    commit;

    使用保留点, 越多越好,执行rollback或commit后自动释放,release savepoint明确释放

    savepoint xxx;
    rollback to xxx;

  • 更改默认提交,set autocommit=0

27 全球化和本地化

  • 查看支持的字符集列表:show character set;

  • 查看支持校对的字符集列表:show collation;

  • 查看系统或数据库的字符集和校对:show variables like 'character%'; show variables like 'collation%';

  • 为某个表或某个列指定字符集和校对,不指定使用数据库默认

    create table xxx
    (
    column1 int,
    column2 varchar(10) character set xxx collation xxx;
    )
    default character set xxx
    collation xxx;

    排序特定的select语句, 或者group by, having,聚合函数,别名等

    select xxx order by xxx collate xxx;

28 安全管理

## 创建用户账号, 不指定主机名默认%
create user xxx identified by 'password';
create user xxx identified by password  '散列值';
或者使用insert, grant 一般不建议使用insert

## 重命名用户账号
rename user xxx to xxx;

## 删除用户
drop user xxx;

## 创建用户账号后必须分配访问权限,否则只能登录,看不到数据,也无法执行操作
## 查看赋予用户的权限
show grant for xxx;

## 设置权限
grant xxx on dbname.* to xxx; # 针对某个数据库
revoke xxx on dbname.* from xxx; # 撤销权限

## 更改用户密码
set password for xxx = password('new password');
set password = password('new password'); # 更新当前用户的密码

29 数据库维护

  • 备份数据

  • 数据库维护

    检查表键是否正确

    analyze table xxx;
    check table xxx;

  • 诊断启动问题,mysqld --help, --safe-mode, --verbose, --version

  • 查看日志,data目录

    • 错误日志,hostname.err
    • 查询日志,hostname.log
    • 二进制日志,记录更新过数据的所有语句,hostname-bin
    • 缓慢查询日志,记录执行缓慢的任何查询,对数据库需要在何处优化很有用,hostname-slow.log
    • flush logs,刷新和重新开始所有日志文件

30 改善性能

  • 查看配置:show variables,show status
  • 查看活动进程:show processlist,使用kill终结某个特定进程
  • 使用explain解析查询语句
  • 有的操作支持delayed关键字