当前位置:   article > 正文

mysql必知必会_mysql全知全会

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 * 检索不需要的列,,通常会降低检索和应用程序的性能

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/749706
推荐阅读
相关标签
  

闽ICP备14008679号