数据库软件 : 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 降序,默认升序
descA和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不区分大小写,,如果要区分,,添加binaryselect * 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过滤 和 应用过滤:
让客户机应用 处理数据库的工作,会极大的影响应用的性能,,并且使所创建的应用完全不具备可伸缩性,,,此外,,如果在客户机上过滤数据,,服务器不得不通过网络发送多余的数据,,这导致网络宽带的浪费
普遍认可的好习惯:
表中具有一些特定: 定义了数据在表中如何存储