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. 牛客网暑期ACM多校训练营(第五场) Agpa (最大化平均值)

    题目大意: 给定 n 门课以及它们的学分和绩点,定义总绩点是所有课的加权平均数,给定一个数 k, 你可以删除最多 k 门课,求你的总绩点最大能到多少 分析: 上面是牛客的官方题解,其实就是移项, 然后 ...

  2. 使用redis实现客户端和服务端token验证

    实在是思维江化啊,没有想到可以给redis设置不同的key值来实现不同key值存储不同的value值,而一直想着给一个名为token的key值新增不同的数据,并设置过期时间,然而这样却不能新增只能做到 ...

  3. jmeter 环境java监视和管理控制

    打开这个小工具的步骤很简单,如果你已经配置好了Jmeter运行的环境,那么你也就不用去做其他的配置,直接 点击:开始——>运行——>输入cmd——>然后在出现的命令行界面输入“jco ...

  4. Tomcat运行错误示例三

    Tomcat运行错误示例三 最近碰到tomcat启动的问题,如图: 以前也碰见过这种情况,这次写的时候忘记加return,所以跳出了错误,加上之后的效果,如图: 参考网址 参考网址

  5. Jeecg集成Swagger-ui

    <context:component-scan base-package="springfox"/> <bean class="org.jeecgfra ...

  6. 1、postman介绍与安装

    postman介绍 官方介绍:Developers use Postman to build modern software for the API-first world. 个人理解postman是 ...

  7. PAT_A1041#Be Unique

    Source: PAT A1041 Be Unique (20 分) Description: Being unique is so important to people on Mars that ...

  8. Java通道

    通道(Channel)是数据源和Java程序之间的开放连接,用于执行I/O操作.Channel接口在java.nio.channels包中.通道(Channel)接口只声明了两个方法:close()和 ...

  9. 第三记 Java面向对象

    相信很多人都有听到,见到这么一句话:Java是一门面向对象编程的语言,但是又是否对这句话有了自己的理解呢? 一.面向对象 面向对象是一种新兴的程序设计方法,也可以说是一种新的程序设计规范(paradi ...

  10. 从零起步 系统入门Python爬虫工程师✍✍✍

    从零起步 系统入门Python爬虫工程师 爬虫(又被称为网页蜘蛛,网络机器人)就是模拟客户端发送网络请求,接收请求响应,一种按照一定的规则,自动地抓取互联网信息的程序. 原则上,只要是浏览器(客户端) ...