时间:2021-07-01 10:21:17 帮助过:8人阅读
              书写顺序:select from where groupby having orderby
                        Mysql在执行sql语句时的执行顺序:from where select group by having order by
                *分析:        
                    select math+english+chinese as 总成绩 from exam where 总成绩 >250; ---- 不成功(因为where执行顺序在select之前,总成绩那里还没命名就被使用了,所以报错)
                    select math+english+chinese as 总成绩 from exam having 总成绩 >250; --- 成功
                    select math+english+chinese as 总成绩 from exam group by 总成绩 having 总成绩 >250; ----成功
                    select  math+english+chinese as 总成绩 from exam order by 总成绩;----成功
                    select * from exam as 成绩 where 成绩.math>85; ---- 成功
            
            
--------------------------------------------------------------------------------------------------
四、约束
        
    1.创建表时指定约束:
            create table tb(
                id int primary key auto_increment,
                name varchar(20) unique not null,
                ref_id int,
                 foreign key(ref_id) references tb2(id)
            );
            
            create table tb2(
                id int primary key auto_increment
            );
            
    2.外键约束:在使用表来存储数据时,可以明确的声明表和表之前的依赖关系,命令数据库来帮我们维护这种关系,这种约束就叫做外键约束
            (1)增加外键:
                可以明确指定外键的名称,如果不指定外键的名称,mysql会自动为你创建一个外键名称。
                RESTRICT : 只要本表格里面有指向主表的数据, 在主表里面就无法删除相关记录。
                CASCADE : 如果在foreign key 所指向的那个表里面删除一条记录,那么在此表里面的跟那个key一样的所有记录都会一同删掉。
                alter table book add [constraint FK_BOOK] foreign key(pubid) references pub_com(id) [on delete restrict] [on update restrict];
            
            (2)删除外键
                alter table 表名 drop foreign key 外键(区分大小写,外键名可以desc 表名查看);
                
                
    3.主键约束:
            (1)增加主键(自动增长,只有主键可以自动增长)
                Alter table tb add primary key(id) [auto_increment];
            (2)删除主键
                alter table 表名 drop primary key
            (3)增加自动增长
                Alter table employee modify id int auto_increment;
            (4)删除自动增长
                Alter table tb modify id int;        
    
    
    
--------------------------------------------------------------------------------------------------
五、多表设计
    一对一(311教室和20130405班级,两方都是一):在任意一方保存另一方的主键
    一对多、多对一(班级和学生,其中班级为1,学生为多):在多的一方保存一的一方的主键
    多对多(教师和学生,两方都是多):使用中间表,保存对应关系
--------------------------------------------------------------------------------------------------
六、多表查询
        create table tb (id int primary key,name varchar(20) );
        create table ta (
                id int primary key,
                name varchar(20),
                tb_id int
                                        );
        insert into tb values(1,‘财务部‘);
        insert into tb values(2,‘人事部‘);
        insert into tb values(3,‘科技部‘);
        
        insert into ta values (1,‘刘备‘,1);
        insert into ta values (2,‘关羽‘,2);
        insert into ta values (3,‘张飞‘,3);
        
        
        mysql> select * from ta;
            +----+------+-------+
            | id | name | tb_id |
            +----+------+-------+
            |  1 | aaa  |     1 |
            |  2 | bbb  |     2 |
            |  3 | bbb  |     4 |
            +----+------+-------+
        mysql> select * from tb;
            +----+------+
            | id | name |
            +----+------+
            |  1 | xxx  |
            |  2 | yyy  |
            |  3 | yyy  |
            +----+------+
    
        1.笛卡尔积查询:两张表中一条一条对应的记录,m条记录和n条记录查询,最后得到m*n条记录,其中很多错误数据
            select * from ta ,tb;
        
            mysql> select * from ta ,tb;
                +----+------+-------+----+------+
                | id | name | tb_id | id | name |
                +----+------+-------+----+------+
                |  1 | aaa  |     1 |  1 | xxx  |
                |  2 | bbb  |     2 |  1 | xxx  |
                |  3 | bbb  |     4 |  1 | xxx  |
                |  1 | aaa  |     1 |  2 | yyy  |
                |  2 | bbb  |     2 |  2 | yyy  |
                |  3 | bbb  |     4 |  2 | yyy  |
                |  1 | aaa  |     1 |  3 | yyy  |
                |  2 | bbb  |     2 |  3 | yyy  |
                |  3 | bbb  |     4 |  3 | yyy  |
                +----+------+-------+----+------+
        2.内连接:查询两张表中都有的关联数据,相当于利用条件从笛卡尔积结果中筛选出了正确的结果。
            select * from ta ,tb where ta.tb_id = tb.id;
            select * from ta inner join tb on ta.tb_id = tb.id;
        
            mysql> select * from ta inner join tb on ta.tb_id = tb.id;
                +----+------+-------+----+------+
                | id | name | tb_id | id | name |
                +----+------+-------+----+------+
                |  1 | aaa  |     1 |  1 | xxx  |
                |  2 | bbb  |     2 |  2 | yyy  |
                +----+------+-------+----+------+
        3.外连接
            (1)左外连接:在内连接的基础上增加左边有右边没有的结果
            select * from ta left join tb on ta.tb_id = tb.id;
            
            mysql> select * from ta left join tb on ta.tb_id = tb.id;
                +----+------+-------+------+------+
                | id | name | tb_id | id   | name |
                +----+------+-------+------+------+
                |  1 | aaa  |     1 |    1 | xxx  |
                |  2 | bbb  |     2 |    2 | yyy  |
                |  3 | bbb  |     4 | NULL | NULL |
                +----+------+-------+------+------+
            (2)右外连接:在内连接的基础上增加右边有左边没有的结果
                select * from ta right join tb on ta.tb_id = tb.id;
                
                mysql> select * from ta right join tb on ta.tb_id = tb.id;
                +------+------+-------+----+------+
                | id   | name | tb_id | id | name |
                +------+------+-------+----+------+
                |    1 | aaa  |     1 |  1 | xxx  |
                |    2 | bbb  |     2 |  2 | yyy  |
                | NULL | NULL |  NULL |  3 | yyy  |
                +------+------+-------+----+------+
                
            (3)全外连接:在内连接的基础上增加左边有右边没有的和右边有左边没有的结果
                select * from ta full join tb on ta.tb_id = tb.id; --mysql不支持全外连接
                select * from ta left join tb on ta.tb_id = tb.id 
                union
                select * from ta right join tb on ta.tb_id = tb.id;
                
                mysql> select * from ta left join tb on ta.tb_id = tb.id
                    -> union
                    -> select * from ta right join tb on ta.tb_id = tb.id; --mysql可以使用此种方式间接实现全外连接
                +------+------+-------+------+------+
                | id   | name | tb_id | id   | name |
                +------+------+-------+------+------+
                |    1 | aaa  |     1 |    1 | xxx  |
                |    2 | bbb  |     2 |    2 | yyy  |
                |    3 | bbb  |     4 | NULL | NULL |
                | NULL | NULL |  NULL |    3 | yyy  |
                +------+------+-------+------+------+
最基本的mysql
标签:type 替代 char att arc 多对多 右外连接 ref character