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
  • 相关阅读:
    《算法竞赛入门经典》—— 5.2.6 栈、队列与优先队列
    《算法:C语言实现》—— 第二部分 —— 第3章 —— 基本数据结构
    《算法:C语言实现》—— 第二部分 —— 第3章 —— 基本数据结构
    《算法:C语言实现》—— 第二部分 —— 第3章 —— 基本数据结构
    Broken Keyboard (a.k.a. Beiju Text)
    Broken Keyboard (a.k.a. Beiju Text)
    Broken Keyboard (a.k.a. Beiju Text)
    mongodb实战聚合 组内排序
    mongodb实战聚合 组内排序
    MongoDB基础篇:MongoDB Shell命令大全
  • 原文地址:https://www.cnblogs.com/sry622/p/11022628.html
Copyright © 2011-2022 走看看