Python--day42(数据库)

1:首先唯一索引:

    create table t5(

    id int,

    num int,

    unique(num))engine=Innodb charset=utf8;

  作用: num列的值不能重复

    加速查找

    create table t5(

    id int,

    num int,

    unique(int,num))engine=Innodb charset=utf8;

    里面放两个 是联合所引.他的作用是:

      num列和id列的值 一起不能重复

     也可以放多个 代表里面的值都一起不能重复

1:外键另外两种使用方式

  1:昨天说的一对多

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

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

  2:一对一 

  用户表:
    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)

  Django orm 也会设计

二:数据行的操作

  1:增 insert into 表明 (列名1,列名2) values (值1,值2),(值1,值2),()....

  2:insert into 表名 (列名1,列名2) select 列名1,列名2 from 表明2;

  

  删除 delete from 表名; #这样就把整张表删掉了

   delete from表名 where id > 10:  删掉条件之内的

  where 后面可以加多个条件 用 and or 隔开,跟python一样 and就是并且 or 就是或

  2:查询

    select * from 表名; #这样就把所有的数据都列出来了

    select name,age from 表名;

  后面还可以加where条件筛选 

    select * from表名 where id=10;

    运算符 就是> <  >=  <=  = != 

    还有个between and 是闭区间

      id between 1 and 10;

    in 在某个集合内

    

    然后通配符 

    select * from 表名 where name like 'aaa%' 

    select * from 表名 where name like 'aaa_'

    

    然后限制取几条

    limit 前面是偏移量 后面是取得数据量

    select * from t3 limit 0,10 就是第一页的十条数据

    网页的页面就是用的这个原理  

    然后排序 order by 列名 desc 

   是降序排序

   升序是 order by 列名 asc

  select * from t4 order by num desc, name asc;

    如果前一列的值相等的话, 会按照后一列的值进行进一步的排序.

.    

分组

   select age,聚合函数 from 表名 group by 列名; 就会将这一列相同的数据分为一组

    count()  sum() max() min() avg() 

    

  having的二次删选:是跟在group后面的 

  1).having与where类似,可筛选数据
  2). where针对表中的列发挥作用,查询数据
  3). having针对查询结果中的列发挥作用,筛选数据

f. 连表操作
  select * from userinfo, department; (笛卡尔积) # 后面可以跟各种条件

 左连接 left join 

  就意思以左边的为主题 左边的表全部显示, 右边没有用到不显

  select * from userinfo left join department on userinfo.depart_id=department.id;

   右连接: right join 

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


  内连接: inner join

  左右两边的数据都会显示


  只需要记住左连接left join 就可以了 

  可以用连接语法链接多张表 通过某一个特定条件

 

查询的顺序是 首先 where 然后group by 跟着having  然后order排序  最后limit 

 where针对表中的列发挥作用,查询数据
having针对查询结果中的列发挥作用,筛选数据

上一篇:day42


下一篇:java 后端请求第三方接口 包含post请求和get请求