MySQL查询语句详解,排序、分组、聚合函数、约束

create database day20;
  查询的时候from前面的字段是需要显示出来的内容,后面是条件
use day20;
create table phones(id int,pinpai varchar(20),xinghao varchar(20),jiage double,miaoshu varchar(200));
insert into phones values (1,'apple','7plus',5800,'so expensive'),
              (2,'apple','6',4888,'so expensive'),
              (3,'huawei','p9',3200,'hao ka'),
                (4,'xiaomi','4',1888,'hao re'),
                (5,'huawei','p10',4888,'kabuka'),
                (6,'xiaomi','6',2888,'hai shi re');
排序:
  order by xxx desc;(降序)
  order by xxx asc;(升序)默认的也是升序

  注意:
    1.字符串可以排列,因为字符底层对应的是数字
    2.排序标准可以有多个,多个情况下
      如果第一排序标准一样,在按照第二排序标准比较...
      例:select * from phones order by id,jiage desc;

聚合函数:(可以理解为分组之后的属性)
  根据多条记录产生一个结果,比如:
    avg 平均值
    max 最大值
    min 最小值
    sum 总和
    count 总记录数

  总结:

    1:聚合函数一般作用于数字,字段最好是数值型的(平均值和总和如果是字符串结果为0)
    2:如果在字符串上使用聚合函数,那么
      max min 按照字符串排序得到一个结果
      sum avg 得到的结果是0

分组:
  就是按照某个字段,对表内数据进行分类

  语法:
    1.group by xxx 按照某个字段分组,字段值相同的归为一组
    2.分组一般结合聚合函数使用
    3.如果不适用聚合函数,使用字段,那么选取组内的第一条记录
  显示字段,使用时一般使用分组所依赖的字段
    正常使用:select pinpai from phones group by pinpai;
    不建议使用:select xinghao from phones group by pinpai;
          select * from phones group by pinpai; (除了分组所依赖的数据正常显示以为其它的都是表中该组的第一条记录)

  having
    对组进行条件筛选时,使用having +条件,不能使用where
    where 用于单条记录筛选,分组前进行判断
    having 专门用于组的筛选,分组之后进行判断


约束:!!!!
  主键   编号必须填写值,且不能重复,作用:给当前记录起一个独一无二的编号
  外键   ...(多表中的表连接)
  非空   使用的非空的字段,必须有值,不能使用null
  唯一   不能重复
  检查   mysql没有提供
  主键一个表只能有一个,其它约束可以有多个

主键:
  非空唯一,一个表只能有一个主键(可以没有)
  添加语法:
    1:字段名 字段类型 primary key;
    2:所有的字段最后 primary key (字段)
    3:所有的字段最后并给约束起别名 constraint 别名 primary key(字段)
    4:先创建表,在给表中字段添加主键(相当于修改字段)
       alter table phones add primary key(id);
  主键自增长:
    auto_increnment
      使用之后主键可以插入null或者不插入就是自动递增
      使用之后如果自己插入一个 id值的话自增长的起始值就会随着插入的值而改变
    自增长自己赋初始值
      ALTER TABLE phones AUTO_INCREMENT = 100;
    注意:
      1.自增长不适用字符串类型的主键
      2.以后主键使用varchar类型,以后会提供专门算法生成

    面试题:
      delete 与 truncate 的关于主键自增长的区别,前者会保留以前的主键信息
      但是后者会重新从1开始计数,因为后者是删除表之后在建表

唯一:
  使用唯一约束的字段,在当前表中值不能重复出现

  语法:
    1:字段名 字段类型 unique (最常用)
    2:所有的字段最后: unique(字段名)
    3:所有的字段最后并给约束起别名: constraint 别名 unique(字段名)
    4:先创建表,在给表中字段添加约束
       alter table phones add [constraint 别名]unique(字段名)
  注意:
    所有的添加约束中,如果表中已经有了数据,最好先清空表,然后再给字段添加约束
    不然如果以后数据违反约束就会添加失败,(如果没有出现问题,可以使用)

删除约束:
  alter table 表名 drop index 约束字段名;  删除唯一约束
  alter table 表名 drop primary key;     删除主键约束

非空:
  限制字段,让字段必须插入对应的值

  语法:
    字段名 数据类型 not null

  删除非空:
    alter table 表名 modify 字段名 数据类型();  相当于更改了一下数据类型

多表:
  如果一张表中与很多数据是重复的,就会造成空间的浪费,并且数据修改时效率低
  思路:
    将重复的内容单独记录在一张表中,并将两张表建立连接,一对多
  一对多:
    表A当中的一条记录,对应表B中的多条记录,就是一对多
    “一”的表 主表
    “多”的表 从表
      从表必须依赖于主表
  分析:从表中所依赖的字段值必须在主表中存在
     主表中不能随便删除值,否则从表中所依赖的数据找不到对象

外键约束:

  字段名 数据类型(长度) foreign key references 主表(字段)
  alter table 从表 add constraint 约束名 foreign key(从表字段) references 主表(字段);
  删除外键:
    ALTER TABLE teacher DROP FOREIGN KEY kt_tc1(这里必须是外键的别名);
    alter table 表名 drop constraint 约束别名; 可以删除所有的约束
  优点:
    从表中不能随便插入数据
    主表中不能随便删除数据
      但是从表可以随便删,主表可以随便插

  多对多:
    表A中一条记录对应表B中多条记录,反之,表B中的一条记录也可以对应表A中的多条记录
  实现:
    新建一张表,表中的字段都是外键,关联两张表的主键,三张表结合
    不能将两张表的字段结合(把表A的主键设置为表B的外键,同时把表B的主键设置为表A的外键,语法上没有问题,但是不能添加数据
    因为为外键添加数据时必须所依赖的主键必须有相应的值)


  1.一般情况必须关联表的主键(常用)
  2.也可以关联主表的其他字段,但必须是唯一

#count(*)用在前面显示每组数据的个数   //只是一个属性值,并不能帮助控制输出的语句条数
# 一定要有分组,(否则就是所有的数据为一组,显示第一条符合条件的数据)
# 如果是对每条数据进行条件判断则用where必须在分组之前
# 如果是对每组的数据进行条件判断则用having且必须在分组之后

where 和 having
  每张表最基本的单位就是字段(属性)
  where 对表的基本属性进行操作(逐条操作),用在分组之前
    where id = ... and name = ... and ...
  如果分组之后(不用group by时也可以默认一张表为一个组),就没有这些基本属性了
  having 对分组之后组的属性进行操作
    组的属性有:max(基础属性)   min(基础属性)   sum(基础属性(这里最好是int))
    avg(基础属性(这里最好是int))    count(基础属性(不为空的记录条数,一般用*)) 
  1.属性与属性之间不能进行比较,属性只能与具体数值进行比较,属性在前,数值在后
  2.如果此时还用基础属性进行条件判断(包括依赖分组的属性),语法不报错,但是没有值
  3.分组之后用where进行逐条判断,报错

posted on 2017-04-15 23:36  刚反面  阅读(1015)  评论(0编辑  收藏  举报

导航