zoukankan      html  css  js  c++  java
  • 第三十六章 MYSQL语句(一)

    4.外键(一对多):
    作用: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;
    注意:
    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.主键索引:加速查找+不能为空+不能重复

    外键的变种:(重点)
    1.唯一索引:unique
    create table 表名( id int,
    num int,
    unique(num) #num成为唯一
    )engine=Innodb charset=utf8;
    作用:num列的值不能重复,加速查找
    2.联合唯一索引:
    create table 表名(id int,
    num int,
    unique(id,num)
    )engine =Innodb charset=utf8;
    作用: num 列和id列的值不能重复,加速查找
    3.多重联合索引:
    create table 表名(id int,
    num int,
    ... ,
    unique(num,int,...)
    ) engine = Innodb charset=utf8;
    5.外键:一对一:
    多对多:

    高级查询:
    增:insert into 表名(列名1,列名2,) values(值1,值2); 添加一条
    insert into 表名(列名1,列名2) values (值1,值2),(值1,值2),(值1,值2); #添加多条
    insert into 表名(列名1,列名2) select 列名1,列名2 from 表名; #从另外一个表中将数据复制到要操作的表中
    删除:删除可以在where后面加条件
    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 :或者 只要满足一个条件成立

    修改:可以在where后面加条件
    update 表名 set 列名='xxx',列名=23 where id >10;

    查询:
    基本:
    select * from 表名;
    select 列名,列名 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 表名 where id between 9 and 12:
    in :在某一个集合中
    select * from 表名 where id in (9,10,11,...);

    select * from t4 where id in (select id from t3 where id between 2 and 4)
    是可以这样使用的, 但是不建议大家使用;
    2. 通配符: like (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 表名 order by 列名 desc; descending
    select * from 表名 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 列名,聚合函数(count(num)/sum(num)/max(num)/min(num)/avg(num)) from 表名 group by 列名;
    select age, count(num) from t7 group by age;
    select age, count(num) as cnt from t7 group by age; 显示别名 as

    having 的二次删选:
        having 可以单独使用:
    select * from 表名 having 列名 [筛选条件]
           select 列名,聚合函数 as 别名  from 表名 group by 列名 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 表名,表名 where 表名.关联id=表名.关联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
    select * from score where
  • 相关阅读:
    python 基础2.5 循环中continue与breake用法
    python 基础 2.4 while 循环
    python 基础 2.3 for 循环
    python 基础 2.2 if流程控制(二)
    python 基础 2.1 if 流程控制(一)
    python 基础 1.6 python 帮助信息及数据类型间相互转换
    python 基础 1.5 python数据类型(四)--字典常用方法示例
    Tornado Web 框架
    LinkCode 第k个排列
    LeetCode 46. Permutations
  • 原文地址:https://www.cnblogs.com/sry622/p/11022628.html
Copyright © 2011-2022 走看看