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进行逐条判断,报错
MySQL查询语句详解,排序、分组、聚合函数、约束的更多相关文章
- 【转】MySQL查询缓存详解
[转]MySQL查询缓存详解 转自:https://www.cnblogs.com/Alight/p/3981999.html 相关文章:http://www.zsythink.net/archive ...
- MySQL查询缓存详解(总结)
MySQL查询缓存详解(总结) 一.总结 一句话总结: mysql查询缓存还是可以用用试一试,但是更推荐分布式,比如redis/memcache之流,将数据库中查询的数据和查询语句以键值对的方式存进分 ...
- MySQL查询缓存详解
一:缓存条件,原理 MySQL Query Cache是用来缓存我们所执行的SELECT语句以及该语句的结果集,MySql在实现Query Cache的具体技术细节上类似典型的KV存储,就是将SELE ...
- SQL之开窗函数详解--可代替聚合函数使用
在没学习开窗函数之前,我们都知道,用了分组之后,查询字段就只能是分组字段和聚合的字段,这带来了极大的不方便,有时我们查询时需要分组,又需要查询不分组的字段,每次都要又到子查询,这样显得sql语句复杂难 ...
- SEC8 - MySQL 查询语句--------------进阶4:常见的函数
# 进阶4:常见的函数 /* 概念:将一组逻辑语句封装在方法体中,对外暴露方法名 好处:1.隐藏了实现细节 2.提高代码的复用性 调用: select 函数名() [from 表]; 特点: (1)叫 ...
- MySQL 查询语句--------------进阶5:分组查询
#进阶5:分组查询 /* select 分组函数,列(要求出现在group by的后面) from 表 [where 筛选条件] group by 分组的列表 [order by 子句] 注意: 查询 ...
- [转]MySQL查询语句执行过程详解
Mysql查询语句执行原理 数据库查询语句如何执行?语法分析:首先进行语法分析,对使用sql表示的查询进行语法分析,生成查询语法分析树.语义检查:检查sql中所涉及的对象以及是否在数据库中存在,用户是 ...
- 【转】MySQL用户管理及SQL语句详解
[转]MySQL用户管理及SQL语句详解 1.1 MySQL用户管理 1.1.1 用户的定义 用户名+主机域 mysql> select user,host,password from mysq ...
- mysql基础篇 - SELECT 语句详解
基础篇 - SELECT 语句详解 SELECT语句详解 一.实验简介 SQL 中最常用的 SELECT 语句,用来在表中选取数据,本节实验中将通过一系列的动手操作详细学习 SELEC ...
随机推荐
- LUOGU P5061 秘密任务(背包+二分图染色)
传送门 解题思路 \(orz\)出题人的神仙做法.本蒟蒻看不懂,就水个求补图再二分图染色的方法来\(%1%\)出题人. 首先我们对图中\(m\)个关系连边,发现这样是没法做的,因为我们最后要关注的是谁 ...
- NX二次开发-C语言文件读写fwrite和fread函数
NX9+VS2012 #include <uf.h> #include <stdio.h> UF_initialize(); /* //设置文件路径 const char* f ...
- CSS:百科
ylbtech-CSS:百科 1.返回顶部 CSS (层叠样式表) 层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标 ...
- CPUID读取有关Cache的信息
1: void cpuidTest() 2: { 3: u32 val_eax, val_ebx, val_ecx, val_edx; 4: asm("cpuid" 5: : &q ...
- swapper_pg_dir的作用
在内存系统初始化过程中,有如下代码: 1: static void __init pagetable_init(void) 2: { 3: pgd_t *pgd_base = swapper_pg_d ...
- 022_IO流
对象流 // FileInput.FileOutputStream(节点流)ObjectInputStreamObjectOutputStream 序列化 把内存的数据信息永久的保存在硬盘中,这个过程 ...
- HBase启动错误提示别的机器60000已经存在
已经用cm 安装好了cdh,需要在上面添加HBase,并且做一个HBase故障转移功能,现在需要配置2个HMaster 在不同的机器上. 启动出现异常信息: 2015-12-23 14:44:38, ...
- 【踩坑】IDEA 设置 JVM 参数
1.可视化界面设置 Run->Edit Configuration... 然后设置 2.配置文件设置 打开 IDEA 安装目录,看到有一个 bin 目录,其中有两个 vmoptions 文件,需 ...
- react组件中的方法?
SetState 设置状态 ReplaceState 替换状态 setProps设置属性 replacerProps替换属性 forceUpdate 强制更新 findDOMNode获取DOM节点 i ...
- C static extern和全局变量
#include <stdio.h> //默认全局变量为外部变量 int a; //当全局变量前面加上static时,该变量为内部变量 static int b; void test(); ...