• mysql必知必会


    名词
    • 数据库软件 : DBMS(database manager system)

    • 数据库 :database, 通过DBMS创建和操作的容器, 保存有组织的数据的容器,,,通常是一个文件或者一组文件

    • 表: 是一种结构化文件,,,可以用来存储 特定类型的数据

    • 模式: 用来描述数据库中特定的表以及整个数据库(和其中表的关系),,,模式用作数据库的同义词

    • 列: column ,,表中的一个字段,所有表都是由一个列或者多个列组成,,根据列,,对数据进行排序和过滤

    • 数据类型: datatype所容许的数据的类型,,每个表列都有相应的数据类型,它限制该列中存储的数据类型,,,帮助正确的排序数据,并在优化磁盘使用方面起重要作用

    • 行 : row ,,,表中的一个记录,,数据库记录record

    • 主键: primary key ,,一列(一组列),,其值能够唯一区分表中的每一行,,主键用来表示一个特定的行,,没有主键,更新或删除表中特定行很困难,,因为没有安全的方法保证只涉及相关的行

      • 任意两行都不具有相同的主键值
      • 主键列不允许为NULL
    • SQL : 结构化查询语言(structured query language),sql是专门用来和 数据库通信的语言,DBMS都支持sql

    • 外键 foreign key : 某个表中的一列,,它包含另一个表的 主键值,,定义了两个表之间的关系

    • 可伸缩性 scale: 能够适应不断增加的工作量而不失败,,设计良好的数据库 或者 应用程序 称之为 可伸缩性好 scale well

    DBMS
    为什么使用mysql:
    • mysql开放源码,一般可以免费使用,甚至免费修改
    • mysql执行 非常快
    • 某些非常重要和声望的公司 也在用mysql
    • mysql很容易安装和使用

    mysql缺点:

    • 不总是支持其他DBMS提供的功能和特性,,然而,这一点也正在逐步改善,mysql的各个新版本正不断的增加新特性,新功能
    DBMS分类
    • 基于共享文件系统的DBMS

      • Microsoft Access
      • FileMaker
        用于桌面用途,通常不用于高端或更关键的应用
    • 基于客户机-服务器 的 DBMS

      • MySQL
      • Oracle
      • Microsoft SQL Server
        服务器部分: 是负责所有数据访问和处理的一个软件,数据服务器,,数据添加,删除,更新,所有请求都由 服务器软件 完成
        客户机: 与用户打交道的软件

    服务器软件处理这个请求,,根据需要过滤,,丢弃,和排序的数据,,然后把结果送回到你的客户机软件

    mysql命令
    use 数据库名
    show databases
    show tables
    # 查看表中的列
    show columns from 表名
    # 等于 show columns from 
    describe 表名
    # 显示创建数据库的 sql
    show create database 数据库名
    show create table 表名
    # 显示当前登录用户的权限
    show grants
    # 显示服务器错误和警告
    show errors
    show warnings
    # 显示广泛的服务器状态信息
    show status
    
    limit 3,4
    limit 4 offset 3
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    sql不区分大小写:

    • sql关键字使用大写
    • 列和表名使用小写
    子句clause

    order by子句: desc 降序,默认升序

    • 如果想在多个列上降序排列,,,必须对每一个列进行desc
    • 在mysql中,,Aa视为相同,不区分大小写,如果你确实需要改变这种排序顺序,,可以设置校对,,校对在对 order by检索出来的数据排序时,起重要作用
    # collate : 校对
    select * from t_user order by user_name collate latin1_general_cs
    
    • 1
    • 2
    • order by 必须在 from子句之后,,limit必须位于 order by 之后
    other
    操作符 operator

    or ,and,in,,,not

    • 在处理or操作符前,,优先处理AND操作符
    • 使用in取代or
      • in操作符的语法更清楚,,更直观
      • 在使用in时,计算的次序更容易管理,,因为使用的操作符更少
      • in操作符一般比 or操作符 执行更快
      • in 最大的有点,,是可以包含其他的select语句,,使得能够动态建立where子句
    • mysql支持notin,exists,between,,子句取反
    通配符 wildcard

    %: 任意字符出现任意次数,,这个代表搜索模式中给定位置的0个,1个或多个字符

    • %虽然可以匹配任何东西,,,但是不会匹配NULL

    _ : _%一样,,但下划线只匹配单个字符而不是多个字符

    select * from t_user where note like '_23'
    
    • 1

    通配符使用技巧:

    • 不要过度使用通配符,,如其他操作符能达到相同的目的,,应该使用其他操作符
    • 不要把他们放在搜索模式的开始处

    搜索的时候,,注意输入的字符串后面有没有多余的空格:
    解决:

    • 在搜索模式最后面添加一个%
    • 更好的办法,使用函数trim(),rtrim()

    正则表达式

    mysql用where子句,对正则表达式提供了初步的支持
    regexp : 后所跟的东西作为正则表达式
    如果相应的文本在 列值中找到,,会返回相应的行
    ^$ 定位符anchor

    • regexp不区分大小写,,如果要区分,,添加binary
    select * from t_user where user_name regexp binary 'hehe'
    
    • 1
    • 多个or条件 可以合并成一个 正则表达式
    select * from t_user where user_name regexp binary '100|200'
    
    • 1
    • 匹配几个字符串之一[]
    select * from t_user where user_name regexp binary '[123]00'
    
    • 1

    []是另一种 or语句的形式,,[123]也可以表示为[1|2|3]

    • 中括号中^表示取反 ,,,[^100]
    select * from t_user where user_name regexp binary '^hehe[^100]'
    
    • 1

    [0-9]
    [a-z]
    . : 任意字符
    为了匹配特殊字符必须使用\\为前导,,\\-,\\.
    \\: 用来引用元字符,,具有特殊含义的字符
    \\f : 换页
    \\n : 换行
    \\r : 回车
    \\t : 制表
    \\v : 纵向制表
    \\\ : 匹配反斜杠
    mysql要求两个反斜杠,,mysql自己解释一个,,正则表达式库解释另一个


    匹配多个实例:
    * :0个或者多个
    + : 一个多个多个 {1,}
    ?: 0个或者1个 {0,1}
    {n}: 指定数目的匹配
    {n,} : 不少于指定数目的匹配
    {n,m} : 匹配数目的范围

    在这里插入图片描述在这里插入图片描述

    select * from t_user where user_name regexp binary 'h{1,1}'
    select  * from t_user where user_name regexp '[[:digit:]]{3}'
    
    • 1
    • 2
    • select 语句检测 正则表达式
      • regexp检查返回0: 没有匹配
      • regexp返回1 : 匹配
    select 'hello' regexp '[a-z]'
    
    • 1
    计算字段

    计算字段并不实际存在于数据库表中,,计算字段 是 运行时在select语句内创建的字段 field

    在数据库服务器上完成这些 转换操作,,要比在客户机中 完成要快得多,,因为DBMS是 设计来 快速有效的完成这种处理的

    函数
    • concat() : 连接两个列
      多数的DBMS使用+或者||来实现拼接,,,mysql使用concat()
    select concat(user_name,'---',id) from t_user
    
    • 1
    • rtrim(),ltrim(),trim() 删除尾部空格
    • 别名alias,,也称导出列derived column
    • mysql支持的算术运算符 +,-,*,/
    • select语句 省略from的时候,可以简单的访问和处理表达式
      select 4*2
      select trim('abc')
      select now()
      
      • 1
      • 2
      • 3

    函数分类:

    • 处理文本串: 删除,填充,大小写转换
    • 数值数据的 算术操作: 返回绝对值,进行代数运算
    • 处理日期和时间,,并从这些值中提取特定的成分:返回两个日期之差,,检查日期的有效性
    • 返回DBMS正式用的特殊信息: 用户登录信息,检查版本细节的系统函数
    upper()
    lower()
    ltrim()
    rtrim()
    length()
    substring()
    locate()  ????
    left()   ????
    right()????
    soundex()????
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    日期和时间 采用相应的数据类型和特殊的格式存储,,以便能快速和有效的排序或过滤,,并节省物理存储空间

    curDate()
    curTime()
    Date()
    DateDiff()
    date_add()
    date_format()
    day()
    dayofweek()
    hour()
    minute()
    month()
    now()
    second()
    time()
    year()
    addDate()????
    addTime()????
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    # datetime 存储的是  带日期和时间的,,,,  如果只想比较日期,,用date() 处理
    select DATE('2022-11-23 12:12:12')  #2022-11-23
    select time('2022-11-23 12:12:12')  #12:12:12
    
    # year(),,month()  查找指定月份
    select * from t_user where year(birthday)=2005 and month(birthday)=9
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    数值处理函数:

    abs()
    cos()
    exp()
    mod()
    pi()
    rand()
    sin()
    sqrt()
    tan()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    聚集函数: aggregate function
    运行在行组上,,,计算和返回单个值的函数
    有时候,,我们实际想要的是汇总信息,,所以返回 实际表数据 是对时间和处理资源的一种浪费,,更不用说宽带了

    # 忽略为null的行,,,为了获得多个列的平均值,,必须使用多个avg()
    avg()
    #包括空和非空
    count(*) 
    # 对指定的column进行统计,,忽略NULL
    count(column)
    # 最大的数值或者日期值,如果是文本数据,数据按相应的列排序,max是最后一行,,忽略NULL
    max()
    min()
    # 可以计算多个列操作后的sum,,忽略NULL。。。sum(quantity*item_price)
    sum()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    distinct : 不能用于 count(*),distinct必须使用列名

    #  平均值   有distinct  只考虑不同的平均值
    select avg(distinct  prod_price)  
    # with rollup  汇总,归纳
    select count(*),sex from t_user group by sex with rollup
    
    • 1
    • 2
    • 3
    • 4

    where是过滤行,having是过滤分组

    select count(*),sex,sum(sex) from t_user group by sex having sum(sex)>2
    
    • 1

    having过滤基于分组聚集值,,而不是 特定行值
    where在分组前进行过滤,having在数据分组后进行过滤

    在这里插入图片描述

    子查询

    在select语句中,,子查询 总是 从内向外处理
    由于性能的限制,不能嵌套太多的子查询,,子查询一般与in结合使用,但也可以用于测试,等于=,,不等于<>

    select user_name,(select count(*) from t_user t where t.user_name=u.user_name) from t_user u
    
    • 1
    联结表

    为什么要联结表:

    • 重复的信息浪费空间
    • 如果改动重复的信息,只需要改动一次即可
    • 如果有重复的数据,很难保证每一次的数据改数据的方式都相同,,如果不相同导致数据不一致

    关系表的设计,,就是要保证把信息分解成多个表,,一类数据一个表,,各个表通过这些常用的值,相互关联

    可伸缩性 scale : 能够适应不断增加的工作量而不失败,,,设计良好的 数据库 或者应用程序称之为 可伸缩性好 scale well

    为什么要使用联结:

    • 有效的存储
    • 更方便的处理
    • 具有更大的可伸缩性

    笛卡尔积 cartesian product : 由于没有联结条件的表关系返回的结果为笛卡尔积
    叉联结 : cross join : 叉联结 又称 笛卡尔积

    内部联结 equijoin : 等值连接

    • ansi sql 规范首选inner join,尽管使用where子句定义联结比较简单,,但是影响性能
    • 不要联结不必要的表,,联结的表越多,性能下降越厉害
    • 性能可能会受操作类型,,表中数据量,,是否存在索引或键,以及其他条件印象

    高级联结:
    起别名:

    1. 缩短sql
    2. 允许在单条select语句中,多次使用相同的表

    自联结: 自己和自己联结,,此时联结所用的表时一张表
    用自联结而不是子查询 : 通常作为外部语句,,用来代替从相同表中检索数据时使用的子查询语句,,虽然最终结果是相同的,,但有时候处理联结远比处理子查询快得多

    标准的联结: 返回所有数据,甚至相同的列多次出现
    自然连接: natural join
    是一种特殊的等值连接,把等值连接中的重复属性去掉,,而等值连接并不去掉重复属性
    外部联结:

    • left outer join
    • right outer join
    组合查询

    union : 将多条select 语句,,组合成一个结果集
    组合查询: 通常称为 并union 或者 复合查询compound query
    union规则:

    • 必须由两条或者两条以上的 select 语句组成
    • union中的每个查询必须包含相同的列,表达式,或聚合函数,,不过不需要以相应次序列出
    • 列数据类型必须兼容: 类型不必完全相同,但必须是DBMS可以 隐含的转换的类型

    union查询结果自动去重,,,匹配所有行使用 union all
    使用union之后,,只能使用一条 order by,必须出现在最后一条select语句之后,,对于结果集,不存在用一种方式排序一部分,,而又用另一种方式排序另外一部分的情况

    其他

    数据库经常被多个客户访问,,对处理什么请求以及用什么次序处理进行管理是mysql的任务
    insert操作可能很耗时(特别是有很多索引需要更新时),,而且它可能降低等待处理select语句的性能
    如果数据检索是最重要的,,则你可以通过在 insertinto之间,,添加关键字LOW_PRIORITY,指示mysql降低insert的优先级

    insert low_priority into
    
    • 1

    insert…select : 将一个表的数据查找出来,,导入另一个表

    insert into t_role (role_name, note) select role_name as name,note from t_role
    
    • 1

    insert...select : select查出来的别名不一定要和插入表的字段名一致,,select中的第一列对应要填充表的第一个列,,,,这对于从使用不同列名的表中导入数据非常有用

    update : update更新多行,,并且在更新的这些行中的一行或者多行出现一个错误的时候,整个update操作会被取消,,错误发生前更新的所有行 会被恢复到他们原来的值
    使用ignore : 即使发生错误,,也能继续更新

    update jgnore hehe1 ...
    
    • 1

    为了删除某个列的值,,可以将那个字段 更新为NULL

    删除表数据
    truncate table : 实际是删除原来的表,并重新创建一个表,,而不是逐行删除表中的数据


    主键不能使用不为NULL的列,,允许NULL值的列不能作为唯一标识

    表的操作

    创建表
    if not exists : 仅仅在一个表不存在的时候,,创建,,,这个不会检查已有表的模式是否和你打算创建的表的模式相匹配,,只是查看表名是否存在

    mysql不允许使用函数 作为 默认值,,只支持常量

    修改表

    # 添加一个列
    alter table t_user add address varchar(50)
    # 删除一个列
    alter table t_user drop column address
    # 删除表
    drop table hehe
    # 重命名一个表
    rename table hehe2 to hehe
    rename table hehe to hehe2,productnotes to products
    # 修改表的 外键 foreign key
    alter table hehe2 add constraint fk_hehe foreign key (id) references t_user(id)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    auto_increment

    auto_increment: 告诉mysql,,本列,,每当增加一行数据时自动增量,,每次执行insert时,mysql会对该列自动增量,,,
    每个表只允许一个 auto_increment,,并且这个列必须被索引(如:通过使他成为主键)

    覆盖auto_increment:在插入的时候,使用自己的值 去 代替 自动生成的值,,,后续的增量将开始使用该手动插入的值

    获取生成的auto_increment值last_insert_id() …执行insert之后,,select last_insert_id()

    引擎

    他们具有各自不同的功能和特性,,为不同的任务选择正确的引擎能获得良好的功能和灵活性

    • innoDB : 事务处理引擎
    • Memory : 在功能上等同于MyISAM,,但由于数据存储在内存,不是磁盘,,速度很快,适合于临时表
    • MyISAM: 性能极高的引擎,不支持事务

    外键不能跨引擎 : 使用一个引擎的表,,不能引用具有使用不同引擎的表的外键

    视图

    视图: 是一种mysql的select语句层次的封装,,可用来简化数据处理以及重新格式化基础数据,保护基础数据
    虚拟的表,,,与包含数据的表不一样

    • 重用sql
    • 简化复杂的sql操作,,在编写查询后,可以方便的重用它而不必知道他的基本细节
    • 使用表组成部分而不是整个表
    • 保护数据,,可以给用户授予表的特定部分访问权限,而不是整个表的访问权限
    • 更改数据格式和表示,,,视图可返回与底层表的表示 和 格式不同的数据

    可以对视图执行select操作,,过滤,排序数据,,将视图联结到其他视图或表,,甚至能添加和更新数据

    性能问题: 每次使用视图时,都必须处理查询执行时所需要的任意一个检索,,如果你用了多个联结和过滤创建了复杂的视图,,或者嵌套了视图,可能会发现性能下降的厉害,,,
    因此,,在部署使用了大量视图的应用时,,应该进行测试

    视图的规则和限制:

    • 视图必须唯一命名
    • 对于可以创建的视图数目没有限制
    • 为了创建视图,必须有足够的访问权限,,,这些限制通常由数据管理人员授予
    • 视图可以嵌套,,即可以利用从其他视图检索出来的数据构造一个视图
    • order by 可以用在视图中,,,但是如果该视图检索数据 select 中也含有 order by,,那么该视图中的 order by 会被覆盖
    • 视图不能索引,,也不能有关联的触发器或默认值
    • 视图可以和表一起使用
    # 创建视图
    create view hehe as select * from t_user
    # 创建视图的时候,,使用别名,,重新格式化检索出来的数据
    create or replace view hehe as select user_name as userName from t_user
    
    • 1
    • 2
    • 3
    • 4

    视图中的 where子句,,,和视图的where子句,,两组子句,,将自动组合
    并非所有视图都是可更新的,,,如果mysql不能正确的确定被更新的基数据,,则不允许更新,如:group byhaving,联结,,子查询,,并,,聚集函数,,distinct,
    视图主要用于数据检索,,,一般将视图用于检索而不用于更新

    存储过程

    存储过程: 为以后的使用而保存的一条或多条mysql语句的集合
    为什么要使用存储过程:

    • 通过把处理封装在容易使用的单元中,,简化复杂的操作
    • 不要求反复建立一系列的处理步骤,,这保证了数据的完整性。。。这一点的延伸就是防止错误,将所使用的的代码写入同一个存储过程,,防止错误,,保证了数据的一致性
    • 简化对变动的管理,,如果表名,列名或者业务逻辑,或别的内容,,有变化,,只需要更改存储过程的代码,,使用它的人员甚至不需要知道这些变化,,这一点的延伸就是安全性,,通过存储过程对基础数据的访问,,减少了数据讹误的机会
    • 提高性能,,使用存储过程比使用单独的sql语句快
    • 存在一些只能用在单个请求中的mysql元素和特性,,存储过程可以使用他们来编写更强更灵活的代码
      简单,,安全,,,高性能
      缺点:
    • 存储过程的编写比 基本的sql语句复杂
    • 你可能没有创建存储过程的安全访问权限,,许多数据库管理员限制存储过程的创建权限,,允许用户使用存储过程,,但是不允许他们创建存储过程

    mysql将 编写存储过程的安全和访问,,与 执行存储过程的 安全和访问 区分开来,,
    这样,即使你不能编写自己的存储过程,也仍然可以在适当的时候执行别的存储过程
    OUT: 从存储过程中传出一个值 给 调用者
    IN : 传递给存储过程
    INOUT : 对存储过程传入传出
    存储过程的代码位于 BEGINEND之间

    # 定义分隔符
    delimiter  //
    
    create procedure productpricing1()
    begin
        select price from products;
        # end后面分隔符
    end//
    
    # 还原分隔符
    delimiter ;
    
    
    # 调用存储过程
    call productpricing1()
    
    # 删除存储过程
    drop procedure productpricing1
    # 如果不存在,,去删除存储过程,,会报错,,,使用 drop procedure if exists
    drop procedure  if exists productpricing1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    delimiter  //
    create procedure heheprocedure(
    out minprice int,
    out maxprice int,
    out avgprice int
    )
    begin
       select min(price) into minprice from products;
       select max(price) into maxprice from products;
       select avg(price) into avgprice from products;
    end//
    
    
    delimiter ;
    
    # MySQL的变量都必须以`@`开始
    call heheprocedure(@resultmin,@resultmax,@resultaverage)
    
    # 显示变量
    select @resultmax,@resultmin,@resultaverage
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    declare: 定义局部变量,,,要求指定变量名,,数据类型
    comment : 不是必须的,,但如果给出,可以使用show procedure status

    delimiter //
    create procedure  ordertotal01(
    in onumber int,
    in taxable boolean,
    out ototal decimal(8,2)
    )comment 'hehe ordertotal'
    begin
        -- 定义一个变量
        declare total decimal(8,2);
        declare taxrate int default 6;
    
        -- 存入局部变量total中
        select sum(price*onumber) from products where prod_id=1 into total;
    
        -- taxable 存在
        if taxable then
            select total+(taxrate/100*total) into total;
        end if;
        -- 将最后计算的值存入 ototal
        select total into ototal;
    
    end//
    
    delimiter ;
    #  0表示 false,,,1表示true
    call ordertotal01(20,1,@total)
    select @total
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    # 存储过程的创建
    show create procedure ordertotal01
    # 列出所有的存储过程,,显示了 何时,由谁创建,等详细信息的
    show procedure status
    
    • 1
    • 2
    • 3
    • 4
    触发器

    触发器: 某个表发生更改的时候做自动处理
    创建触发器:

    • 唯一的触发器名 : 在每一个表中唯一,,但不是在每一个数据库中唯一
    • 触发器关联的表
    • 触发器相应的活动 insert delete update
    • 触发器何时执行 : 处理之前或者之后

    如果 before触发器失败,,,mysql将不会执行 after触发器
    只有表才支持触发器,,视图不支持,,临时表也不支持

    create trigger newproduct3 after insert  on products
        for each row select 'hehe added1231' into @result3
    
    
    insert into products (note_id,prod_id) values(5,5)
    
    select @result3
    
    drop trigger newproduct1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    触发器不能更新或者覆盖,,,只能先删除,,再创建
    before用于数据验证和净化,,,,保证插入表中的数据确实是需要的数据
    在这里插入图片描述

    create trigger deleteproduct before delete on products
        for each row
        # begin end 块的好处是 触发器能够容纳多条sql语句
        begin
            insert into t_role(role_name, note) values (old.prod_id,old.prod_id);
        end;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    触发器的使用:

    • 触发器 创建审计跟踪,,,使用触发器,,把更改(如果需要,,甚至还有之前和之后的状态)记录到另一个表非常容易
      遗憾的是,,mysql触发器不支持call语句,,不能在触发器内调用存储过程,,所需的存储过程代码需要复制到触发器中
    事务处理 transaction processing

    用来维护数据库的完整性,,要么完全执行,,要么完全不执行
    名词:
    事务 transaction: 指一组sql语句
    回退 rollback: 撤销指定sql语句的过程
    提交commit : 为存储的sql语句结果写入数据库表
    保留点 savepoint: 事务处理中设置的临时占位符 place-holder,,,你可以对他发布回退,,(与回退整个事务处理不同)

    哪些语句可以回退: insert update delete
    mysql语句都是直接针对数据库表执行和编写的,,,这就是所谓的隐含提交implicit commit,即提交操作是自动执行的

    start transaction
    savepoint delete1
    # 保留点,,mysql要知道回退到何处
    rollback to delete1
    
    • 1
    • 2
    • 3
    • 4

    保留点 在 事务处理完成时,,自动释放,,,也可以使用release savepoint释放保留点

    更改默认提交行为:
    set autocommit=0 : 默认mysql行为是自动提交,,,设置为0,,表示false
    这个标志 ,,针对每个连接,而不是服务器

    其他

    字符集: 字母和符号的集合
    编码: 某个字符集成员的内部表示
    校对: 规定字符如何比较的指令

    # 所有可用的字符集  以及 每个字符集的描述和默认校对
    show  character set
    
    # collation 校对,,,,显示所有的可用的校对,,他们适用的字符集,可以看到有的字符集不止一种校对
    show collation
    
    • 1
    • 2
    • 3
    • 4
    • 5
    create table mytable(
        column1 int,
        column2 varchar(20) character set latin1 collate latin1_general_ci
    )default character set hebrew
    collate hebrew_general_ci
    
    • 1
    • 2
    • 3
    • 4
    • 5

    校对: 在对order by子句检索出来的数据排序 起 重要作用

    # collate : 校对
    select * from t_user order by user_name collate latin1_general_cs
    
    • 1
    • 2

    collate : 可以用于 order by ,还可以用于 group by,having,聚集函数,别名

    convert() : 转换数据类型

    select convert(now(),signed )
    
    • 1

    在这里插入图片描述

    权限管理

    mysql administrator : 交互的,方便管理访问控制

    mysql的用户账号 存储在 名为 mysql的 数据库的user

    # 创建用户
    create user hehe identified by 'hehe'
    # 重命名   ,,也可以update,,但是不建议
    rename user hehe to cc
    #删除用户   删除用户账号和所有相关的账号权限,,,mysql5之前,只能用来删除账号,,不能删除相关权限,,如果使用旧版的mysql,,需要先revoke撤回该账号的相关权限,,然后再drop user
    drop user cc
    
    # 显示这个账户有的权限
    show grants for hehe
    
    # 给 hehe 用户  设置 test09数据库 所有表的  select 权限
    grant select on test09.* to hehe
    # grant 的反操作 是 revoke 
    # revoke  ..from
    revoke select on test09.* from hehe
    
    # 多个权限 ,  分割
    grant select,insert on test09.* to hehe
    
    
    # 更新指定用户的密码
    set password for hehe =password('sillyb')
    # 在不指定用户名的时候,,set password 更新当前登录用户的口令
    set password = password ('root')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    优化mysql
    • show variables ... show status :可能需要调整内存分配,缓冲区大小等
    • mysql是一个多用户多线程的DBMS,他经常执行多个任务,,show processlist显示所有活动进程,,以及他们的线程id和执行时间,,,使用kill命令,,,终结某个特定的进程
    • 总有不止一种方法编写同一个select语句,,应该试验 联结,,并,,子查询,,找出最佳方法
    • 一般来说,存储过程执行的比 一条一条的执行其中的mysql快
    • 应该总是使用正确的数据类型
    • 绝对不要检索比需求还要多的数据,,换言之,不要使用select *
    • 导入数据时,,应该关闭自动提交,,,删除索引,,包括fulltext索引,,然后在导入完成后再重建他们
    • 一系列的 or 条件,,通过使用 union 连接起来
    • 索引改善数据检索性能,但损害数据插入,删除,,更新,,如果你有一些表,,他们收集数据且不经常被搜索,,索引可以根据需要添加和删除
    • like 很慢,,最好使用fulltext
    • 数据库是不断变化的实体,,一组优化良好的表一会儿后就可能面目全非了,,由于表的使用和内容的修改,,理想的优化和配置也会改变
    注意事项
    1. 如果是字符串需要 限定引号,与数值列进行比较,,不用引号
    select * from t_user where id =6
    
    • 1
    1. 在一个列不包含值的时候,,称其为包含空值NULL,,无值(no value)
    select * from t_user where note is null
    
    • 1
    1. 使用update 或者 delete的时候,应该先 select 进行测试,确保过滤的是正确的记录
    2. 强制实施引用完整性数据库,,这样mysql将不允许删除 具有与其他表相关联的数据的行
    名词概念

    sql过滤 和 应用过滤
    让客户机应用 处理数据库的工作,会极大的影响应用的性能,,并且使所创建的应用完全不具备可伸缩性,,,此外,,如果在客户机上过滤数据,,服务器不得不通过网络发送多余的数据,,这导致网络宽带的浪费

    普遍认可的好习惯:

    • 不更新主键列中的值
    • select * 检索不需要的列,,通常会降低检索和应用程序的性能

    表中具有一些特定: 定义了数据在表中如何存储

  • 相关阅读:
    Oracle sqlnet.ora配置文件
    一套模板搞定二叉树算法题--二叉树算法讲解002
    【应用】布隆过滤器
    网络安全学习路线
    双11好物分享:网络机顶盒哪个好?博主分享电视机顶盒排行榜
    MutationObserver对象
    sql中的group by 举例子数据库日期带汉字转换2023年10月18天
    Chapter 02 - Let's Get Started(C#篇)
    基于HTML语言的环保网站的设计与实现 前后端分离 Java毕业设计·文档报告·代码讲解·安装调试
    tar.xz 文件的压缩和生成
  • 原文地址:https://blog.csdn.net/qq_36022463/article/details/128040507