一般叫DBMS Database Management System 数据库管理系统
表 table : 一个结构化的文件。来存储数据。一个数据库中表名是唯一的。
列 column: 存储表中的某一部分信息。有一个或多个主键primary key 来区分唯一的记录/行,正确的将数据分成列很重要。
行 row: 有的叫记录record.
SQL: Structured Query Language 结构化查询语言。与数据库沟通的语言。
方便查询和读写。
创建数据库
选择数据库
四个任务
- 管理供应商
- 管理产品目录
- 管理顾客列表
- 录入顾客顶单
5个表
存储销售产品的供应商
vend_id用于进行产品与供应商的匹配
创建Vendors表
定义主键
定义主键
关联外键
Customers
Vendors
Products
Orders
OrderItems
select 关键字
从哪里取 from
取哪些:select
简化版 limit 5,2 从第5行开始,获取2行数据
未加Order By子句检索出来的数据没有任何顺序上的意义
子句clause . order by必须是select最后的一个子句。否则会出错。
sql由子句构成,有些子句是必须的,有些是可选的。 一个子句由一个关键字加上所提供的的数据组成。 from 也是子句。
- 不等于 : <> 或者 !=
- 某个范围内 between x1 and x2
- NULL: IS NULL
注意:order by子句必须在where子句之后。
括号 大于 and 大于 or
优先处理and操作符,导致理解为 vend_id为BRS01的价格大于5 和 所有的vend_id为 DLL01.
和多个and 一样。但是方便,直观,效率快。
IN还可以包含SELECt语句。
否定 跟在其后的条件。
前面的搜索条件都是具体已知的。
- % 代表 0 个 1 个 和 多个 任意字符
- _ 代表1个字符 __就是俩个
- [] 中括号内的一个字符。 mysql不支持。
我们需要的不是数据库存储的值。需要进一步处理,拼接或者计算。
计算某个订单的总价格
- 处理文本字符串:删除、填充、转换大小写
- 数值上操作:绝对值、代数运算
- 日期:提取特定成分:日期之差,时间函数。
- 格式化函数
一般用不着。
五个函数
如果需要聚集不同值。需要使用DISTINCT
聚集函数在没有分组的情况下,是对整个表进行聚集计算的。
当加入group_by就是以分组为单位进行计算
如果有多个列,就细分。
NULL为一组。
where:是行级别的过滤
having: 是组级别的过滤。只能出现在group by子句之后。
select from where group by having order by
嵌套在其他查询中的查询。
列出订购物品RGAN01的所有顾客。
步骤1:从OrderItems查询出所有RGAN01的订单号
步骤2:根据订单查询所有的顾客编号
步骤3: 根据顾客编号查询顾客信息
合一:
注意:子查询只能返回一列数据。
从Customers每返回一行数据,都从Orders里执行一次子查询。所以执行了5次子查询。
联结表:多个表联结起来。
关系数据库:表与表之间是有关系的。为了数据的唯一、不冗余。存储在同一个地方。可伸缩性好
select所选择的列来自俩个表
from也是从俩个表。
where来建立联结。
联结俩个表:实际要做的就是将第一个表中的每一个行与第二个表中的每一行配对。where作为过滤条件。
笛卡尔积:没有联结条件的表关系返回的结果为笛卡尔积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。也叫叉联结 cross join.
- 不要忘了where语句,联结条件一定要正确。否则返回的则是不正确的数据。
当前使用的是等值联结 equijoin .也称为内连接 inner join.
inner join ... on 语法
inner join ... on 语法和where 一样。
不要联结不必要的表
表也可以使用别名。一是为了区分列属于哪个表。二是可以缩写表名
自连接 self join
表自己和自己联结
实现这种方式还可以用子查询
但是,自连接可能比子查询性能好。实际测试一下看使用哪种。
内连接 自然联结 nat
俩个或俩个以上的表进行联结 .
通配符只对第一个表使用。
外联结
联结将一个表的行与另一个表的行相关联,有时候需要包含没有关联行的那些行。
有左外联结 和右外联结 。左是基于左边的表进行联结。
left outer join ... on
使用union关键字将select语句查询的结果组合起来。
当然使用union的肯定可以通过where 语句 来获取。 实际可以测试俩种方法哪个快。
注意:select的列必须一样或者可以隐式转换。
union默认去除重复列。 不去除使用union all
order_by 作用于所有union的所有 结果
这种方式有缺点,表结构有变化就会失败。
PS:指定的列名不一定要是所有的,可以是部分,但是未指定的一定要有默认值,或者 可以为null.
insert into 只能插入一条记录,但是结合select就可以插入多条。
create table CustCopy as select * from Customers
- 更新哪个表
- 更新哪些列, 列与列之间逗号分割
- 过滤条件。如果没有过滤条件,将作用于所有的列。
- 删除哪个表中的数据
- 过滤条件
truncate table ...
create table 表名(
列名 类型 null/not null, default ,
....
)
默认是null.
deafult 日期:current_date()
最好先设计好。。
- 增加列
alter table Vendors add vend_phone char(20);
drop table 表名
视图是虚拟的表。视图只包含 使用时动态检索数据的查询。 SQLite仅支持只读视图。
视图不包含任何列和数据,包含 的是一个查询。
- 重用sql语句
- 简化复制的sql操作
- 使用表的一部分
- 保护数据。授予用户访问表的特定部分的权限。
- 更改数据格式和表示。
使用表的方式和使用视图的方式一致。
添加或更改表中的数据,视图将放回改变过的数据。
- 视图唯一命名
- 视图数目没有限制
- 视图可以嵌套
- 许多DBMS禁止视图使用Order by子句
- 视图不能索引,不能有默认值
大多数sql语句都是针对一个或多个表的单条语句。
并非所有操作都这么简单。会有一些复杂的操作需要多条语句才能完成。
存储过程就是为以后使用而保存的一条或多条SQL语句。 类似批文件。
- 封装在一个易用的单元中。简化复杂的操作
- 统一
- 防止延伸错误。保证了数据的一致性。
- 简化对变动的管理。表名变了,只需要更改存储过程的代码。
- 安全
- 存储过程以编译的形式存储。DBMS处理命令所需的工作量少。 提高了性能
使用简单、安全、高性能。
缺陷
- 不同的DBMS的存储过程语法不同。编写真正的可移植的存储过程几乎是不可能的。 但至少客户端不需要变动。
- 语句复杂,难。。
execute 存储过程名称(参数)
- 参数可选
- 不按次序给出参数,以“参数=值”的方式给出参数值。
- 输出参数。允许存储过程在正执行的应用程序中更新所用的参数
- 用select语句检索数据
- 返回代码,允许存储过程返回一个值到正在执行的应用程序
利用commit 和 rollback语句管理事务处理
使用事务处理 确保成批的sql操作要么完全执行,要么完全不执行,来维护数据库的完整性。
- 事务 tacnsaction 指一组sql语句
- 回退 rollback 撤销指定sql语句的过程
- 提交 commit 将未存储的sql语句结果写入数据库表
- 保留点 savepoint 指事务处理中设置的临时占位符 placeholder.可以对它发布回退
sql server
begin transaction
..
commit tracsaction
mysql
start transaction
...
delete from Orders;
rollback ;
一般的sql语句都是隐式提交的 implicit commit .提交操作是自动执行的。
在事务处理模块中,提交不会隐式执行。
rollback 和 commit 可以写入和撤销整个事务。
复杂的事务可能需要部分提交或回退
要支持回退部分事务。必须在事务处理块中的合适位置防止占位符。
savepoint delete1;
rollback to delete1;
sql检索操作返回一组称为结果集的行。 没有办法得到第一行、下一行或者前10行。
result set
需要在检索出来的行中前进或者后退一行或多行。这就是游标的用途所在。
cursor . 是一个存储在DBMS服务器上的数据库查询。 不是一条select语句,而是select语句检索出来的结果集。
在存储了游标之后,可以根据需要滚动或浏览其中的数据。
- 能够标记游标为只读
- 能控制可以执行的定向操作
- 标记某些列可编辑、某些列不可编辑
- 规定范围
游标主要用于交互式应用。其中用户需要滚动屏幕上的数据。并对数据进行浏览或做出更改。
declare CustCusor cursor
for
select * from Customsers where cust_email is null;
- 打开游标
open cursor CUstCusor - fetch 访问游标数据
oracle 语法
declare type CustCusor is ref cursor
return Customers%ROWTYPE;
delcare CustRecord Customers%ROWTYPE
begin
open CustCusor;
fetch CustCusor INTO CustRecord;
close CustCusor;
end;
管理如何插入或处理数据库数据的规则
保证一列中的值是唯一的。而且永不改动。主键值不能重用。删除之后不能分配给新的行。
外键是表中的一列。其值必须列在另一个表的主键中。
外键是保证引用完整性的极其重要的组成部分。
PS: 外键防止意外删除。
保证一列的数据是唯一的。 类似于主键。
区别
- 表可以包含多个唯一约束,但是只允许一个主键。
- 唯一约束可以包含NULL值。
- 唯一约束可修改
- 唯一约束可重复使用
- 唯一约束不能用来定义外键
关键字 UNIQUE 。 ConSTRAINT .
用来保证一列中的数据满足一组指定的条件。
- 最大值或最小值。 比如:防止0个物品的订单
- 指定范围。 保证发货日期大于等于今天的日期
- 只允许特定的值。 性别字段 M or F
用来排序数据以加快搜索和排序操作的速度。
- 索引改善检索操作的性能。但降低了数据插入、修改、删除的性能
- 索引数据可能要占用大量的存储空间
- 并非所有数据都适合做索引。取值不多的数据不如具有更多可能值的数据。
- 索引用于数据过滤和数据排序。
- 可以在索引中定义多个列。
触发器是特殊的存储过程。在特定的数据库活动时自动执行。
触发器可以与特定表上的INSERT、updatedelete操作相关联。
触发器与单个的表相关联。
尽量使用约束。约束的处理比触发器块。