赞
踩
SQL:结构化查询语言(Structured Query Language),是一种专门用来与数据库通信的语言。
SQL由很少的词组成,但却提供了一种从数据库中读写数据的简单有效的方法。
为了连接到MySQL,需要以下信息:
用来否定后跟条件。
MySQL中的正则表达式匹配不区分大小写。
select prod_id, quantity,item_price, quantity*item_price AS expanded_price from 表名 where order_num=2005;
select Count(*) as num__items,Min(prod_price) as price_min,Max(prod_price) as price_max,Avg(prod_price) as price_avg from 表名;
select语句中使用时必须遵循的次序。
本章的查询必须使用MySQL4.1之后的版本。
子查询:嵌套在其他查询中的查询。
实际需求:需要列出订购物品TNT2的所有客户,可以:
(1)检索包含物品TNT2的所有订单的编号
(2)检索具有前一步列出的订单编号的所有客户。
(3)检索前一步返回的所有客户ID的客户信息。
上述的每个步骤,都可以单独作为一个查询来执行,可以把一条select语句返回结果作为另一个select语句的where条件。
使用子查询的另一种方法。
假如需要显示customers表中每个客户的订单总数。订单与相应的客户ID存储在orders表中。
(1)从customers表中检索客户列表。
(2)对于检索出的每个客户,统计在orders表中的订单数目。
相关子查询:涉及外部查询的子查询。
任何时候,只要类名可能有多义性,就必须使用这种查询。
这样的结果是不正确的,原因是:
1 关系表
(1)外键:某个表中的一列,它是另一个表的主键。
(2)可伸缩性:能够适应不断增加的工作量而不失败。
2. 联结的作用
情景:要检索所有客户及每个客户说下的订单。
方式一:使用count():
方式二:使用聚集函数
这个例子使用左外部联结来包含左右客户,甚至包含那些没有下任何订单的客户。
数据库系统概论第五版(王珊)-基础篇(三)第三章
(2)使用union将多个语句组合
(3)使用多条件查询
2. union规则
“合并”是非常容易操作的,但是进行“合并”如要注意以下几条规则。
(1)union必须由两条或两条以上的select语句组成,语句之间使用union关键字分隔。
(2)union中的每个查询必须包含相同的列、表达式或聚集函数
(3)列数据类型必须兼容:类型不必完全相同,但必须是DBMS可以隐含的转换类型(例如,不同的数值类型或不同的日期类型)。
3. 包含或取消重复的行
(1)在17.2.1中,单条语句执行时,第一条返回了4行结果,第二条返回了5行,而使用union组合两条select语句后,只返回了8行,而不是9行。union从查询结果集中自动去除了重复行。
(2)这是union默认的行,如果需要可以使用union all匹配所有行。
4. 对组合查询结果排序
在union组合查询时,只能使用一条order by子句,它必须出现在最后一条select语句之后。
一般在创建表时启用全文本搜索。它给出被索引列的一个逗号分隔的列表。
不要在导入数据时使用fulltext。
即使没有fulltext,布尔文本搜索也可以用。
插入可以有以下几种方式使用
每个值用()括起来,多个值之间用“,”隔开。
将一条select语句的结果插入表中,即insert select。
下例将从表“custnew”中查询到的结果插入到表“customers”中。
这个例子在insert 和select语句中使用了相同的列名,这没有关系,
drop table 表名
(1)重命名单个表:rename table 原表名 to 新表名;
(2)重命名多个表:
视图创建和使用的一些规则和限制。
使用视图最常见的应用之一是隐藏复杂的SQL,这通常都会涉及联结。
这条语句创建了一个名为productcustomers的视图,它联结三个表,以返回已订购了任意产品的所有客户的列表。
为检索出订购了产品名为“TNT2”的客户,可以
以下select语句在单个组合计算列中返回供应商名和位置(第10章):
为了检索出以创建所有邮件标签的数据,可以
3. 建立信息系学生视图,并要求进行修改和插入操作时,仍需保证该视图只有信息系的学生。
with check option子句表示:以后对该视图进行插入、修改和删除操作时,关系数据库管理系统会自动加上Sdept='IS’的条件
4. 若一个视图是从单个基本表导出的,并且只是去掉了基本表中的某些行或某些列,但保留了主码,则称这类视图为行列子集视图。
5. 视图不仅可以建立在单个表上,也可以建立在多个表上。
6. 视图还可以建立在一个或多个已经定义好的视图之上。
create view IS_S2
as
select Sno,Sname,Grade
from IS_S1
where Grade>=90;
这里的IS_S2就是建立在IS_S21上的。
定义一个视图,过滤没有电子邮件地址的客户。
然后就可以使用此视图:
PS:如果从视图检索数据时使用了一条where子句,则两组子句(一组视图中,一组传递给视图的)将自动组合。
用带有聚集函数和group by子句的查询来定义的视图。
create view S_G(Sno,Gavg)
as
select Sno,AVG(Grade)
from SC
Group by Sno
drop view<view>[cascade];
select Sno,Sage
from IS_Student
where Sage<20
关系数据库管理系统执行对视图的查询时, 首先进行有效性检查,检查查询中涉及的表、 视图等是否存在。如果存在,则从数据字典中取出视图的定义,把定义中的子查询和用户的查询结合起来, 转换成等价的对基本表的查询,然后再执行修正了的查询。这一转换过程称为视图消解(view resolution).
本例转换后的查询语句为:
select Sno,Sage
from IS_Student
where Sdept='IS' and Sage<20;
update IS_Student
set Sname=‘刘晨’
where Sno=‘201215122’
insert into IS_Student
values(‘201215129’,'赵信',20)
delete from IS_Student
where Sno=‘201215129’
创建存储过程,就是为了以后的使用而保存的一条或多条MySQL语句的集合。可以将其视为批文件,虽然他们的作用不仅仅限于批处理。
MySQL称存储过程的执行为调用,因此MySQL执行存储过程的语句为:call。call接收存储过程的名字以及需要传递给它的任意参数。
创建一个返回产品平均价格的存储过程:
使用该存储:
(1)目前为止,所用到的存储过程基本上都是封装MySQL简单的select语句,虽然他们全部都是有效的存储过程例子,但他们所完成的工作可以直接用这些封装的语句完成。当在存储过程中包含业务规则和智能处理时,他们的威力才真正显示出来。
(2)添加一个参数taxable,是一个布尔值;select语句发生了改变,将结果存储到total而不是ototal;if语句检查taxable是否为真,如果为真,则用另一组select语句增加营业税到局部变量total。
(3)使用此存储
显示用来创建一个存储过程的create语句,
show create procedure name
使用游标的几个步骤:
1 创建游标:使用declare语句创建游标。
2. 打开和关闭游标
修改后的语句
3. 使用游标数据
使用fetch语句分别访问它的每一行,fetch指定检索什么数据(所需的列),检索出来的数据存储在什么地方,还可以向前移动游标中的内部行指针,使下一条fetch语句检索下一行。
(1)使用fetch检索当前行的order_num列到一个名为o的局部变量中,对检索出来的数据不做任何处理。
(2)循环检索数据,从第一行到最后一行
4. 综合案例
(1)分析:在这个案例中,我们增加了一个名为t的变量,
此存储过程还在运行中创建了一个新表ordertotals,这个表将保存存储过程生成的结果
fetch像以前一样取每个order_num,然后用call执行另一个存储过程,来计算每个订单的合计,
最后,用insert保存每个订单的订单号和合计。
(2)此存储过程不返回数据,但是它创建和填充了一个表,
(3)查看该表
drop trigger 触发器名。
MySQL需要摄影不同的字符集、排序方法和检索数据方法。
MySQL用户账号和信息存储在名为mysql或MySQL数据库中,需要获得所有账户列表时,可以使用:
drop user 用户名
MySQL的数据也必须经常备份,由于MySQL数据库是基于磁盘的文件,普通的备份系统和例程就能备份MySQL的数据,但是由于有些文件总是处于打开和使用状态,普通的文件副本备份不一定总是有效。
在使用日志时,可以使用flush logs语句来刷新和重新开始所有的日志文件。
主要的日志文件:
在诊断应用的滞缓现象和性能问题时,性能不良的数据库(以及数据库查询)通常是最常见的祸因。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。