外键,高级操作

一,外键 (一对多)

作用:
      1. 约束
      2. 节省空间
-------------------------------------------------------------------------------- create table department ( id int auto_increment primary key, depart_name varchar(
32) not null default '', num int not null default 0 )engine=Innodb charset=utf8; create table userinfo ( id int auto_increment primary key, name varchar(32) not null default '', depart_id int not null default 1, # constraint 外键名(fk_userinfo_depart) foreign key (列名(depart_id)) references 表名(department)(关联的列名(id)), # constraint fk_userinfo_depart foreign key (depart_id) references department(id) )engine=Innodb charset=utf8; ps: 1. 不能将创建外键的语句单独拿出来,以下方式可以 alter table userinfo add constraint fk_userinfo_depart foreign key (depart_id) references department(id); alter table userinfo drop foreign key 外键名称(fk_userinfo_depart ); 2. 外键关联的时候, 必须关联的是表的主键ID 3. 练习的时候, 将语句写在文本中, 然后考过去执行 4. 主键索引 : 加速查找 + 不能为空 + 不能重复

1, 唯一索引:

1. 唯一索引:

create table t5(
    id int,
    num int,
    unique(num)
)engine=Innodb charset=utf8;

作用: num列的值不能重复 加速查找 create table t6( id int, num int, unique(id, num) )engine
=Innodb charset=utf8;


联合唯一索引作用: num列和id列的值不能重复 加速查找 create table t6( id int, num int, unique(id, num......) )engine
=Innodb charset=utf8;

2, 一对多:

部门表:
    id       depart_name
     1          公关部
     2          公共部
     3          保安部

员工表:
    id    name  age   depart_id(外键)
    1     lxxx  12      2
    2     xxxx  13      1
    3     xxxx  13      2

 3, 一对一:

用户表:
    id    name     age  
    1      zekai    23  
    2      eagon    34
    3      lxxx     45
    4      owen     83

博客表:
    id            url          user_id  (外键 + 唯一约束)
    1       /linhaifeng       2
    2       /zekai            1
    3       /lxxx             3
    4       /lxxx             4

4. 多对多:

用户表:
    id    name    phone 
    1    root1    1234
    2    root2    1235
    3    root3    1236
    4    root4    1237
    5    root5    1238
    6    root6    1239
    7    root7    1240
    8    root8    1241
    
主机表:

    id    hostname    
    1    c1.com    
    2    c2.com    
    3    c3.com    
    4    c4.com    
    5    c5.com    

为了方便查询, 用户下面有多少台主机以及某一个主机上有多少个用户, 我们需要新建第三张表:
    user2host:
    
        id    userid    hostid
            1    1    1
            2    1    2
            3    1    3
            4    2    4
            5    2    5
            6    3    2
            7    3    4    
创建的时候, userid 和 hostid 必须是外键, 然后联合唯一索引 unique(userid, hostid)

二 , 数据行的操作:

增:
    insert into 表名 (列名1, 列名2,) values(值1, 值2);
    insert into 表名 (列名1, 列名2,) values(值1, 值2),(值1,值2),(值n,值n);
    
    insert into 表名 (列名1, 列名2,) select 列名1, 列名2 from 表名;
    
删除:
    delete from 表名; 
    
    delete from 表名 where id > 10
    delete from 表名 where id < 10
    delete from 表名 where id <= 10
    delete from 表名 where id >= 10
    delete from 表名 where id != 10 
    delete from 表名 where id = 10 and name='xxx';  and : 并且 两个条件都必须要成立
    delete from 表名 where id = 10 or name='xxx';   or :  或者 只要满足一个条件成立
修改: update 表名 set name
='zekai', age=23 where id > 10; 查询: 基本: select * from 表名; select name , age from 表名;

 1, where 条件查询:

select * from 表名 where  id=10;
    select * from 表名 where  id >10 and id<15;
    select * from 表名 where  id > 10;
    != : 不等与
    >= <= 
    
    
    between and: 闭区间 
        select * from t4 where id between 9 and 12;
    
    in: 在某一个集合中
        select * from t4 where id in (9,10,11....);
        
        select * from t4 where id in (select id from t3 where id between 2 and 4)
        

2. 通配符:

alex
  
    select * from 表 where name like 'ale%'  - ale开头的所有(多个字符串)
    select * from 表 where name like 'ale_'  - ale开头的所有(一个字符)

3,限制取几条:

select * from 表名 limit 索引偏移量, 取出多少条数据;


select * from t3 limit 0, 10;  第一页
select * from t3 limit 10, 10;  第二页

page = input('page:')

    page    索引偏移量      数据量(offset)
      1         0              10
      2         10             10
      3         20             10
      4         30             10
      
      page   (page-1)*offset   offset

分页核心SQL:

    select * from t3 limit (page-1)*offset, offset;

4,排序:

order by

降序:
    select * from t4 order by 列名 desc; descending

升序:
    select * from t4 order by 列名 asc; ascending


多列:
    
    create table t7(
    
        id int auto_increment primary key,
        num int not null default 0,
        age int not null default 0
    )charset=utf8;
    
    insert into t7 (num, age) values (2, 12),(3,13),(4, 12);

    select * from t4 order by num desc, name asc;
    
    如果前一列的值相等的话, 会按照后一列的值进行进一步的排序.

5,分组

select age, 聚合函数(count(num)/sum(num)/max(num)/min(num)/avg(num)) from 表名 group by 列名;


select age, avg(num) from t7 group by age;
 
select age, count(num) from t7 group by age;

select age, count(num) as cnt from t7 group by age;  显示别名 as

having的二次删选:
    select age, count(num) as cnt from t7 group by age  having cnt>1;
    
where 和 having的区别:
    1). having与where类似,可筛选数据
    2). where针对表中的列发挥作用,查询数据
    3). having针对查询结果中的列发挥作用,二次筛选数据, 和group by配合使用

6, 连表操作

select * from userinfo, department; (笛卡尔积)

select * from userinfo, department where userinfo.depart_id=department.id;

左连接:

    select * from userinfo left join department on userinfo.depart_id=department.id;
    左边的表全部显示, 右边没有用到不显示

右连接:
    
    select * from userinfo right join department on userinfo.depart_id=department.id;
    右边的表全部显示, 左边没关联的用null表示

内连接:
    左右两边的数据都会显示

ps: 
    a.只需要记住左连接 left join
    
    b.可以连接多张表 通过某一个特定的条件
            
注意查询的顺序:
select name,sum(score) from 表 where id > 10 group by score having age> 12  order by age desc limit 2, 10 
        

猜你喜欢

转载自www.cnblogs.com/HZLS/p/11040945.html
今日推荐