sql中的连接表达式,视图,事务等。
给定两张表
表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中的连接表达式,视图,事务等。的更多相关文章
- ABAP 7.50 新特性 – Open SQL中的宿主表达式和其它表达式
在长期的停滞后,Open SQL的发展终于从沉睡中醒来.从ABAP 7.40开始,SAP推进了某些关键的改变,以尽可能地包含SQL92中的特性,并提供与ABAP CDS中的DDL里面的SELECT一样 ...
- SQL中的连接可以分为内连接,外连接,以及交叉连接 。
SQL中的连接可以分为内连接,外连接,以及交叉连接 . 1. 交叉连接CROSS JOIN 如果不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积: 举例, ...
- SQL中的连接(极客时间)
SQL中的连接 关系型数据库的核心之一就是连接, 而在不同的标准中, 连接的写法上可能有区别, 最为主要的两个SQL标准就是SQL92和SQL99了, 后面的数字表示的是标准提出的时间. SQL92中 ...
- PL/SQL程序控制结构及在PL/SQL中更改数据和管理事务
1.条件控制 A. IF条件分支语法: if (条件1) then 语句; elsif (条件2) then 语句; elsif (条件3) then 语句; else 语句; end if; B . ...
- sql中的触发器、视图、事务
·触发器(trigger) [触发器本质上还是一个存储过程,只不过不是用exe来调用执行,而是通过增删改数据库的操作] [触发器只对增.删.改有效] 触发器的格式 (instead of与for的区别 ...
- SQL中的连接查询及其优化原则
连接查询是SQL的主要任务,只有很好的掌握了连接查询及其优化方法才算是掌握了SQL的精髓所在.最近在面试中遇到了有关连接查询的问题,感觉回答的不是很好,总结一下. 具体示例请参考:http://www ...
- 【转】SQL中内连接和外连接
如表 ------------------------------------------------- table1 | table2 | ----------------- ...
- SQL中内连接和外连接的问题!
本文系转载,版权归原作者所有. 如表 ------------------------------------------------- table1 | table2 | ...
- SQL 中的连接查询
关于SQL的应用,肯定离不开查询,而相对复杂的查询,总是离不开对表的连接,单个表操作的并不罕见,但是在应用环境大多数的查询都是针对2.3个表甚至更多的表7,至于连接,有内连接.外链接.交叉连接之分,每 ...
随机推荐
- ResultSet是结果集对象
ResultSet是结果集对象 DriverManager管理一组驱动程序 PreparedStatement预编译的,用来发送和执行SQL语句的
- vim 编辑器使用技巧
看着李立鹏熟练的使用vim,哥心里痒痒的,也来试试! vim pkf.txt i 插入编辑 esc -> :x //退出保存 f8 ->//进入多窗口模式 以下是其他命令: 命令历史 以: ...
- centos配置ssh免密码登录后,仍提示输入密码
配置SSH无密码登录需要3步: 1.生成公钥和私钥 2.导入公钥到认证文件,更改权限 3.测试 1.生成公钥和私钥 ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa 默 ...
- 禁止Apache显示目录索引的常见方法
禁止Apache显示目录索引,禁止Apache显示目录结构列表,禁止Apache浏览目录,这是网上提问比较多的,其实都是一个意思.下面说下禁止禁止Apache显示目录索引的常见的3种方法. 要实现禁止 ...
- 如何用MathType编辑出积分符号
MathType由于能够编辑出众多的数学符号而备受理工科学生与老师的喜爱.利用它,你可以在文档中随意编写出你想要的公式.对于从来没有用过公式编辑器的人来说,在文档中看到那些复杂的数学公式时总是会为之惊 ...
- uva 707(记忆化搜索)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=21261 思路:此题需要记忆化搜索,dp[x][y][t]表示当前状 ...
- oracle decode处理被除数为0 的情况
,,a) per from aa; 例如 我的b为(N30+N31+N32+N33+N34+N35+N36+N37+N38) ,,(N33)||'%' WHERE ssrq=''||sssq||'';
- kafka对比RocketMQ(转)
淘宝内部的交易系统使用了淘宝自主研发的Notify消息中间件,使用Mysql作为消息存储媒介,可完全水平扩容,为了进一步降低成本,我们认为存储部分可以进一步优化,2011年初,Linkin开源了Kaf ...
- Redis异构集群数据在线迁移工具Redis-Migrate-Tool【转】
摘要:Redis-Migrate-Tool(后面都简称RMT),是唯品会开源的redis数据迁移工具,主要用于异构redis集群间的数据在线迁移,即数据迁移过程中源集群仍可以正常接受业务读写请求,无业 ...
- 用SQL语句创建触发器
--假设XSCJ数据库中增加一新表XS_HIS,表结构和表XS相同,用来存放从XS--表 --中删除的记录.创建一个触发器,当XS表被删除一行,把删除的记录写到日--志表XS_HIS中. CREATE ...