给定两张表

表A

create table A(ID int,name varchar(20),description varchar(20));
insert into A values(1,'N1','AD1');
insert into A values(2,'N2','AD2');
mysql> SELECT * FROM a;
+----+------+-------------+
| ID | name | description |
+----+------+-------------+
| 1 | N1 | AD1 |
| 2 | N2 | AD2 |
+----+------+-------------+

表B

create table B(ID int,name varchar(20),age int);
insert into B values(1,'N1',20);
insert into B values(3,'N2',21);

mysql> select * from B;
+----+------+-----+
| ID | name | age |
+----+------+-----+
| 1  | N1   | 20  |
| 3  | N2   | 21  |
+----+------+-----+

一:连接

1:自然连接

在共同的属性上(ID,name)取相同的值的元组(行)构成的模式(关系,表)。

mysql> select * from A natural join B;
+----+------+-------------+-----+
| ID | name | description | age |
+----+------+-------------+-----+
| 1 | N1 | AD1 | 20 |
+----+------+-------------+-----+

2:   join....on   ,指定条件的笛卡尔连接,在on上指定查询条件

mysql> select * from A join B on A.name=B.name;        //在属性name上值相等就行, 相同属性会出现多次,可以在*上代替属性集合
+----+------+-------------+----+------+-----+
| ID | name | description | ID | name | age |
+----+------+-------------+----+------+-----+
| 1 | N1 | AD1 | 1 | N1 | 20 |
| 2 | N2 | AD2 | 3 | N2 | 21 |
+----+------+-------------+----+------+-----+

3:左外自然连接,在连接natural join 左边的表的元组全部出现,右边表与左边表在相同属性上相等时,会出现。属性不同时,右边表的属性为null。

出现左表的属性和右表中与左表不同的属性。

mysql> select * from A natural left outer join B;
+----+------+-------------+------+
| ID | name | description | age |
+----+------+-------------+------+
| 1 | N1 | AD1 | 20 |
| 2 | N2 | AD2 | NULL |
+----+------+-------------+------+

4:左外连接。   自然连接会去除相同的属性

mysql> select * from A left outer join B on A.ID=B.ID;
+----+------+-------------+------+------+------+
| ID | name | description | ID | name | age |
+----+------+-------------+------+------+------+
| 1 | N1 | AD1 | 1 | N1 | 20 |
| 2 | N2 | AD2 | NULL | NULL | NULL |
+----+------+-------------+------+------+------+

5:内连接,在相同的属性上相同的值,两张表的属性都出现。

mysql> select * from A INNER join B on A.ID=B.ID;
+----+------+-------------+----+------+-----+
| ID | name | description | ID | name | age |
+----+------+-------------+----+------+-----+
| 1 | N1 | AD1 | 1 | N1 | 20 |
+----+------+-------------+----+------+-----+

二:视图

1: 创建视图C

mysql> create view C as select * from A natural left outer join B;

2:使用视图

mysql> select * from C;
+----+------+-------------+------+
| ID | name | description | age |
+----+------+-------------+------+
| 1 | N1 | AD1 | 20 |
| 2 | N2 | AD2 | NULL |
+----+------+-------------+------+

3:显式的指定视图的属性名

create view D(ID,D_name) as select ID,name from A natural left outer join B;

mysql> select * from D;
+----+--------+
| ID | D_name |
+----+--------+
| 1 | N1 |
| 2 | N2 |
+----+--------+

三:事务

1:set autocommit=0;  设置mysql手动提交。set autocommit=1; 自动提交commit.   这样就相当于每次更新之后立刻提交

2:开启事务,插入,回滚。

mysql> set autocommit=0;
mysql> start transaction; //开启事务
mysql> insert into A values(3,'N3','AD3'); //插入
mysql> select * from A;
+----+------+-------------+
| ID | name | description |
+----+------+-------------+
| 1 | N1 | AD1 |
| 2 | N2 | AD2 |
| 3 | N3 | AD3 |
+----+------+-------------+
mysql> rollback; //回滚
mysql> select * from A;
+----+------+-------------+
| ID | name | description |
+----+------+-------------+
| 1 | N1 | AD1 |
| 2 | N2 | AD2 |
+----+------+-------------+

3: 开启事务,插入,提交,回滚

mysql> start transaction;
Query OK, 0 rows affected mysql> insert into A values(3,'N3','AD3');
Query OK, 1 row affected mysql> select * from A;
+----+------+-------------+
| ID | name | description |
+----+------+-------------+
| 1 | N1 | AD1 |
| 2 | N2 | AD2 |
| 3 | N3 | AD3 |
+----+------+-------------+
3 rows in set mysql> commit work;
Query OK, 0 rows affected mysql> select * from A;
+----+------+-------------+
| ID | name | description |
+----+------+-------------+
| 1 | N1 | AD1 |
| 2 | N2 | AD2 |
| 3 | N3 | AD3 |
+----+------+-------------+
3 rows in set mysql> rollback; //回滚无效
Query OK, 0 rows affected mysql> select * from A;
+----+------+-------------+
| ID | name | description |
+----+------+-------------+
| 1 | N1 | AD1 |
| 2 | N2 | AD2 |
| 3 | N3 | AD3 |
+----+------+-------------+
3 rows in set

四:完整性

1:为id添加唯一约束

alter table A modify id int unique;

2:为属性添加约束,例如约束id<4  (mysql中不能使用check,需要为改约束定义触发器) 。  https://www.cnblogs.com/duodushu/p/5446384.html

mysql> CREATE TRIGGER TestField1_BeforeInsert BEFORE INSERT ON A
FOR EACH ROW
BEGIN
IF NEW.ID > 4 THEN
SET NEW.ID = 0;
END IF;
END;
Query OK, 0 rows affected mysql> insert into A values(5,'','');
Query OK, 1 row affected mysql> select * from A;
+----+------+-------------+
| ID | name | description |
+----+------+-------------+
| 1 | N1 | AD1 |
| 2 | N2 | AD2 |
| 3 | N3 | AD3 |
| 0 | 5 | 5 |
+----+------+-------------+
4 rows in set

五:索引

1:创建索引 create index AindexId on A(ID);

mysql> create index AindexId on A(ID);
Query OK, 0 rows affected
Records: 0 Duplicates: 0 Warnings: 0
mysql> select * from A where ID=1;
+----+------+-------------+
| ID | name | description |
+----+------+-------------+
| 1 | N1 | AD1 |
+----+------+-------------+
1 row in set
 

sql中的连接表达式,视图,事务等。的更多相关文章

  1. ABAP 7.50 新特性 – Open SQL中的宿主表达式和其它表达式

    在长期的停滞后,Open SQL的发展终于从沉睡中醒来.从ABAP 7.40开始,SAP推进了某些关键的改变,以尽可能地包含SQL92中的特性,并提供与ABAP CDS中的DDL里面的SELECT一样 ...

  2. SQL中的连接可以分为内连接,外连接,以及交叉连接 。

    SQL中的连接可以分为内连接,外连接,以及交叉连接 . 1. 交叉连接CROSS JOIN 如果不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积: 举例, ...

  3. SQL中的连接(极客时间)

    SQL中的连接 关系型数据库的核心之一就是连接, 而在不同的标准中, 连接的写法上可能有区别, 最为主要的两个SQL标准就是SQL92和SQL99了, 后面的数字表示的是标准提出的时间. SQL92中 ...

  4. PL/SQL程序控制结构及在PL/SQL中更改数据和管理事务

    1.条件控制 A. IF条件分支语法: if (条件1) then 语句; elsif (条件2) then 语句; elsif (条件3) then 语句; else 语句; end if; B . ...

  5. sql中的触发器、视图、事务

    ·触发器(trigger) [触发器本质上还是一个存储过程,只不过不是用exe来调用执行,而是通过增删改数据库的操作] [触发器只对增.删.改有效] 触发器的格式 (instead of与for的区别 ...

  6. SQL中的连接查询及其优化原则

    连接查询是SQL的主要任务,只有很好的掌握了连接查询及其优化方法才算是掌握了SQL的精髓所在.最近在面试中遇到了有关连接查询的问题,感觉回答的不是很好,总结一下. 具体示例请参考:http://www ...

  7. 【转】SQL中内连接和外连接

    如表     -------------------------------------------------     table1 | table2 |     ----------------- ...

  8. SQL中内连接和外连接的问题!

    本文系转载,版权归原作者所有. 如表      -------------------------------------------------      table1 | table2 |    ...

  9. SQL 中的连接查询

    关于SQL的应用,肯定离不开查询,而相对复杂的查询,总是离不开对表的连接,单个表操作的并不罕见,但是在应用环境大多数的查询都是针对2.3个表甚至更多的表7,至于连接,有内连接.外链接.交叉连接之分,每 ...

随机推荐

  1. 比特币交易本质--UTXO(Unspent Transaction Output)

    UTXO 代表 Unspent Transaction Output. Transaction 被简称为 TX,所以上面这个短语缩写为 UTXO. 现在的银行也好.信用卡也好.证券交易系统也好,互联网 ...

  2. C++ 类的继承二(赋值兼容性原则)

    //赋值兼容性原则 #include<iostream> using namespace std; class PointA{ public: PointA(){ x = ; y = ; ...

  3. The Properties of Posterior of Topic Model

    1.Tang, Jian, et al. "Understanding the Limiting Factors of Topic Modeling via Posterior Contra ...

  4. storm的集群安装与配置

    storm集群安装 机器:(storm及zookeeper都是这3台机器) 192.168.80.20 192.168.80.21 192.168.80.22 须要准备的软件有: zookeeper( ...

  5. cx_Freeze的生成可执行文件

    ①.生成setup.py文件,仿照cx_Freeze给的例子 ②.python setup.py build 生成单个的可执行,会自动带着需要的动态链接库的.默认路径:build\bdist.win3 ...

  6. 用iis虚拟目录和windows共享目录上传文件到远程

    现在有这样一个需求,有主机A和主机B.主机A上发布了一个网站,现在往主机A上上传文件默认是存在主机A上的, 如何把文件传到主机B上呢? 第一步在主机A和主机B上都创建同一个帐号admin,密码admi ...

  7. VS工程目录下的ipch文件夹和.sdf文件

    Visual Studio 2010工程目录下的ipch文件夹和.sdf文件 - web8 - 博客园http://www.cnblogs.com/web100/archive/2012/12/21/ ...

  8. React + Redux 入门(一):抛开 React 学 Redux

    http://www.hacke2.cn/think-in-react-redux-1/

  9. 类库服务寄宿到WebHost

    1.该Demo中包含一个类库项目.一个空的WebForm项目 2.新建WebForm项目 3.全局路由中注册类库服务 public class Global : System.Web.HttpAppl ...

  10. 第十二章:Linux中权限控制实例

    前言 前文对 Linux 中的权限进行了较为透彻的分析.而本文,则在前文的基础上,具体说明如何在代码中进行权限控制. 下面的代码涉及到以下几个方面: 1. 创建文件时设置文件权限 2. 修改文件的默认 ...