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 ...
随机推荐
- 解决$.ajax请求在ie8下失效问题
ie8下默认把跨域请求拦截了,需要用jquery.xdomainrequest.min.js 处理跨域问题,需放在jq下引入 http://cdnjs.cloudflare.com/ajax/libs ...
- centos7下命令行配置nginx
本教程中的步骤要求用户拥有root权限 第一步 - 添加Nginx存储库要添加CentOS 7 EPEL仓库,请打开终端并使用以下命令: sudo yum install epel-release第二 ...
- project的操作说明
project 1 操作的步骤 设定一个起始时间:7月1号 安排好摘要(任务)的先后顺序 一个一个任务的来:A任务,下面有几个分布实现的部门: 设计部门 3个工作日 程序部门 1个工作日.然后配置相互 ...
- JHipster研究
liquibase工作原理: master.xml用来维护所有变更记录文件引用 changelog文件夹用来保存具体的变更细节 系统启动时会比较master.xml中include的file,应用差异 ...
- C# String类常用操作
1.string.Compare(s1,s2) 比较 按字母顺序后边的大于前边的 s1<s2 retrun -1 ;s1=s2 return 0; s1>s2 return1. Cons ...
- Educational Codeforces Round 56 D - Beautiful Graph
题目大意: 在给定的一个图中(可能不连通) 给每个点赋值1.2.3 使得一条边上的两个端点点权相加为奇数 求方案数 一条满足条件的路径上的点权必为一奇一偶交替 偶数只有2 奇数有1.3 若位于1.3 ...
- 22-8-filter
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- js 实现图片懒加载
搬运自其他大神,因为找不到链接了就没放,找到了补上. 个人情况:页面超过一屏,下方是大量图片数据(后台传来的html数据) ,想做到一开始不加载下方图片,滚动到进入可视区再加载图片. html:(需先 ...
- 关于EntityFramework 更新数据记录时字段全部更新问题和不从数据库中获取直接更新记录
一.一直对这个比较疑惑感觉只修改一条数据记录的一个字段结果更新Savechages后跟踪生成sql竟然是全部被修改,感觉微软怎么这么傻,总觉得会有其它方式可以只更新部分字段,但一直没有找到相关设置,最 ...
- properties配置文件的基本操作
对properties的基本操作 public class PropertiesUtil {// 是否是文件public static boolean isFile = false;// 路径publ ...