zoukankan      html  css  js  c++  java
  • 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,'5','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
     
  • 相关阅读:
    ALhoViMwaR
    lenovo anti-virus powered by Intel security保护已过期
    python Module turtle has no circle member解决办法
    为什么电脑打出来都是繁体字
    python 学习笔记(七)(函数)
    python 写汉诺塔移动过程
    python 学习笔记(六)(dict,set)
    Vue CLI组件循环引用踩坑,组件未注册问题
    vue package.json脚本赋值变量
    linux服务器安装node环境及项目部署
  • 原文地址:https://www.cnblogs.com/liyafei/p/9269922.html
Copyright © 2011-2022 走看看