首页 > 数据库 >SQL mother查询语句

SQL mother查询语句

时间:2024-03-09 10:14:16浏览次数:28  
标签:语句 name mother id student SQL 查询 class select

题目教程网址:SQL之母

基础查询

select * from student;

select
    xxx, xxxx as name, ddd,
    xxx*2 as double_xxx
from
    a_table
where
    xx>10 or dd!=1 and kk=9;

别名,常量和运算,where,运算符(=,!=,>,<),逻辑运算(and,or,not)。

模糊查询

select something from a_table
where value like '%值%';

模糊查询用likenot like
'%值'匹配开头,'值%'匹配结尾,'%值%'代表包含'值'

空值

select something from a_table
where value is not null;

空值用null,和Python类似。

去重

select distinct A, B, C from a_table;

去重就是select distinct这样固定搭配,会按照后面的字段组合进行去重。

排序

select something from a_table
order by value desc, another_value asc;

排序根据给定的字段顺序进行排序,默认asc是升序,desc是降序。

截断和偏移

select something from a_table
order by value desc, another_value asc
limit 0, 3;

limit m, n从第m个开始取,取n个结果(索引从0开始)。
limit n 从第0个开始取,取n个结果(索引从0开始)。

条件分支

SELECT
  name,
  CASE
    WHEN (age > 60) THEN '老同学'
    WHEN (age > 20) THEN '年轻'
    ELSE '小同学'
  END AS age_level
FROM
  student;

case ... end,里面把when当if那样用,thenelse决定值是多少。
整个是决定一个字段的值。

函数

函数名 功能
date() 返回此刻日期
time() 返回当前时间
datetime() 返回date+time的组合
upper(field) 将指定列大写
lower(field) 将指定列小写
length(field) 求字符长度
max(field) 求该列最大值
min(field) 求该列最小值
sum(field) 求和
avg(field) 求平均
count(...) 计算指定列的行数或非空值的数量。

分组聚合

SELECT
  class_id,
  exam_num,
  COUNT(*) AS total_num
FROM
  student
GROUP BY
  class_id,
  exam_num;

SELECT
  class_id,
  SUM(score) AS total_score
FROM
  student
GROUP BY
  class_id
HAVING
  SUM(score) > 150;

根据group by后面的组合进行分组,整个语句的查询就是在每一个组里面单独运行。
having是类似于where的筛选,但WHERE子句用于在分组之前进行过滤,而HAVING子句用于在分组之后进行过滤。

关联查询

-- cross join
select
  s.name student_name,
  s.age student_age,
  s.class_id class_id,
  c.name class_name
from
  student s,
  class c;

-- inner join
select
  s.name student_name,
  s.age student_age,
  s.class_id class_id,
  c.name class_name,
  c.level class_level
from
  student s
  join class c on s.class_id = c.id;

-- outer join
select
  s.name student_name,
  s.age student_age,
  s.class_id class_id,
  c.name class_name,
  c.level class_level
from
  student s
  left join class c on s.class_id = c.id;

将两个表组合在一起输出(table.field用于定位具体列,用别名简化代码)
cross join简单粗暴。
inner join用on来指定两个表的交集,只输出交集部分。
outer join加了个left,将完整输出主表的数据,即使不在交集中。(from后是主表,join后是关联表,不关联的部分值为null)

子查询

select
  name,
  score,
  class_id
from
  student
where
  class_id in (
    select distinct
      id
    from
      class
  );

-- 主查询
SELECT name, total_amount
FROM customers
WHERE EXISTS (
    -- 子查询
    SELECT 1
    FROM orders
    WHERE orders.customer_id = customers.customer_id
);

现在子查询中查出一个表,再根据这个表查询
in,not in,exist, not exist

组合查询

-- UNION ALL操作
SELECT name, age, department
FROM table1
UNION ALL
SELECT name, age, department
FROM table2;

UNION 操作:它用于将两个或多个查询的结果集合并, 并去除重复的行 。即如果两个查询的结果有相同的行,则只保留一行。
UNION ALL 操作:它也用于将两个或多个查询的结果集合并, 但不去除重复的行 。即如果两个查询的结果有相同的行,则全部保留。

开窗函数

SELECT 
    order_id, 
    customer_id, 
    order_date, 
    total_amount,
    SUM(total_amount) OVER (PARTITION BY customer_id ORDER BY order_date ASC) AS cumulative_total_amount
FROM
    orders;

over聚焦到分组,它允许我们在查询中进行对分组数据进行计算、 同时保留原始行的详细信息 。即仅在这个地方用分组,但不影响全局。
partition by进行分组,order by进行排序,排序后它应该是只取该组该条record前面顺序的。

SELECT 
    order_id, 
    customer_id, 
    order_date, 
    total_amount,
    RANK() OVER (PARTITION BY customer_id ORDER BY total_amount DESC) AS customer_rank
FROM
    orders;

rank() over 分组排名,相同的值将被赋予相同的排名,当存在并列(相同排序值)时,Rank 会跳过后续排名,并保留相同的排名。

SELECT 
    order_id, 
    customer_id, 
    order_date, 
    total_amount,
    ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY total_amount DESC) AS row_number
FROM
    orders;

Row_Number 开窗函数是 SQL 中的一种用于为查询结果集中的每一行 分配唯一连续排名 的开窗函数。

SELECT 
    student_id,
    exam_date,
    score,
    LAG(score, 1, NULL) OVER (PARTITION BY student_id ORDER BY exam_date) AS previous_score,
    LEAD(score, 1, NULL) OVER (PARTITION BY student_id ORDER BY exam_date) AS next_score
FROM
    scores;

Lag 函数用于获取 当前行之前 的某一列的值。它可以帮助我们查看上一行的数据。
Lead 函数用于获取 当前行之后 的某一列的值。它可以帮助我们查看下一行的数据。

LAG(column_name, offset, default_value)。
column_name:要获取值的列名。
offset:表示要向上偏移的行数。例如,offset为1表示获取上一行的值,offset为2表示获取上两行的值,以此类推。
default_value:可选参数,用于指定当没有前一行时的默认值。
PARTITION BYORDER BY子句可选,用于分组和排序数据。

标签:语句,name,mother,id,student,SQL,查询,class,select
From: https://www.cnblogs.com/faf4r/p/18062290

相关文章

  • MYSQl学习笔记19: 外键约束
    外键约束用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性具有外键的表(emp)称为子表外键关联的表(dept)称为父表外键约束创建表时添加createtable表名(字段名数据类型,[constrain][外键名称]foreignkey(外键字段名)references主表(主表......
  • MYSQL学习笔记20: 外键约束(删除/更新行为)
    外键约束删除/更新行为setdefault在mysql的默认引擎innodb中不支持CASCADEaltertable表名addconstraint外键名称foreignkey(外键字段)references主表名(主表字段名)onupdatecascadeondeletecascade;建立外键约束#如果父表和子表建立外键的字段有不同的......
  • MYSQL学习笔记17: 流程控制函数(IF, CASE)
    流程控制函数(IF,CASE)ifselectif(true,'ok','error');selectif(false,'ok','error');/*相当于iftrue:ok;else:error;*/ifnullselectifnull('ok','default');selectifnull(......
  • MYSQL学习笔记18: 约束
    约束约束是作用于表中字段上的规则,用于限制存储在表中的数据.保证表中的正确性,有效性和完整性约束作用于表中字段上,可以在建表和修改表时为表添加约束按照需求创建表,并创建约束createtableusers(idintprimarykeyauto_incrementcomment'主键',n......
  • MYSQL学习笔记15: 数值函数
    数值函数ceil向上取整(并不是四舍五入)selectceil(1.5);selectceil(2.1);floor向下取整selectfloor(3.9);selectfloor(2.0);mod取模(余数)selectmod(7,4);rand0-1的随机小数,不包括0和1selectrand();round四舍五入#参数2:保留的......
  • MYSQL学习笔记16: 日期函数
    日期函数返回当前日期selectcurdate();返回当前时间(24小时制)selectcurtime();返回当前日期+时间selectnow();YEAR,MONTH,DAY获取当前时间对应的年月日selectyear(now());selectmonth(now());selectday(now());在制定日期上增加时间后的日期......
  • MYSQL学习笔记9: DQL排序查询(升降序)
    DQL排序查询select字段列表from表名orderby字段1排序方式1,字段2排序方式2;排序方式ASC升序(默认)DESC降序如果是多字段排序,第一个字段值相同,会根据第二个字段的值进行排序,以此类推按年龄降序排序select*fromworkersorderbyagedesc;......
  • MYSQL学习笔记10: DQL分页查询(利用limit)
    DQL分页查询(利用limit)select字段列表from表名limit起始索引,查询记录数;起始索引从0开始,起始索引=(查询页码-1)*每页显示记录数分页查询是数据库的方言,不同数据库有不同的实现,MYSQL中是LIMIT如果查询的是第一页的数据,起始索引可以省略,直接简写为l......
  • MYSQL练习1: DQL查询练习
    MYSQL练习1DQL查询练习查询年龄为20,21,22,23岁的员工信息select*fromworkerswhereagein(20,21,22,23);查询性别为男,年龄在20-40岁间,姓名长度为3的员工select*fromworkers    where    gender='男'    and    agebetwe......
  • MYSQL学习笔记12: DCL数据控制语言(用户操作)
    DCL数据控制语言查询用户#用户信息保存在数据库mysql的user表中usemysql;select*fromuser;创建用户createuser'用户名'@'主机名'identifiedby'密码';在主机localhost创建一个新用户createuser'hikari39'@'localhost'identifiedby'123456......