数据库查询,关于聚合函数 max()的用法。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库查询,关于聚合函数 max()的用法。相关的知识,希望对你有一定的参考价值。

我这样写对么?
select ename,sal from emp where sal>=max(sal);

select ename,max(sal)from emp group by empno having sal=max(sal)'

哪个是正确的,或者能够提供下正确答案就好了。

    MAX()/MIN()是指SQL中的最大/最小值函数 

    因为聚合函数处理的是数据组,在本例中,MAX函数将整个TEACHER表看成一组

    而TNAME、DNAME和TSEX的数据都没有进行任何分组,因此SELECT语句没有逻辑意义

    MAX()和MIN()函数不仅可以作用于数值型数据,也可以作用于字符串或是日期时间数据类型的数据。

    SQL 如下:

    实例MAX()函数用于字符型数据

    如下面代码:

    SELECT MAX (a) AS MAXNAME

    FROM     A

参考技术A 最大的。排序一下,取第一个值,不就出来了?

SELECT * FROM emp WHERE ROWNJUM = 1 ORDER BY sal DESC本回答被提问者采纳
参考技术B 错的 聚集函数只能用于select和group by中的having子句 参考技术C 返回表达式中的最大值项 参考技术D 自己放到数据库中测试一下呗。你想查询出什么结果/?追问

比如找出当前部门中拿到薪水最高的雇员。

追答

select ename from emp where sal=max(sal);

追问

Query : select ename from emp where sal=max(sal)
Error Code : 1111
Invalid use of group function
Execution Time : 00:00:00:000
Transfer Time : 00:00:00:000
Total Time : 00:00:00:000

对不住,编辑器报这种错误,希望能够给出正确答案。。。

Django 06

注意

  • 只要和数据库相关的功能, 基本在 django.db.models 里面

聚合查询

  • 关键字: aggregate
  • 用法 : aggregate(变量名=聚合函数(‘字段名‘)
  • 返回的是一个字典, 字典的键就是上面的变量名
# 1.求书籍的最高价格
res = models.Book.objects.aggregate(max=Max('price'))
print(res)  # {'max': Decimal('118.88')}

# 2.求书籍总价格
res = models.Book.objects.aggregate(sum=Sum('price'))
print(res)  # {'sum': Decimal('323.31')}

# 3.求书籍的平均价格
res = models.Book.objects.aggregate(avg=Avg('price'))
print(res)  # {'avg': 107.77}

分组查询

  • 通常和聚合函数搭配使用
  • 关键字: annotate(变量名=聚合函数()).values(‘变量名‘)
# 1.统计每一本书的作者个数(正向)
res = models.Book.objects.annotate(author_num=Count('authors__id')).values('title', 'author_num')
print(res)

# 2.每个出版社最便宜书的价格(反向)
res = models.Publish.objects.annotate(min_price=Min('book__price')).values('name', 'min_price')
print(res)

F与Q查询

  • F() 方法可以直接拿到字段对应的值
# 先导入
from django.db.models import F, Q


# F()方法可以直接拿到某个字段对应的值

# 1.查询库存大于卖出的书籍
res = models.Book.objects.filter(stock_quantity__gt=F('sold_quantity')).values('title')
print(res)

# 2.将所有书的价格上涨10元
models.Book.objects.all().update(price=F('price') + 10)

# 3.将所有的书名后面加上 '新款', 字符串操作需要借助Concat方法
from django.db.models.functions import Concat
from django.db.models import Value
models.Book.objects.all().update(title=Concat(F('title'), Value('新款')))
  • filter()方法内多个条件用逗号隔开表示的and关系, 我们可以借助Q()方法来实现or和not关系
  • or : |
  • not: ~
  • Q() 的高级方法: 实例化对象, 利用对象来绑定查询条件, 支持字符串条件查询
# Q()的基本用法
# 1.查询书籍名称是三国演义或者库存大于500
res = models.Book.objects.filter(Q(title='三国演义') | Q(stock_quantity__gt=500))
print(res)

# 2.查询书籍名称不是三国演义的
res = models.Book.objects.filter(~Q(title='三国演义'))
print(res)


# Q()的高级用法
q = Q()
q.connector = 'or'  # 默认是and
q.children.append(('title', '三国演义'))
q.children.append(('stock_quantity__gt', '500'))
res = models.Book.objects.filter(q)
print(res)

orm字段和参数

  • 常用字段
字段类型 参数 描述
AutoFiled primary_key=True 必填参数 用来主键字段
CharField max_length 必填参数 相当与MySQL中的varchar()
IntegerField int32, 不能用来存手机号码, 位数不够, 可以用字符串存
DataTimeField / DataField auto_now=True 每次更新数据记录时auto_now_add=True 创建数据记录时 年月日时分秒/年月日
BigIntegerField int64
EmailField varchar(254)
DecimalField max_digits , decimal_places 必填参数 小数
BooleanField 布尔值
TextField 大段文本
FileField upload_to = " " 上传文件的保存路径 storage = None 存储组件,默认django.core.files.storage.FileSystemStorage 文件路径
  • 通用参数
参数 效果
null=True 可以为空
unique=True 字段必须是唯一的 (并设置索引)
db_index=True 设置索引
dufault 设置默认值

自定义字段类型

  • 查看django字段类型的源码, 发现都是一个个类, 并且都继承 Field

  • 我们在 models.py 中创建自定义类, 继承 models.Field

# 自定义char类型字段
class MyCharField(models.Field):
    def __init__(self, max_length, *args, **kwargs):
        self.max_length = max_length
        
        # 调用父类的__init__方法, 将参数按关键字参数传入
        super().__init__(max_length=max_length, *args, **kwargs)

    # 返回MySQL字段类型
    def db_type(self, connection):
        return f'char({self.max_length})'  # char(max_length)

事务

  • 事务是由sql语句组成的逻辑单元, 是一整体概念

ACID

  • 原子性: 事务是最小执行单元, 不能再分了
  • 一致性: 事务开始前和结束后数据库的数据整体上是一致的
  • 隔离性: 多个事务之间有可以做到相互不影响
  • 持久性: 事务的结果对数据库的影响是永久的

三大范式

  • 每个字段都是不可再拆分的
  • 要求表中要有主键,表中其他其他字段都依赖于主键,因此第二范式只要记住主键约束就好了
  • 要求表中不能有其他表中存在的、存储相同信息的字段,通常实现是在通过外键去建立关联,因此第三范式只要记住外键约束就好了。

开启事务

from django.db.import transaction

with transaction.atomic():
    # 在该缩进内书写数据库操作代码
    # 缩进内的所有代码, 都属于一个事务
    pass

以上是关于数据库查询,关于聚合函数 max()的用法。的主要内容,如果未能解决你的问题,请参考以下文章

关于Sql中的聚合函数的问题

MySQL数据库基本用法-聚合-分组

MySQL数据操作与查询(第六章 上)

mysql group by 的用法解析

Django 06

我要用oracle根据我截取到的年龄分组,查询显示其它字段,但是不用max(),sum()等聚合函数