python之路-----MySql操做二

一.主键
  1.每一个 表只有一个主键
  2.每一个主键能够由多个列组成.(若是主键由多个组成,只要有一行列值不等便可)
CREATE TABLE NAME (
    id INT auto_increment,
    NAME CHAR (20),
    sid int,
    PRIMARY KEY (id, sid)
);
插入数据(1,'a',1),主键值为:(1,1)  ,插入(1,'b',2),主键为(1,2),两个主键值不彻底相等便可
主键示例
二.惟一索引
  惟一索引也是一种约束,约束内容为:
  1.能够为空,可是不能重复
  2.加快查询速度
CREATE TABLE name1 (
    id INT auto_increment,
    NAME CHAR (20),
    UNIQUE qu_name (NAME),
    INDEX (id)
)
惟一索引示例
  惟一索引的值能够为多列,称为联合惟一索引
  和主键的区别:
    1.主键不容许为空,惟一索引能够为空
    2.主键可在表外部被调用,惟一索引只能在表内使用
 
 

 三.自增mysql

  1.修改自增列起始值
    1.1.查看表数据
      DESC hostinfo;
    1.2.查看建立表时的命令:
      show CREATE TABLE tablename
      show CREATE TABLE tablename \G 竖着显示数据
CREATE TABLE `more2` (
`id` int(11) NOT NULL AUTO_INCREMENT, `pc_name` char(20) DEFAULT NULL, `owner_id` int(11) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uq_more2` (`owner_id`), CONSTRAINT `one2_more2` FOREIGN KEY (`owner_id`) REFERENCES `one2` (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8
    1.3.经过修改表的auto_increment值来进行自增初始值的修改
      ALTER TABLE tablename auto_increment=9;
     这时候会从9开始自增,新插入的数据自增列值为9.
  2.修改步长
  mysql的步长单位和其余的数据库软件不一样,部分数据库的步长为表级别的,能够针对表设置步长,而mysql的步长修改成会话级别的,一次链接修改的步长仅本次链接有效,若是新建链接,而步长依旧为1.
  2.1 查看步长
    show session variables like '%auto_inc%';     #查看session变量

        +--------------------------+-------+
        | Variable_name | Value |
        +--------------------------+-------+
        | auto_increment_increment | 1 |   #步长
        | auto_increment_offset | 1 |       #数量默认起始值
        +--------------------------+-------+sql

  2.2 修改session级别自增变量值
     set session auto_increment_increment=3;   #设置步长为3
    set session auto_increment_offset=5;           #设置自增列默认起始值为5
  2.3 查看修改后的值   

        +--------------------------+-------+
        | Variable_name | Value |
        +--------------------------+-------+
        | auto_increment_increment | 3 |
        | auto_increment_offset | 5 |
        +--------------------------+-------+数据库

    新建链接,查看自增起始值和步长服务器

        +--------------------------+-------+
        | Variable_name | Value |
        +--------------------------+-------+
        | auto_increment_increment | 1 |
        | auto_increment_offset | 1 |
        +--------------------------+-------+session

  咱们发送,经过修改session变量,仅本次链接有效,若是要使修改的值永久有效,须要修改global变量运维

  2.4查看global自增相关变量值ide

    show global variables like '%auto_inc%'; spa

        +--------------------------+-------+
        | Variable_name | Value |
        +--------------------------+-------+
        | auto_increment_increment | 1 |
        | auto_increment_offset | 1 |
        +--------------------------+-------+设计

  2.5 修改global变量code

    set global auto_increment_increment=2;  #修改自增步长

      set global auto_increment_offset=2;      #修改自增列起始值

  2.6 新建链接查看,配置依旧生效 。可是不建议使用该方法进行修改

四.外键
  补充:当主键为多个时,外键能够关联多个
 create table morekey(
    id int auto_increment,
    sid int,
    name  char(20),
    PRIMARY KEY(id,sid)
);
CREATE table morekey1(
    id1 INT,
    sid1  INT,
    name1 CHAR(20),
    CONSTRAINT fk_moremore FOREIGN KEY(id1,sid1) REFERENCES morekey(id,sid)
 )
关联多个外键
  1.一对多
    当咱们对两个表经过外键创建约束关系时,此时表A的值对应应表B的多个值时,且B表的值仅对应A表的一个值,则该关系为一对多。例如部门表和员工表。一个员工仅对应一个部门,而一个部门却能够对应多个员工。
 create table morekey(
    id int auto_increment,
    sid int,
    name  char(20),
    PRIMARY KEY(id,sid)
);
CREATE table morekey1(
    id1 INT,
    sid1  INT,
    name1 CHAR(20),
    CONSTRAINT fk_moremore FOREIGN KEY(id1,sid1) REFERENCES morekey(id,sid)
 )
一对多示例
  2.一对一
    当B表的值受A表的约束,且A表的值只能被B表使用一次,这时候A表和B表的值是一对一的。例如公司资产登记,一台pc只能归一个职工使用。或者是密码登录管理,不容许用户名重复。
    咱们知道,惟一索引的做用就是对表内的值进行约束,使其在表内是惟一的,不容许重复。咱们利用外键和惟一索引,便可完成一对一的表格设计
-- pc编号 
CREATE TABLE hostinfo(
    id int auto_increment PRIMARY KEY,
    host_name CHAR(20)
);
-- 用户资产信息
CREATE TABLE employ(
    id int auto_increment PRIMARY KEY,
    name char(20),
    pc_id int,
    UNIQUE uq_hostinfo_employ (pc_id),
    CONSTRAINT fk_hostinfo_employ FOREIGN KEY (pc_id) REFERENCES hostinfo(id)
);
一对一示例
  3.多对多
    当A表的值和B表的值互相对应多个时,即两表之间有着多对多的关系。例如运维人员对公司服务器的主机管理,一我的可登录多台服务器,一台服务器也可多人登录。
    咱们须要利用第三张表来记录A表和B表之间多对多的关系。
-- 主机信息表 
CREATE TABLE pcinfo(
    id int auto_increment PRIMARY KEY,
    host_name char(20)
);
-- 管理员信息表 
CREATE TABLE admininfo(
    id int auto_increment PRIMARY KEY,
    name char(20)
);
-- 管理员主机对应表
CREATE TABLE admin_pc(
    id int auto_increment PRIMARY KEY,
    pc_id int ,
    user_id int,
    UNIQUE uq_user_pc (pc_id,user_id),
    CONSTRAINT fk_admin_pc FOREIGN KEY(pc_id) REFERENCES pcinfo(id),
    CONSTRAINT fk_admin_user FOREIGN KEY(user_id) REFERENCES admininfo(id)
);
多对多示例

 

五.操做表内容高级运用补充

  1.笛卡尔积

    笛卡尔积是关系代数里的一个概念,表示两个表中的每一行数据任意组合。例如A表中有三条数据,B表中有三条数据,则使用命令:

    select * from A,B,则会产生九条结果。A表的每一个值都会和B表的每一个值产生一条对应的值。关系图以下:

            

 

  2.临时表,将过滤出来的数据临时当成一张表使用

命令格式:(SELECT 列名 FROM 表) as B

应用
连表操做:
SELECT * FROM (SELECT sid FROM score) as B LEFT JOIN student on student.sid=B.sid;
把score表中过滤出来的数据和student表进行连表操做

      3.insert插入过滤后的表内容

INSERT INTO class(caption) SELECT name FROM class2;
ps:须要注意的是,插入的列要跟表的列一致

  4.条件语句

  句型:case when 条件 then 条件为正返回 esle 条件为假返回 end

case when id<10 then 1 else 0 end;   #若是id小于10,则返回1,不然返回0

  5.利用常量来统计

select count(1) from tablename groub by id;

  6.插入动态值

SELECT 
                        student_id,
                        (select num from score as s2 where s2.student_id=s1.student_id and course_id = 1) as 语文,
                        (select num from score as s2 where s2.student_id=s1.student_id and course_id = 2) as 数学,
                        (select num from score as s2 where s2.student_id=s1.student_id and course_id = 3) as 英语
                    from score as s1;

  s1表的值能够再内循环中使用。相似于:

for student_id in s1:
    for id in s2:
        s2=s1

   7.三元运算

    if(条件,为真返回,为假返回)

    e.g:if (isnull(xx),0,1)  若是为null,则返回0,不然返回1

相关文章
相关标签/搜索