赞
踩
数据库软件 : DBMS(database manager system)
数据库 :database, 通过DBMS创建和操作的容器
, 保存有组织的数据的容器,,,通常是一个文件或者一组文件
表: 是一种结构化文件,,,可以用来存储 特定类型
的数据
模式: 用来描述数据库中特定的表以及整个数据库(和其中表的关系),,,模式用作数据库的同义词
列: column ,,表中的一个字段,所有表都是由一个列或者多个列组成,,根据列,,对数据进行排序和过滤
数据类型: datatype所容许的数据的类型,,每个表列都有相应的数据类型,它限制该列中存储的数据类型,,,帮助正确的排序数据,并在优化磁盘使用方面起重要作用
行 : row ,,,表中的一个记录,,数据库记录record
主键: primary key ,,一列(一组列),,其值能够唯一区分表中的每一行,,主键用来表示一个特定的行,,没有主键,更新或删除表中特定行很困难,,因为没有安全的方法保证只涉及相关的行
SQL : 结构化查询语言(structured query language),sql是专门用来和 数据库通信的语言,DBMS都支持sql
外键 foreign key : 某个表中的一列,,它包含另一个表的 主键值,,定义了两个表之间的关系
可伸缩性 scale: 能够适应不断增加的工作量而不失败,,设计良好的数据库 或者 应用程序 称之为 可伸缩性好 scale well
mysql缺点:
基于共享文件系统的DBMS
基于客户机-服务器 的 DBMS
服务器软件处理这个请求,,根据需要过滤,,丢弃,和排序的数据,,然后把结果送回到你的客户机软件
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
sql不区分大小写:
order by
子句: desc 降序,默认升序
desc
A
和a
视为相同,不区分大小写,如果你确实需要改变这种排序顺序,,可以设置校对
,,校对在对 order by
检索出来的数据排序时,起重要作用# collate : 校对
select * from t_user order by user_name collate latin1_general_cs
or
,and
,in
,,,not
or
操作符前,,优先
处理AND
操作符in
取代or
包含其他的select语句
,,使得能够动态建立where子句not
对 in
,exists
,between
,,子句取反%
: 任意字符出现任意次数,,这个代表搜索模式中给定位置的0个,1个或多个字符
%
虽然可以匹配任何东西,,,但是不会匹配NULL
_
: _
和%
一样,,但下划线只匹配单个字符而不是多个字符
select * from t_user where note like '_23'
通配符使用技巧:
搜索的时候,,注意输入的字符串后面有没有多余的空格:
解决:
%
trim()
,rtrim()
mysql用where子句,对正则表达式提供了初步的支持
regexp
: 后所跟的东西作为正则表达式
如果相应的文本在 列值中找到,,会返回相应的行
^
和 $
定位符anchor
regexp
不区分大小写,,如果要区分,,添加binary
select * from t_user where user_name regexp binary 'hehe'
select * from t_user where user_name regexp binary '100|200'
[]
select * from t_user where user_name regexp binary '[123]00'
[]
是另一种 or语句的形式,,[123]
也可以表示为[1|2|3]
^
表示取反 ,,,[^100]
select * from t_user where user_name regexp binary '^hehe[^100]'
[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}'
select 'hello' regexp '[a-z]'
计算字段并不实际存在于数据库表中,,计算字段 是 运行时在select语句内创建的字段 field
在数据库服务器上完成这些 转换操作,,要比在客户机中 完成要快得多,,因为DBMS是 设计来 快速有效的完成这种处理的
+
或者||
来实现拼接,,,mysql使用concat()select concat(user_name,'---',id) from t_user
rtrim()
,ltrim()
,trim()
删除尾部空格derived column
+
,-
,*
,/
select 4*2
select trim('abc')
select now()
函数分类:
upper()
lower()
ltrim()
rtrim()
length()
substring()
locate() ????
left() ????
right()????
soundex()????
日期和时间 采用相应的数据类型和特殊的格式存储,,以便能快速和有效的排序或过滤,,并节省物理存储空间
curDate() curTime() Date() DateDiff() date_add() date_format() day() dayofweek() hour() minute() month() now() second() time() year() addDate()???? addTime()????
# 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
数值处理函数:
abs()
cos()
exp()
mod()
pi()
rand()
sin()
sqrt()
tan()
聚集函数: aggregate function
运行在行组上,,,计算和返回单个值的函数
有时候,,我们实际想要的是汇总信息,,所以返回 实际表数据 是对时间和处理资源的一种浪费,,更不用说宽带了
# 忽略为null的行,,,为了获得多个列的平均值,,必须使用多个avg()
avg()
#包括空和非空
count(*)
# 对指定的column进行统计,,忽略NULL
count(column)
# 最大的数值或者日期值,如果是文本数据,数据按相应的列排序,max是最后一行,,忽略NULL
max()
min()
# 可以计算多个列操作后的sum,,忽略NULL。。。sum(quantity*item_price)
sum()
distinct : 不能用于 count(*),distinct必须使用列名
# 平均值 有distinct 只考虑不同的平均值
select avg(distinct prod_price)
# with rollup 汇总,归纳
select count(*),sex from t_user group by sex with rollup
where是过滤行,having是过滤分组
select count(*),sex,sum(sex) from t_user group by sex having sum(sex)>2
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
为什么要联结表:
关系表的设计,,就是要保证把信息分解成多个表,,一类数据一个表,,各个表通过这些常用的值,相互关联
可伸缩性 scale : 能够适应不断增加的工作量而不失败,,,设计良好的 数据库 或者应用程序称之为 可伸缩性好 scale well
为什么要使用联结:
笛卡尔积 cartesian product : 由于没有联结条件
的表关系返回的结果为笛卡尔积
叉联结 : cross join : 叉联结 又称 笛卡尔积
内部联结 equijoin : 等值连接
inner join
,尽管使用where子句定义联结比较简单,,但是影响性能高级联结:
起别名:
自联结
: 自己和自己联结,,此时联结所用的表时一张表
用自联结而不是子查询 : 通常作为外部语句,,用来代替从相同表中检索数据时使用的子查询语句,,虽然最终结果是相同的,,但有时候处理联结远比处理子查询快得多
标准的联结
: 返回所有数据,甚至相同的列多次出现
自然连接
: natural join
是一种特殊的等值连接,把等值连接中的重复属性去掉,,而等值连接并不去掉重复属性
外部联结
:
union : 将多条select 语句,,组合成一个结果集
组合查询: 通常称为 并union
或者 复合查询compound query
union规则:
union查询结果自动去重
,,,匹配所有行使用 union all
使用union之后,,只能使用一条 order by
,必须出现在最后一条select语句之后,,对于结果集,不存在用一种方式排序一部分,,而又用另一种方式排序另外一部分的情况
数据库经常被多个客户访问,,对处理什么请求以及用什么次序处理进行管理是mysql的任务
insert操作可能很耗时(特别是有很多索引需要更新时),,而且它可能降低等待处理select语句的性能
如果数据检索是最重要的,,则你可以通过在 insert
和 into
之间,,添加关键字LOW_PRIORITY
,指示mysql降低insert的优先级
insert low_priority into
insert…select : 将一个表的数据查找出来,,导入另一个表
insert into t_role (role_name, note) select role_name as name,note from t_role
insert...select
: select查出来的别名不一定要和插入表的字段名一致,,select中的第一列对应要填充表的第一个列,,,,这对于从使用不同列名的表中导入数据非常有用
update : update更新多行,,并且在更新的这些行中的一行或者多行出现一个错误的时候,整个update操作会被取消,,错误发生前更新的所有行 会被恢复到他们原来的值
使用ignore
: 即使发生错误,,也能继续更新
update jgnore hehe1 ...
为了删除某个列的值,,可以将那个字段 更新为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)
auto_increment: 告诉mysql,,本列,,每当增加一行数据时自动增量,,每次执行insert时,mysql会对该列自动增量,,,
每个表只允许一个 auto_increment,,并且这个列必须被索引
(如:通过使他成为主键)
覆盖auto_increment:在插入的时候,使用自己的值 去 代替 自动生成的值,,,后续的增量将开始使用该手动插入的值
获取生成的auto_increment值: last_insert_id()
…执行insert
之后,,select last_insert_id()
他们具有各自不同的功能和特性,,为不同的任务选择正确的引擎能获得良好的功能和灵活性
外键不能跨引擎
: 使用一个引擎的表,,不能引用具有使用不同引擎的表的外键
视图: 是一种mysql的select语句层次的封装,,可用来简化数据处理
以及重新格式化基础数据
,保护基础数据
虚拟的表,,,与包含数据的表不一样
可以对视图执行select操作,,过滤,排序数据,,将视图联结到其他视图或表,,甚至能添加和更新数据
性能问题: 每次使用视图时,都必须处理查询执行时所需要的任意一个检索,,如果你用了多个联结和过滤创建了复杂的视图,,或者嵌套了视图,可能会发现性能下降的厉害,,,
因此,,在部署使用了大量视图的应用时,,应该进行测试
视图的规则和限制:
# 创建视图
create view hehe as select * from t_user
# 创建视图的时候,,使用别名,,重新格式化检索出来的数据
create or replace view hehe as select user_name as userName from t_user
视图中的 where子句,,,和视图的where子句,,两组子句,,将自动组合
并非所有视图都是可更新的,,,如果mysql不能正确的确定被更新的基数据,,则不允许更新,如:group by
和 having
,联结,,子查询,,并,,聚集函数,,distinct,
视图主要用于数据检索,,,一般将视图用于检索而不用于更新
存储过程: 为以后的使用而保存的一条或多条mysql语句的集合
为什么要使用存储过程:
mysql将 编写存储过程的安全和访问,,与 执行存储过程的 安全和访问 区分开来,,
这样,即使你不能编写自己的存储过程,也仍然可以在适当的时候执行别的存储过程
OUT
: 从存储过程中传出一个值 给 调用者
IN
: 传递给存储过程
INOUT
: 对存储过程传入传出
存储过程的代码位于 BEGIN
和END
之间
# 定义分隔符 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
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
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
# 存储过程的创建
show create procedure ordertotal01
# 列出所有的存储过程,,显示了 何时,由谁创建,等详细信息的
show procedure status
触发器: 某个表发生更改的时候做自动处理
创建触发器:
如果 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
触发器不能更新或者覆盖,,,只能先删除,,再创建
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;
触发器的使用:
用来维护数据库的完整性,,要么完全执行,,要么完全不执行
名词:
事务 transaction: 指一组sql语句
回退 rollback: 撤销指定sql语句的过程
提交commit : 为存储的sql语句结果写入数据库表
保留点 savepoint: 事务处理中设置的临时占位符 place-holder,,,你可以对他发布回退,,(与回退整个事务处理不同)
哪些语句可以回退: insert update delete
mysql语句都是直接针对数据库表执行和编写的,,,这就是所谓的隐含提交implicit commit
,即提交操作是自动执行的
start transaction
savepoint delete1
# 保留点,,mysql要知道回退到何处
rollback to delete1
保留点 在 事务处理完成时,,自动释放,,,也可以使用release savepoint
释放保留点
更改默认提交行为:
set autocommit=0
: 默认mysql行为是自动提交,,,设置为0,,表示false
这个标志 ,,针对每个连接
,而不是服务器
字符集: 字母和符号的集合
编码: 某个字符集成员的内部表示
校对: 规定字符如何比较的指令
# 所有可用的字符集 以及 每个字符集的描述和默认校对
show character set
# collation 校对,,,,显示所有的可用的校对,,他们适用的字符集,可以看到有的字符集不止一种校对
show collation
create table mytable(
column1 int,
column2 varchar(20) character set latin1 collate latin1_general_ci
)default character set hebrew
collate hebrew_general_ci
校对
: 在对order by
子句检索出来的数据排序 起 重要作用
# collate : 校对
select * from t_user order by user_name collate latin1_general_cs
collate : 可以用于 order by
,还可以用于 group by
,having
,聚集函数,别名
convert() : 转换数据类型
select convert(now(),signed )
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')
show variables ... show status
:可能需要调整内存分配,缓冲区大小等show processlist
显示所有活动进程,,以及他们的线程id和执行时间,,,使用kill
命令,,,终结某个特定的进程限定引号
,与数值列进行比较,,不用引号select * from t_user where id =6
select * from t_user where note is null
sql过滤 和 应用过滤:
让客户机应用 处理数据库的工作,会极大的影响应用的性能,,并且使所创建的应用完全不具备可伸缩性,,,此外,,如果在客户机上过滤数据,,服务器不得不通过网络发送多余的数据,,这导致网络宽带的浪费
普遍认可的好习惯:
表中具有一些特定: 定义了数据在表中如何存储
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。