0
点赞
收藏
分享

微信扫一扫

MySQL必知必会---探索mysql及实例探析:查询、联结、库、表及视图


上一篇:基础应用篇

高级应用篇

子查询

依赖“主键”与“外键”完成。有时,需要计算某一行的值,可将相关数据“拿”出来,建立“子表”,用所谓“子查询”完成相应操作。(此知识点在上一篇首分享博文中有详说)
但更多时候,再建表未免显得“麻烦”,我们更愿意使用:

联结

SQL中最强大的功能之一。能维护引用的完整性。联结不是实体,在实际数据库表中不存在。
其创建非常简单,规定要联结的所有表及如何关联它们即可。
示例:
创建联结:

select vend_name,prod_name,prod_price
from vendors,products
where vendors.vend_id=products.vend_id
order by vend_name,prod_name;

输出什么?
一张表!其中包含vendors,products两张表中的三列值:vend_name,prod_name,prod_price,且按照vend_name,prod_name的顺序排序结果输出。
两个表?yes,这就是联结的优势。
where子句:应保证所有联结都有where子句,限制返回数据信息。

笛卡尔积:由没有联结条件的表关系返回的结果为笛卡尔积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数
应总是提供联结条件,否则会得出笛卡尔积。

自然联结:排除多次出现,使每个列只返回一次(清理相同数据)。

select c.*,o.order_num,o.order_date,oi.prod_name
from customers as c,orders as o,orderitems as oi
where c.cust_id=o.cust_id
and oi.order_num=o.order_num;

在这个例子中,通配符(*)只对第一个表使用。所有其他列明确列出,所以没有重复的列被检索出来。

一般我们所使用的联结,都是内联,除此之外,还有外联,如下:
例如,有时可能需要使用联结来完成以下工作:
1.对每个客户下了多少订单进行计数,包括那些至今尚未下订单的客户;
2.列出所有产品以及订购数量,包括没有人订购的产品;
3.计算平均销售规模,包括那些至今尚未下订单的客户。
在上述例子中,联结包含了那些在相关表中没有关联行的行。这种类型的联结称为外部联结。
比较:1.内联

select customers.cust_id,orders.order_num
from customers inner join orders
on customers.cust_id=orders.order_id;

2.外联(语法与内联类似)

select customers.cust_id,orders.order_num
from customers left outer join orders
on customers.cust_id=prders.order_id;

这条select语句使用了关键字outer join来指定联结的类型(而不是在where子句中),但与内联不同的是,外联还包括了没有关联行的行。而且,使用outer join必须使用left或right(这称为左外联与右外联),左、右外联之间的不同在于照应表的不同,上面命令的运行结果如下:一看便知:

MySQL必知必会---探索mysql及实例探析:查询、联结、库、表及视图_删除表


MySQL必知必会---探索mysql及实例探析:查询、联结、库、表及视图_mysql应用型_02


使用带聚集函数的联结:AVG()函数、COUNT()函数、MAX()函数、MIN()函数、SUM()函数

组合查询—UNION

mysql允许执行多个查询(多条select语句),并将结果作为单个查询结果返回。
使用:由两条或以上的select语句独立完成,语句中间用关键字union连接(分隔),但union中的每个查询必须包含相同的列、表达式或聚集函数。

SELECT E_Name FROM Employees_China

结果如下:

E_Name
Zhang, Hua
Wang, Wei
Yang, Ming

SELECT E_Name FROM Employees_USA

结果如下:

E_Name
Carter, Thomas
Adams, John
Bush, George
Gates, Bill

最终,

SELECT E_Name FROM Employees_China
UNION
SELECT E_Name FROM Employees_USA

结果如下:

E_Name
Zhang, Hua
Wang, Wei
Carter, Thomas
Yang, Ming
Adams, John
Bush, George
Gates, Bill

注意:union自动取消重复的行,若想返回全部匹配行,可使用union all;

创建、更新表,插入、删除、修改数据

由于篇幅原因,移至其它网站,想看的请至​​C语言中文网​​​学习
这里重点说一些东西:1.删除主键:alter table stu drop primary key;
2.修改列名:alter table 表名 change (column) 旧列名 新列名 (新)列类型;
3.查看表创建过程:show create table 表名;
4.还原主键(其实就是增加主键):alter table 表名 add primary key(列名); //可以多个列名,中间用逗号隔开
再说一遍,列,即字段。

其中,“删除表”引起了我的注意:
删除表有三种方式:
1.完全删除(不留一点痕迹)
删除表全部数据和表结构,立刻释放磁盘空间,不管是 Innodb 和 MyISAM;

drop table student;

2.删除表数据,但保留表结构
删除表全部数据,保留表结构,立刻释放磁盘空间 ,不管是 Innodb 和 MyISAM;

truncate table student;

3.删除表数据,保留表结构
删除表全部数据,表结构不变,对于 MyISAM 会立刻释放磁盘空间,InnoDB 不会释放磁盘空间;

delete from student;

But,2、3是有区别的:delete可以加where限定条件,使得只删除某几行数据(没错,是行!)。

视图

视图的使用会极大地降低表的性能
用 create view 创建;
用 show create view 视图名 来查看已有视图;
用 drop view 视图名 来删除视图;
更新视图时,可直接用:create or replace view 命令,这在视图不存在时会新建同名视图。
示例:

create view pro as
select cust_name,cust_cont,prod_id
from customers,orders,orderitems
where customers.cust_id=orders.order_id;

这条语句创建一个名为Pro的视图,它连接三个表,返回自己所需要的内容(上命令是返回已订购了任意产品的所有客户的列表),如果执行“select * from pro;”将列出想要的值。
为了检索如订购了产品TNT2的客户,可如下进行:

select cust_name,cust_cont
from pro
where prod_id='TNT2';

视图就是保存需要数据,在普通权限下给特定用户看的(记住这句话)

用视图过滤数据:其实就是视图和where的“合作”,在此不详说。。。
一般情况下,视图是可以更新的(即对其使用 insert、update、delete),更新视图就相当于操作基表。
but,,,视图的存在是为了检索、呈现、面向用户,而非更新!!!

下一篇:进阶应用篇


举报

相关推荐

0 条评论