返回列值,去除重复值
SELECT DISTINCT 列名称 FROM 表名称
根据字段由小到大排序(系统默认由小到大),
select name,job,sal from table_name where name = ‘张三’ order by sal;
手动指定按字段由小到大排序(升序关键字 asc)(降序关键字desc)
select name,job,sal from table_name where name = ‘张三’ order by sal desc;
返回部分条数据
SELECT * FROM table LIMIT start_index,num_Line; // 表示从start_index开始 num_Line行数据
SELECT * FROM table LIMIT 0,-1; // 检索记录行 0-last.全部数据
SELECT * FROM table LIMIT 5; //检索前 5 个记录行
将表中按钱顺序排名。
注意:MySQL有rank关键字,建议将rank替换为`rank` 。不是单引号 是键盘1左边的符号。
rank():返回的相关等级会跳跃;
dense_rank():返回的相关等级不会跳跃;
row_number():返回的是行信息,没有排名;
select employee_name,
money,
rank() over(order by money) `rank`,
dense_rank() over(order by money) dense_rank,
row_number() over(order by money) row_number
from salary;
将数据按照 group by 后面的字段分组,只返回每组的一条统计信息。即将字段值重复的行合并为一行
https://blog.csdn.net/qq403580298/article/details/90756352
每一个班级里面最高分数的同学是谁。
select name, class , max(score) from test_group group by class;
partition by关键字是分析性函数的一部分,它和聚合函数(如group by)不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录,
partition by用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组。
partition by 与group by不同之处在于前者返回的是分组里的每一条数据,并且可以对分组数据进行排序操作。后者只能返回聚合之后的组的数据统计值的记录。
(1)把每个人学生的成绩按照升序排名 (思路:根据学生姓名分组 根据每个人成绩排序)
select *,ROW_NUMBER() over( partition by Name order by Score ) 排名 from UserGrade;
(2)把每个学科的成绩分别进行排名 (思路:根据学科分组 根据成绩排序)
select *,ROW_NUMBER() over( partition by Course order by Score ) 排名 from UserGrade;
having字句可以让我们筛选成组后的各种数据,where字句在聚合前先筛选记录。
having与where的区别:
having是在分组后对数据进行过滤
where是在分组前对数据进行过滤
having后面可以使用聚合函数
where后面不可以使用聚合
在查询过程中执行顺序:from>where>group(含聚合)>having>order>select。
显示每个地区的总人口数和总面积.
select region, sum(population), sum(area) from bbc group by region;
显示每个地区的总人口数和总面积.仅显示那些面积超过1000000的地区。
select region, sum(population), sum(area)
from bbc
group by region
having sum(area)>1000000;
不能用where来筛选超过1000000的地区,因为表中不存在这样一条记录。
in常用于where表达式中,其作用是查询某个范围内的数据。not in与in作用相反
select * from where field in (value1,value2,value3,…)
查询book表中id为2和4的所有数据:
select * from where id in (2,4)
on:作用是作为生成临时表的条件 。
where:临时表生成后,作为筛选。
on是生成临时表时使用的条件,上面我们采用的是左外连接,左外连接是以左表为基础的,左表的记录将会全部表示出来,而右表只会显示符合搜索条件的记录。也就是说emp是左表,dept是右表,条件是emp的deptno与dept中的deptno相等且为40时才连接,但emp表中不存在deptno为40的记录,也就是右表没有符合条件的记录,而记录不足的地方均用NULL来补充。
而where是在临时表生成好后,再对临时表进行过滤。也就是说emp表与dept的连接条件只是emp的deptno与dept中的deptno相等,然后在对生成的临时表进行筛选,由于emp表中不存在deptno为40的记录,所以未找到符合条件的记录。
由于内连接是从结果表中删除与其他被连接表中没有匹配行的所有行,所有在内连接时on和where的结果是相同的。而左外、右外与全连接由于它的特殊性,on和where造成的差别大小取决于表达式和表中的数据。
DATEDIFF() 函数返回两个日期之间的天数。
SELECT DATEDIFF('2008-12-30','2008-12-29') AS DiffDate
DiffDate |
---|
1 |
SELECT DATEDIFF('2008-12-29','2008-12-30') AS DiffDate
DiffDate |
---|
-1 |
1. in()适合B表比A表数据小的情况
2. exists()适合B表比A表数据大的情况
当A表数据与B表数据一样大时,in与exists效率差不多,可任选一个使用.
select * from A where id in(select id from B)
select a.* from A a where exists(select 1 from B b where a.id=b.id)
https://blog.csdn.net/weichi7549/article/details/108181623
float:浮点型,含字节数为4,32bit,数值范围为-3.4E38~3.4E38(7个有效位)
double:双精度实型,含字节数为8,64bit数值范围-1.7E308~1.7E308(15个有效位)
decimal:数字型,128bit,不存在精度损失,常用于银行帐目计算。(28个有效位)
decimal(a,b)
a指定指定小数点左边和右边可以存储的十进制数字的最大个数,最大精度38。 b指定小数点右边可以存储的十进制数字的最大个数。小数位数必须是从0 到 a之间的值。默认小数位数是 0。
score decimal(5,2) -- 取值范围是 -999.99 到 999.99
UNION用于合并两个或多个select语句的结果集,多个select内部必须有相同数量的列,数据类型相似,列顺序相同。
select name from table1
union
select name from table2
union会把重复的值过滤掉,union all会把重复的值显示出来。