数据库的多表连接查询及事务处理

多表连接查询

数据表的连接查询比较常用的有内连接和外连接查询两种。
数据库的多表连接查询及事务处理_第1张图片

内链接查询

内链接查询,是通过INNER JOIN … ON 关键字实现的:

SELECT field1,field2,…fieldn from table_name INNER JOIN join_table ON join_condition;

on后面跟的是外键约束中相对应的两个列名


外连接

  分2种,左连接右连接;它们用法上一样,查询逻辑上互为相反

  SELECT field1,field2,…fieldn   from table_name
  LEFT | RIGHT JOIN join_table   ON join_condition;

  左连接以左边的表为主表,右连接以右边的表为主表;输出的结果以主表为准主表有的数据就一定完全显示(左连接与右连接中),如果主表没有,即使附表有也不显示。

1.select * from commodity inner join commoditytype on ct_id=c_type;
2.select * from commoditytype inner join commodity on ct_id=c_type;

小表拼大表,查询效率较高


子查询

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

select * from table_a where sal > ( select sal from table_b where name = ‘TomCat’ );

注意:这里的返回值必须是单行单例的值


单行多列

select * from table_a where (sal,name) = ( select sal,name from
table_b where name = ‘TomCat’ );

单列多行:

select * from table_a where sal IN (select sal from table_b;);
//查询结果在返回字段结果内的
select * from table_a where sal NOT IN (select sal from table_b;);
//查询结果不在返回字段结果内的
select * from table_a where sal >=ANY (select sal from able_b;);
//查询结果在返回字段结果内任意满足
select * from table_a where sal >=ALL (select sal from table_b;);
//查询结果在返回字段结果内全部满足
数据库的多表连接查询及事务处理_第2张图片

mysql> #新增客户表一条数据
mysql> insert into customer (cu_id,cu_name,cu_phone,cu_gender,cu_address) values (1,'刘德华','8888',1,'北京');
Query OK, 1 row affected (0.43 sec)

mysql> #新增订单表一条数据
mysql> insert into `order` (o_cuid,o_cid,o_num) values (1,23,3),(1,32,2);
Query OK, 2 rows affected (0.22 sec)
Records: 2  Duplicates: 0  Warnings: 0
-------------------------------------------------------------------------------------

使用连接查询和子查询完成 刘德华买了什么

mysql> #连接查询跟子查询都能实现某个目的时,优先考虑子查询

mysql> select customer.cu_name,c_name from commodity where c_id in (select o_cid from order where o_cuid =(select cu_id from customer where cu_name = ‘小刘’));
ERROR 1054 (42S22): Unknown column ‘customer.cu_name’ in ‘field list’

mysql> #子查询只能用自己这个表的东西 多表连接可以用其他表的东西

子查询

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)
    -------------------------------------------------------------------------------------

内连接

mysql> select c.c_name,t.cu_name from commodity as c inner join(
	 > select * from `order`  inner join customer  
	 > where cu_name = '小刘') as t on c.c_id = t.o_cid;
+-------------+---------+
| c_name      | cu_name |
+-------------+---------+
| 中华铅笔HB  | 小刘    |
| 礼盒丝带-红 | 小刘    |
+-------------+---------+
2 rows in set (0.00 sec)
    
-------------------------------------------------------------------------------------

内连接的另外一种方式

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

-------------------------------------------------------------------------------------

查询出买过刘德华买过的任意商品的客户

mysql> select cu_name from customer
    -> where cu_id in(Select o_cuid from `order`
    -> where o_cid =any (in)(select o_cid from `order`   # =any 相当于 in
    -> where o_cuid =(Select cu_id  from customer  where cu_name = '小刘'))) and cu_name !='小刘';
+---------+
| cu_name |
+---------+
| 大刘    |
+---------+
--------------------------------------------------------------------------------------

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

要学会逆向思维

  mysql> select o_cuid from `order` where o_cuid not in(
        ->  #买过和刘德华不一样东西的人
        ->  select o_cuid from `order` where o_cid in(
        ->   #刘德华没买过的商品
        ->   select c_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 |
    +--------+
    |      1 |
    |      2 |
    +--------+
    2 rows in set (0.16 sec)

MySQL的事务处理

事务就是将一组SQL语句放在同一批次内去执行
如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行
事务只对delete、update、insert into有效 对 drop 无效(只对数据表的操作有效)

事务的ACID原则

原子性(Action)
一致性(Consist)
隔离性(Isolated)
持久性(Durable)

MySQL的事务实现方法

  1. SET AUTOCOMMIT = 0;
    关闭MySQL数据库的自动提交

  2. START TRANSACTION
    开始一个事务,标记事务的起始点

  3. COMMIT
    提交一个事务给数据库

  4. ROLLBACK
    将事务回滚,数据回到本次事务的初始状态

  5. SET AUTOCOMMIT = 1;
    还原MySQL数据库的自动提交(一定要记得用好之后打开自动提交
    不然数据库操作一个都实现不了)

    mysql> #1设置自动提交为0(关闭自动提交)
    mysql> set autocommit=0;
    Query OK, 0 rows affected (0.02 sec)

     mysql> start transaction;
     Query OK, 0 rows affected (0.00 sec)
     
     mysql> #事务仅对表级别的修改有效 (drop 无效)(仅对delete insert update 有效)
     mysql> delete from `order`;delete from customer;
     Query OK, 5 rows affected (0.01 sec)
     
     Query OK, 3 rows affected (0.01 sec)
     
     mysql> select * from customer;
     Empty set (0.00 sec)
     
     mysql> rollback;
     Query OK, 0 rows affected (0.00 sec)
     
     mysql> select * from customer;
     +-------+---------+----------+-----------+------------+
     | cu_id | cu_name | cu_phone | cu_gender | cu_address |
     +-------+---------+----------+-----------+------------+
     |     1 | 刘德华  | 8888     |         1 | 北京       |
     |     2 | 张学友  | 3333     |         1 | 北京       |
     |     3 | 林志玲  | 9999     |         0 | 台湾       |
     +-------+---------+----------+-----------+------------+
     3 rows in set (0.00 sec)
     
     mysql> set autocommit=1;
     Query OK, 0 rows affected (0.00 sec)
    

数据库的多表连接查询及事务处理_第3张图片


数据库索引

作用:

  1. 提高查询速度
  2. 确保数据的唯一性
  3. 可以加速表和表之间的连接,实现表与表之间的参照完整性
  4. 使用分组和排序子句进行数据检索时,可以显著减少分组和排序的时间
  5. 全文检索字段进行搜索优化

分类:

  1. 主键索引(PRIMARY KEY)
  2. 唯一索引(UNIQUE)
  3. 常规索引(INDEX)
  4. 全文索引(FULLTEXT)
    数据库的多表连接查询及事务处理_第4张图片
    数据库的多表连接查询及事务处理_第5张图片
    数据库的多表连接查询及事务处理_第6张图片
    数据库的多表连接查询及事务处理_第7张图片
    数据库的多表连接查询及事务处理_第8张图片

你可能感兴趣的:(数据库的多表连接查询及事务处理)