初识数据库3

多表连接查询

1.内连接

关键字:INNER JOIN…ON
具体语法
SELECT field1,field2,…fieldn from table_name
INNER JOIN join_table ON join_condition;
注意:on后面其实跟的就是外键约束中相对应的两个列名!
代码:

mysql> select * from commodity inner join commoditytype on ct_id=c_type;

2.外连接

关键字:LEFT|RIGHT JOIN …ON
具体语法
SELECT field1,field2,…fieldn from table_name
LEFT|RIGHT JOIN join_table ON join_condition;
图形表示
在这里插入图片描述

  • 左连接
mysql> #左外连接
mysql> select * from commodity left join commoditytype on ct_id=c_type;
  • 右连接
mysql> 右外连接:
mysql> select * from commodity right join commoditytype on ct_id=c_type;

注意:输出结果以主表为准,主表有的数据就显示。主表没有即使副表有也不显示用null表示

3.子查询

释义:用一张表的数据作为条件去查另一张表.

  • 单行单列

具体语法
select * from table_a where sal > (
select sal from table_b where name = ‘TomCat’);
解释:先从b表中查询出tomcat的售价,那括号内的查询结果一定是单行单例的一个值了,那么再通过这个值去查询出售价大于这个值的所有商品;
注意:这里的返回值必须是单行单例的值!
代码:

mysql> select c_name from commodity where c_type=(select ct_id=1 from commoditytype where ct_name='玩具');
+-----------------------+
| c_name                |
+-----------------------+
| 变形金刚-擎天柱       |
| 变形金刚-霸天虎       |
| 变形金刚-威震天       |
| 魔仙玩偶1             |
| 超人玩偶              |
| 小霸王游戏机          |
| X-BOX游戏机          |
| 任天堂游戏机          |
| 乐高玩具-散装         |
| 乐高玩具-蝙蝠侠纪念版  |
| 夏日有人手办          |
| EVA模型玩具           |
| 平板电脑模型          |
| 手机模型玩具          |
| 手机模型玩具          |
| hellokitty手机链      |
| 水枪-|
| 水枪-|
| 水枪-|
+-----------------------+
19 rows in set (0.05 sec)
  • 单行多列

具体语法
select * from table_a where (sal,name) = (
select sal,name from table_b where name = ‘TomCat’);
解释 :先从b表中查询出tomcat的售价,输出的结果有2个列属于单行多
列,分别是售价和名字,那么再通过这两个值去查询和这两个值
相等的所有商品;
**注意:这里的返回值和查询的列名顺便必须一致!

4.习题

1.刘德华买过的商品名称
子查询

mysql> select c_name from commodity where c_id in(select o_cid from `order` where o_cuid=(select cu_id from customer where cu_name='刘德华') );
+-------------+
| c_name      |
+-------------+
| 中华铅笔HB  |
| 礼盒丝带-|
+-------------+
2 rows in set (0.00 sec)

连接查询

select c_name
from customer as cu,`order`as o,commodity as c
where c.c_id=o.o_cid and cu.cu_id=o.o_cuid and cu.cu_name='刘德华';
+-------------+
| c_name      |
+-------------+
| 中华铅笔HB  |
| 礼盒丝带-|
+-------------+
2 rows in set (0.00 sec)

2.查询买过刘德华买过所有同样商品的客户

#买过和刘德华一样东西的人
select o_cuid from `order` where o_cuid not in(
#买过和刘德华不一样东西的人
 select o_id from commodity where c_id not in(
  select o_cid from `order` where o_cuid=(
   select cu_id from customer where cu_name='刘德华'
   )
 )
)
group by o_cuid
having count(o_cid)=(
select count(o_cid) from `order` where o_cuid=(
select cu_id from customer where cu_name='刘德华'
)group by o_cuid 
);
+--------+
| o_cuid |
+--------+
|      3 |
+--------+
1 row in set (0.00 sec)

MySQL的事务处理

1.事务的ACID原则

  • 原子性
  • 一致性
  • 隔离性
  • 持久性

2.事务的实现方法

  • set autocommit=0;关闭自动提交模式
  • start transaction;开始一个事务,标记事务的起始点
  • commit;提交一个事务给数据库
  • rollback;将事务回滚,数据回到本次事务的起始状态
  • set autocommit=1; 还原MySQL数据库的自动提交

代码

mysql> set autocommit=1;
Query OK, 0 rows affected (0.07 sec)

mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> delete from `order` where o_id=1;
Query OK, 1 row affected (0.00 sec)

mysql> delete from `order` where o_id=2;
Query OK, 1 row affected (0.00 sec)

mysql> select * from `order`;
+------+--------+-------+-------+
| o_id | o_cuid | o_cid | o_num |
+------+--------+-------+-------+
|    3 |      1 |    32 |   100 |
|    4 |      2 |    32 |   100 |
|    5 |      3 |    32 |   100 |
|    6 |      3 |    32 |   100 |
+------+--------+-------+-------+
4 rows in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.07 sec)

mysql> select * from `order`;
+------+--------+-------+-------+
| o_id | o_cuid | o_cid | o_num |
+------+--------+-------+-------+
|    1 |      1 |    32 |   100 |
|    2 |      1 |    23 |   100 |
|    3 |      1 |    32 |   100 |
|    4 |      2 |    32 |   100 |
|    5 |      3 |    32 |   100 |
|    6 |      3 |    32 |   100 |
+------+--------+-------+-------+
6 rows in set (0.00 sec)

mysql> set autocommit=1;
Query OK, 0 rows affected (0.00 sec)

注意:事务仅对表级别的修改有效(drop 无效)(仅对delete、insert、update有效)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值