1-31一个练习时长五天半的MySQL小白的练习过程-联结-组合查询-更新与删除数据-创建于删除表-alter-视图

外联结
两种基本的外联结形式,左外联结和右外联结
在简单的联结两个表时,我们只需要使用两个表中的公用字段
另外一种外联结,全外联结

左外联结
我们已经知道,如果我们想显示所有订单编号,以及其对应的顾客id,我么可以直接用内联结来实现

SELECT customers.cust_id,
		 orders.order_num
FROM customers,orders
WHERE customers.cust_id = orders.cust_id
ORDER BY customers.cust_id;

实现结果如下
在这里插入图片描述
我们明显可以发现在cust_id这里,我们缺少了没有下过订单的顾客

如果我们想显示在orders表中值为null的顾客,我们需要怎么做呢?

这个时候,我们需要使用外联结

SELECT customers.cust_id,
		 orders.order_num,
		 COUNT(order_num) AS order_times
FROM customers
 LEFT OUTER  JOIN orders ON customers.cust_id = orders.cust_id
GROUP BY customers.cust_id;

这段代码和上面的有什么不同之处呢?

 LEFT OUTER  JOIN orders ON customers.cust_id = orders.cust_id

关键字LEFT OUTER JOIN实现了工作关联两个表中没有关联行的的那些行

customers表中的某位cust从未下过订单,因此在orders表中就没有这位cust的数据,内联无法将这两个表中两行不关联的信息关联起来

但是使用外联结就可以
在这里插入图片描述

我们使用LEFT指定一个在包括其所有行的表单

在orders表中没有的值,在结果中自动添加上null值代替

同时我们还在语句中加入聚集函数,统计每个cust的下单总数

同理,我们也可以使用右外联结

SELECT customers.cust_id,
		 orders.order_num
FROM customers
 RIGHT OUTER JOIN orders ON customers.cust_id =  orders.cust_id;

输出
在这里插入图片描述

左外联结和右外联结之间唯一的区别是做关联的表的顺序。或者说,调整from子句和where子句在表中的顺序,左外联结就可以转换成右外联结

我们来试一下把右外联结变成左外联结

SELECT customers.cust_id,
		 orders.order_num
FROM orders
 LEFT OUTER  JOIN customers ON orders.cust_id = customers.cust_id
;

他们的输出是一模一样的
在这里插入图片描述

知识记录:在哪里判断左右?
right指的是在outer join右边的表
left值得是在outer join左边的表
ATTENTION!
总是需要提供联结条件否则会出现笛卡尔积

组合查询
UNION关键字

一些小规则

使用union必须由两条及其以上的select语句组成,语句之间用关键字union分隔

union的每个查询必须包含相同的列、表达式或者是聚集函数

列数据的类型必须兼容

ATTENTION
如果结果中由重复的行,在union后将彼此合并,只返回一行

如果我们想要将查询到的所有行一五一十全部返回,这个时候我们又应该怎么做呢?

UNION ALL关键字,它可以让数据库返回查询到的所有行,而不消去重复的行

下面是一个生动的例子

将两个select语句结合起来,一边从orderitems中检索出产品prod_id和quantity。其中,一个select语句过滤数量为100的行,另一个select语句过滤ID以BNBG开头的产品。按产品ID对结果进行排序。

SELECT prod_id,
		 quantity
FROM orderitems
WHERE quantity = 100
UNION 
SELECT prod_id,
		 quantity
FROM orderitems
WHERE prod_id LIKE 'BNBG%'
ORDER BY prod_id;

上述语句用在where子句处做修改也可以实现相同的功能

在这里插入图片描述

特别需要注意的是,在对union结果进行排序时,能且只能在union的最后一条select语句中进行order by
如果在多条select语句中进行order by ,查询将会报错

插入数据
简单的记录下格式

insert into [table] 
values(value1,
	   value2,
	   value3);
INSERT INTO customers(cust_id,
							 cust_name,
							 cust_address,
							 cust_city)
							 VALUES('1000000007',
							 		  'Alice',
							 		  'qingyang road 3nd',
							 		  'chengdu');

更加安全的格式是

insert into [table](col1,
					col2,
					col3,
					col4)
values(value1,
	   value2,
	   value3,
	   value4);

这样即使你的表单中列的名字发生变化,语句还是能正常插入数据

更进一步

INSERT SELECT将数据添加到一个已经存在的表中

insert into table1(col1,
				   col2,
				   col3)
select(col1,
       col2,
       col3)
from table2;

这样操作的前提是table1的结构于table2完全相同

假设某列不存在与table1中,这样操作无法将table2中某列完全复制到table1 中

CREATE SELECT将一个表的内容复制到一个全新的表当中

create table custcopy as select * from custmoers;

更新与删除数据

UPDATE更新数据表中某行的某些数据

update table
set col1=***
where col* = ***; 

DELETE删除数据表中的某一行或者几行

delete from table
where col* = ***;

如果漏写了where子句,将会删除数据表中的每一行

而除了使用delete语句,使用turncate,drop语句也可以达到相同的效果

在这里贴上链接做一个记录

Turncate用法详解

在删除数据时,如果删除的数据中的主键是另外某张表的外键,则会删除失败
在这里插入图片描述

如果坚持删除,需要将两张表中的数据一起删除,则会使用到联级删除

或者在定义外键时,对update和delete选项进行修改,直接改成CASCADE

Set NULL : Sets the column value to NULL when you delete the parent table row.
CASCADE : CASCADE will propagate the change when the parent changes. If you delete a row, rows in constrained tables that reference that row will also be deleted, etc.
RESTRICT : RESTRICT causes you can not delete a given parent row if a child row exists that references the value for that parent row.
NO ACTION : NO ACTION and RESTRICT are very much alike. when an UPDATE or DELETE statement is executed on the referenced table, the DBMS verifies at the end of the statement execution that none of the referential relationships are violated. in short child row no concern if parent row delete or update.

这里还有一种办法
戳这里--------->外键唯一性检验

CREATE TABLE
简单地把格式记录下俩

create table table1
(
	col1 int(4)   not null,
	col2 char(32) not null,
	col3 char(50) not null
);

ALTER TABLE
简单地自我熟悉下格式

添加列

alter table table1
add col1 char(38);

删除列

alter table table1
drop column col1;

视图

视图的规则与限制

视图必须唯一命名
视图可以嵌套
创建视图必须拥有足够的权限

一个最常见的视图的应用是隐藏复杂的sql,这些复杂的sql通常涉及到联结

下面来看下语句

create view view1 as
select.......
from  .......
where .......
;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值