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进行逐条判断,报错

MySQL查询语句详解,排序、分组、聚合函数、约束的更多相关文章

  1. 【转】MySQL查询缓存详解

    [转]MySQL查询缓存详解 转自:https://www.cnblogs.com/Alight/p/3981999.html 相关文章:http://www.zsythink.net/archive ...

  2. MySQL查询缓存详解(总结)

    MySQL查询缓存详解(总结) 一.总结 一句话总结: mysql查询缓存还是可以用用试一试,但是更推荐分布式,比如redis/memcache之流,将数据库中查询的数据和查询语句以键值对的方式存进分 ...

  3. MySQL查询缓存详解

    一:缓存条件,原理 MySQL Query Cache是用来缓存我们所执行的SELECT语句以及该语句的结果集,MySql在实现Query Cache的具体技术细节上类似典型的KV存储,就是将SELE ...

  4. SQL之开窗函数详解--可代替聚合函数使用

    在没学习开窗函数之前,我们都知道,用了分组之后,查询字段就只能是分组字段和聚合的字段,这带来了极大的不方便,有时我们查询时需要分组,又需要查询不分组的字段,每次都要又到子查询,这样显得sql语句复杂难 ...

  5. SEC8 - MySQL 查询语句--------------进阶4:常见的函数

    # 进阶4:常见的函数 /* 概念:将一组逻辑语句封装在方法体中,对外暴露方法名 好处:1.隐藏了实现细节 2.提高代码的复用性 调用: select 函数名() [from 表]; 特点: (1)叫 ...

  6. MySQL 查询语句--------------进阶5:分组查询

    #进阶5:分组查询 /* select 分组函数,列(要求出现在group by的后面) from 表 [where 筛选条件] group by 分组的列表 [order by 子句] 注意: 查询 ...

  7. [转]MySQL查询语句执行过程详解

    Mysql查询语句执行原理 数据库查询语句如何执行?语法分析:首先进行语法分析,对使用sql表示的查询进行语法分析,生成查询语法分析树.语义检查:检查sql中所涉及的对象以及是否在数据库中存在,用户是 ...

  8. 【转】MySQL用户管理及SQL语句详解

    [转]MySQL用户管理及SQL语句详解 1.1 MySQL用户管理 1.1.1 用户的定义 用户名+主机域 mysql> select user,host,password from mysq ...

  9. mysql基础篇 - SELECT 语句详解

    基础篇 - SELECT 语句详解         SELECT语句详解 一.实验简介 SQL 中最常用的 SELECT 语句,用来在表中选取数据,本节实验中将通过一系列的动手操作详细学习 SELEC ...

随机推荐

  1. flutter 卡在Running Gradle task 'assembleDebug'...

    Android项目运行时出错 卡在Initializing gradle… 运行时会卡在Initializing gradle..., 此时因为Android项目会用到Gradle, 如果没有FQ,下 ...

  2. (13)centos7 任务计划

    一.查看任务计划 crontab -l 查看全部任务计划列表 二.创建任务计划 1.进入计划文件 crontab -e 2.任务格式 语法: 分钟 小时 几号 月份 星期几 任务 #一共5个时间参数 ...

  3. shell cat 合并文件,合并数据库sql文件

    > 覆盖写入 >> append模式写入 ###################################################################合并数 ...

  4. mkdir无法创建目录权限不够

    https://idc.wanyunshuju.com/cym/40.html 由于在公司服务器上权限问题比较复杂,我们解决这个问题是寻求服务器端人员的意见.让他们授予权限/.

  5. Java并发主要操作

    核心Java提供对多线程程序的完全控制. 也可以开发一个可以根据您的要求完全暂停,恢复或停止的多线程程序. 有各种静态方法可以用于线程对象来控制它们的行为. 下表列出了这些方法 - 编号 方法 说明描 ...

  6. js 点击获取验证码后的倒数60s

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <script ...

  7. <Git>git学习

    1.安装 分布式版本控制:工作电脑保存完整的代码,中央服务器挂了也可以使用 集中式版本控制:中央服务器挂了就凉凉 sudo apt-get install git git安装 检测安装成功 git 2 ...

  8. <python练习题>python练习题(常练勿忘)

    学了python,去面试经常出现,某个或某些库不熟悉导则想不起来怎么写,知道思路而写不出来,多半还是不够熟悉,这里就作为熟悉python的地方,多做做题,多思考. 题目1:店铺ID为00000000- ...

  9. pytest_fixture-----conftest共享数据及不同层次共享

    场景:你与其他测试工程师合作一起开发时,公共的模块要在不同文件中,要 在大家都访问到的地方. 解决:使用conftest.py 这个文件进行数据共享,并且他可以放在不同位置起 着不同的范围共享作用. ...

  10. RTL_PROCESS_MODULE_INFORMATION

    typedef struct _RTL_PROCESS_MODULE_INFORMATION { HANDLE Section; // Not filled in PVOID MappedBase; ...