数据库基础
有组织的方式存储的数据集合
表
某种特定类型数据的结构化清单
列和数据类型
表中的一个字段。所有表都是一个或者多个列组成。每一列都有相应的数据类型。
数据类型限制列中存储的数据
行 表中的一个记录
主键 唯一区分表中的每一行
任意两行都不具有相同的主键值
每一行都必须具有一个主键值(不允许NULL)
主键的最好习惯 处理mysql的强制性规则外。主键应该培养如下习惯
1 不更新主键的值
2 不重用主键列的值
3不在主键列中使用可能更改的值
2 SQL
sql 是结构化查询语言,是专门与数据库通信的语言
优点 1 sql 不是某一个数据库供应商的专用语言。几乎所有重要的DBMS都支持SQL。所以这个语言是通用的。 2 sql容易学习 3 可以执行非常复杂和高级的数据库操作 |
第二章
mysql简介
优点 : 开源 高性能 简单 可信赖
CS模式
分为两类 一种基于共享文件系统的DBMS(例如access 等等在桌面系统上使用),另一种基于CS模式
mysql 管理器
mysql administrator 是一个图形交互客户机。用来简化mysql服务器管理
server information 显示客户机和被连接的服务器的状态和版本信息。
service control (服务器)允许停止和启动mysql以及制定服务器特性。
User administrator (用户管理)来定义mysql用户 登录 的权限。
catalogs列出可用改的数据库并允许创建数据库和表
Mysql Query Browser
mysql query browser 为一个图形交互客户机。用来编写和执行mysql命令。
第三章 使用mysql
连接 mysql -u root -p
选择数据库 use DATABASE;
了解数据库和表 show databases; show tables; show TABLES from DATABASES; show status 服务器状态。show create database show create table 分别显示创建特定数据库和表的MYSQL语句。show grants 用来显示授予用户的安全权限。show errors show warnings 用来显示服务器错误或警告消息。
第四章 检索数据
select 语句
检索单个列
检索多个列
select prod_id,prod_name,prod_price from products.
检索所有列 select * from products;
检索不同的列 select DISTINCT vend_id from products;
限制3条结果
完全限定性
第五章 排序检索数据
排序数据
ORDER BY按照一个或者多个列的名字 排列
按照多个列排序
指定排序方向 A-Z升序(DESC) Z-A降序(ASC)
第六章 过滤数据
使用where过滤
注意 在使用where 和 ORDER BY 时, ORDER要在where 之后。
范围值检查 where 属性值 between 数值 and 数值
空值检查
AND操作符
OR操作符
计算次序
where 可包含任意数目的AND和OR操作符。允许两者结合以进行复杂和高级的过滤。
IN 操作符 在WHERE子句中还有另外一种用法。IN操作符用来指定条件范围,范围中的每一个条件都可以进行匹配。
propvalue 在 10,30 的propname值。
NOT 操作符 否定它之后所跟的任何条件
NOT WHERE 子句中用来否定后跟条件的关键字。
第七章 数据过滤
第八章 用通配符进行过滤
LIKE 操作符
百分和 % 通配符
下划线 (_) 通配符 ,和%用途一样,但是下划线只匹配单个字符,%匹配多个字符
注意:使用通配符会比具体指定的命令要花更长时间代价。性能而言不要使用 减少使用。
第九章 用正则表达式 进行搜索
基本字符匹配 regexp 类似于like,但是regexp可以匹配文档中字段。LIKE没有这个功能
类似点的通配符
这个就是like regexp 的区别 |
注意 :中间一定不要有空格,或者其他不易看到的字符。否则数据不准确。
匹配的特殊字符要用\\双斜杠
匹配字符类
【:alnum:】 任意字母和数字
【:alpha:】 任意字符同【a-z】[A-Z]
【:blank:】 空格或者字符表
【:cntrl:】ASCII控制字符
【:digit:】 任意数字
【:graph:】 任意可以打印的字符 不包括空格
【:lower:】任意小写字母
【:upper:】 任意大写字母
【:punct:】 不在【:alnum:】 和【:alpha:】
【:space:】 包括空格在内的任意空白字符
【:xdigit:】任意十六进制数字
第十章 创建计算字段
计算字段 存储在数据库表中的数据一般不是应用所直接需要的,也就是说要经过处理。
字段 基本上与列的意思相同。经常互换使用。
拼接字段
多数的DBMS使用+或||来实现拼接。mysql使用concat()函数来实现。当把语句转换成mysql语句时一定要把这个区别铭记在心。
concat()拼接串 即把多个串连接起来形成一个较长的串。
mysql 支持RTrim() 去掉右边的空格。还支持Ltrim取消左边的空格
使用别名 AS 一个未命名的列不能用于客户机应用中,所以必须命名。
执行算术计算
第十一章 使用数据处理函数
函数 与其他多数计算机语言一样,SQL支持利用函数来处理数据。函数一般是在数据上执行的。他给数据的转换和处理提供了方便。
使用函数
用于处理文本串(如填充。转换值为大小写)
用于数值进行算术操作
用于处理日期和时间值并从这些值中提取特定成分。
返回DBMS正使用的特殊信息(如用户登录信息 检查版本细节)系统函数。
文本处理函数
upper() 将文本转换为大写
left () 返回串左边的字符
length() 返回串的长度
locate() 找出串的一个字串
lower() 将串转换为小写
LTrim()去掉串左边的空格
Right() 返回串右边的字符
Rtrim() 去掉串右边的空格
返回串的SOUNDEX值 将文本串转换为描述其语音表示的字母数字模式的算法。mysql提供多soundex支持
substring() 返回字串的字符
upper() 将串转换为大写
日期和时间处理函数 能快速有效排序或过滤,节省物理存储空间。
adddate() 增加一个日期(天 周等)
addtime() 增加一个时间(时 分)
curdate() 当前日期
curtime() 返回当前时间
date() 返回日志时间的日期部分
datediff() 计算两个日志之差
date_add() 高度灵活的日期运算函数
date_format() 返回一个格式化的日期或时间串
day() 返回一个日期的天数部分
dayofweek() 对于一个日期返回对应的星期几
hour() 返回一个时间的小时部分
miunte() 放回时间的分钟部分
mouth() 返回日志的月份部分
now() 返回当前日期和时间
second() 返回一个时间的秒部分
time() 返回日期时间的时间部分
year() 返回日期的年份部分
数值处理函数
abs() 返回一个数的绝对值
cos() 角度的余玄
exp()一个数的指数
mod () 返回一个除操作的余数
pi() 返回圆周率
rand() 返回随机数
sin() 角度的正玄
sqrt () 数的平方根
tan 角度的正切
第十二章 汇总数据
汇集函数 经常需要汇总数据而不用把他们实际检索出来,为此mysql提供了专门的函数。使用这些函数。mysql查询可用于检索数据,以便分析和报表生成。
确定表中的行数
获得表中行组的和
找出表列的最大值 最小值 和平均值
聚集函数 运行在行组上 计算和返回单个值得函数
AVG() 返回某列的平均值
count()某列的行数
max() 某列的最大值
min() 某列的最小值
sum() 某列值之和
聚集不同值
组合聚集函数
第十三章 分组数据
数据分组
创建分组
过滤分组 除了能用group by 分组数据外,mysql还允许过滤分组,规定包括哪些分组。排除哪些分组。使用having。所学过的所有类型的where子句都可以用having 来替代。唯一的区别是where 过滤行。而having过滤分组。
注意:having支持所有where操作符。
第十四章 使用子查询
使用子查询
子查询
第十五章 联结表
联结 SQL最强大的功能之一就是能子啊数据检索查询的执行中联结表。
关系表 相同数据出现多次绝不是一件好事,此因素是关系数据库设计的基础。
因为同一供应商的信息都是相同的,对每一个产品重复此信息即浪费时间又浪费存储空间。
如果供应商信息改变,只需改动一次即可。
如果有重复数据,很难保证每次输入该数据的方式都相同。已一致的数据在报表中很难利用。
外键 为某一个表中的一列,他包含另一个表的主键值,定义了两个表之间的关系。
可伸缩性 能够适应不断增加的工作量而不失败。设计良好的数据库或应用程序称为可伸缩性好。
为什么要用联接
分解数据位多个表能更有效的存储。更方便地处理,并且具有更大的可伸缩性。联接是一种机制,用来在一条select 语句中关联表。因此称之为联接。
笛卡尔积(catesian product) 由咩有联接条件的表关系返回的结果为笛卡尔积。检索出的行的数目将是第一个表中的行数目将是第一个表中的行数乘以第二个表中的行数。
内部联结 所用的联结称为等值联结,他基于两个表之间的相等测试,这种联结成为内部联接。其实对于这种联接可以使用稍微不同的语法
联结多个表
第十六章 创建高级联结
使用表别名 主要理由
缩短SQL语句
允许在单挑select 语句中多次使用相同的表
使用不同的联接
自然联接
外部联结
联结包含了那些在相关表中没有关联行的行。这种叫做外部联结。
使用带聚集函数的联结
聚集函数用来汇总数据。使用count()函数的代码可完成此工作。
使用联结合联结条件 要点
注意所使用的联结类型。一般我们使用内部联结 但使用外部联结也是有效的
保证使用正确的联结。否则将返回不正确的数据。
应该总是提供联结条件,否则会得出笛卡尔积
在一个联结中可以包含多个表。甚至对于每一个联接可以采用不同的联结类型。
第十七章 组合查询
组合查询 mysql允许执行多个查询,并将结果昨晚单个查询结果集返回。有两种基本情况。需要使用组合查询。
在单个查询中从不同的表返回类似结构的数据
对单个表执行多个查询,按单个查询返回数据。
创建组合查询
使用union 实际上就是两个查询组合在一起。
union规则
union 必须由两条或者两条以上的select组成。
union 中的每个查询必须包含相同的列 表达式 或聚集函数
列数据烈性必须兼容 :类型不必完全相同 但必须是DBMS可以隐含地转换的类型。
包含或取消重复的行
union 在查询结果中自动去除重复的行,如果想要返回所有的行(包括重复的行)可以使用 union all.
对组合查询结果排序
在使用union组合查询时,只能使用一条ORDER BY子句。他必须出现在最后一条select 语句之后。
第18章 全文本搜索
理解全文本搜索 不是所有引擎都支持本书所描述的全文本搜索。myisam 支持。innoDB不支持全文本所有。只一点很重要。
全文搜索机制非常有用。存在几个重要的限制。
性能。这种搜索非常耗时
明确控制 很难明确第控制匹配什么和不匹配什么。
智能化的结果 它们都不能提供一种智能化的选择结果的方法。
使用全文本搜索
启用全文本搜索支持
在创建表示的时候使用fulltext子句的使用。
性能提示:不要在导入数据时使用fulltext。因为这样会耗费时间,应该是首先导入所有数据,然后子啊修改表,定义FULLTEXT.
进行全文本搜索 两个函数 match() 和 against() 执行全文本搜索。其中match()指定被搜索的列,against()指定要使用的搜索表达式。
使用查询扩展
查询扩展用来设法放宽所返回的全文本搜索结果的范围。
首先,进行一个基本的全文本搜索。找出与搜索条件匹配的所有行。
其次,mysql检查这些匹配行并选择所有有用的词。
在其次。mysql 进行全文本搜索,这次不仅使用原来的条件,而且还使用所有有用的此。
布尔文本搜索
全文本搜索的另外一种形式,叫布尔方式。内容如下
要匹配的词
要排斥的词
排列提示 (等级划分)
表达式分组
另外一些内容。
全文本搜索的使用说明
在索引全文本数据时,短词被忽略且从索引中排除。
mysql带有一个内建的非用词列表。
许多词出现频率很高,搜索他们没有用处。mysql规定一条50%规则,如果一个词出现50%以上的行中,则将他作为非用词丢弃。但是这个规则不用于in boolean mode.
如果表中的行数少于3行,则全文本所示不返回结果。
忽略此种的单引号。
不具有词分隔符的语言 不能恰当地返回全文本搜索结果。
只有myisam数据库引擎中支持全文本搜索。
第十九章 插入数据
数据插入
插入完整的行
插入行的一部分
插入多行
插入某些查询的结果。
插入完整的行
插入多个行
插入检索出的数据
将一条select 语句的结果插入表中。这就是所谓的insert select。
语句实例 insert into customer(cust_id,cust_contact) select cust_id,cust_contact from hello;这个例子是从hello中提取数据到customer中。
第二十章 更新和删除数据
更新数据 update
更新所有行
更新特定行
删除数据
从表中删除特定的行
从表中删除所有行
注意:delete 语句从表中删除行或者是所有行,但是不删除表本身。
更新和删除的指导原则
如果UPDATE delete 语句不用where语句,那么将应用到所有行。
在对update 或delete语句使用where子句前,应该先用select 进行测试。保证他过滤的是正确的记录。乙方编写的where子句不正确。
第二十一章 创建和操纵表
创建和操作表
创建表
使用NULL值。 null值就是没有值或缺值。允许null值得列也允许在插入航时不给出该列的值。不允许null值得列不接受该列咩有值得行,换句话说,在插入或更新行时,该列必须有值。
主键再介绍
主键必须唯一。即表中的每一行必须具有唯一的主键值。如果主键使用单个列,则他的值必须唯一。如果使用多个列。则这些列的组合值必须唯一。primary key.
使用auto_increment告诉mysql 本列每当增加一行时,自动增量。
指定默认值。如果在插入行时没有给出值。mysql允许指定此时使用的默认值。默认值用create table语句的列定义中的default关键字指定。
引擎类型
innodb 是一个可靠的事务处理引擎。他不支持全文本搜索。
memory 在功能等同于mysiam。但由于数据存储在内存中,所以速度很快。
myisam 是一个性能极高的引擎。支持全文本索引,但不支持事务日志。
更新表
alter table
删除表
drop tabels customs2;
重命名表;
第十二章 使用视图
视图 视图是虚拟的表。
为什么使用视图
重写SQL语句
简化复杂的SQL操作
使用表的组成部分而不是整个表
保护数据 授予用户部分是访问权限而不是所有
更改数据格式和表示 视图可返回与底层表的表示和格式不同的数据
性能注意:如果用多个联接和过滤创建了复杂的视图或者检讨了视图,可能会发现性能下降的厉害。因此在部署视同了大量视图的应用前。应该进行测试、
视图的规则和限制
与表一样,视图必须唯一命名
对于可以创建的视图数量没有限制
为了创建视图,必须有足够的访问权限。
视图可以嵌套,即可以利用从其他视图中检索数据的查询来构造一个视图。
ORDER BY可以用在视图中,但如果从该视图检索数据select中也含有order by 那么该视图中的order by 将被覆盖。
视图不能索引,也不能有关联的触发器或默认值
视图可以和表一起用
使用视图
视图用create view 语句创建
show create view viewname 来查看视图
drop 删除视图
利用视图简化复杂的联接
视图重新格式化检索出的数据
如果一个select语句经常被用,那么将此语句转化为视图。
用视图过滤不想要的数据
视图对于应用普通的where子句很有用。
使用视图与计算字段
视图简化计算字段的使用特别有用。
更新视图
通常情况是可以更新的 但是有些视图是不能更新的
如果进行视图的更新,以下操作不能更新
分组
联结
子查询
并
聚集函数
distinct
导出列
第二十三章 使用存储的过程
存储过程
经常完整的操作需要多条语句才能完成
考虑一下情形
为了处理订单,需要核对以保证库存中有相应的物品。
如果库存有物品。这些物品需要预定以便不将他们在卖给别的人。并且要减少可用的物品数量以反映正确的库存量。
库存的商品没有 需要订购,这需要与供应商进行交互。
关于那些物品入库和那些物品退订。需要通知相应的客户。
为什么要使用存储过程
通过把处理封装在容易使用的单元中,简化复杂的操作。
由于不要求反腐建立一系列处理步骤。这保证数据的完整性。
简化对变动的管理。如果表名 列名 业务有变化,只需要更改存储过程的代码。
提高性能 因为使用存储过程比使用单独的SQL语句更快
存储过程可以使用mysql元素和特性来编写功能更强更灵活的代码。
缺陷
编写存储过程需要更高的技能,更丰富的经验。
权限需要的更多
使用存储过程
执行存储过程
mysql称存储过程的执行为调用,因此mysql执行存储过程的语句叫CALL。call接受存储过程的名字以及需要传递给他的任意参数。。
创建存储过程
注意:如果命令行使用程序要接受存储过程自身内的;字符,则他们最终不会成为存储过程的成分,这会使存储过程中的sql出现语句错误。
如何使用呢
call productpricing()
删除存储过程
drop procedure productpricing;
使用参数
productpricing 只是一个简单的存储过程。
参数的数据类型 存储过程的参数允许的数据类型与表中视同的数据类型相同。
建立职能存储过程
只有在存储过程内包含业务规则和职能处理时,他们的威力才真正显现出来。
检查存储过程
show create procedure ordertotal; 显示用来创建过程的create 语句。
第二十四章 使用游标