SQL查询语句

这篇具有很好参考价值的文章主要介绍了SQL查询语句。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

DQL语句--排序查询

# 格式: select * from 表名 order by 要排序的列1 [asc/desc], 要排序的列2 [asc/desc];
# 解释:
#   1. 无论SQL语句简单或者是复杂, order by语句一般都放最后, 注意: 如果有limit(分页), 则它(limit)在最后.
#   2. asc表示升序, desc表示降序, 其中, 默认是升序, 所以asc可以省略不写.
#   3. 如果排序的字段有多个, 则优先按照第1个字段规则排序, 第1个字段值一样才会按照第2个排序字段规则走, 第2个数据也一样......

例:

# 1. 切库.
use day02;
# 2. 查看表数据.
select * from product;

# 需求1: 按照 商品价格进行排序.   注意: 如果没说升序还是降序, 一般默认都是升序.
select * from product order by price;       # 默认升序
select * from product order by price asc;   # 默认就是升序, asc表示升序, 所以它可以省略不写.
select * from product order by price desc;  # desc表示降序, 这个是必须写的.

# 需求2: 按照价格进行降序排序, 价格一样, 按照pid降序排列.
select * from product order by price desc, pid desc;     # 价格降序, 价格一样, pid降序.
select * from product order by price desc, pid;          # 价格降序, 价格一样, pid升序.

DQL语句--聚合函数

聚合函数主要是操作某列值的, 对该列的值做聚合操作, 例如: 求最大值, 最小值, 平均值, 累加和, 次数等.

  • 聚合函数有

    • sum() 求和

    • max() 求最大值

    • min() 求最小值

    • avg() 求平均值

    • count() 计数

  • 例:

  • # 聚合操作主要是对某列值做处理的, 常用的有: sum(), max(), min(), avg(), count()
    # 1. 查询表数据.
    select * from product;
    
    # 2. 需求: 求 商品价格的 总和.
    select sum(price) as sum_price from product;
    
    # 3. 需求: 求 商品价格的 最大值.
    select max(price) as max_price from product;
    
    # 4. 需求: 求 商品价格的 最小值.
    select min(price) as min_price from product;
    
    # 5. 需求: 求 商品价格的 平均值.
    # 扩展: round(小数, 要保留的位数) 可以实现四舍五入, 保留n位小数.
    select avg(price) as avg_price from product;
    
    # avg(price) 求商品价格的平均值
    # round()    四舍五入, 保留n位小数.
    select round(avg(price), 3) as avg_price from product;
    
    # 6. 需求: 求表数据的总条数.
    select count(*) as total_cnt from product;   # *代表整行 13条
    
    # 7. 扩展1, 可以在1个SQL语句中, 计算多项值.
    select
           sum(price) as sum_price,
           round(avg(price), 3) as avg_price,
           max(price) as max_price,
           min(price) as min_price,
           count(*) as total_cnt
    from product;
    
    # 8. 扩展2, 关于count的面试题. 即: count(1), count(列), count(*)的区别是什么?
    select * from product;
    
    # 区别1: null值问题. count(1), count(*) 在统计的时候, 不会忽略null值,  而count(列)只统计该列的 非 null值.
    # 区别2: 效率问题, 效率从高到低分别是: count(主键) > count(1) > count(*) > count(普通列)
    select count(1) from product;               # 结果: 13条, 统计所有行, 不会忽略null值, 直接扫描行号, 不一定非得写数字1, 其它数字也行.
    select count(*) from product;               # 结果: 13条, 统计所有行, 不会忽略null值, * 是扫描该行所有的数据
    select count(category_id) from product;     # 结果: 12条, 只统计该列的数据总条数, 会忽略null值.
    
    # 扩展, 对数据进行去重查询.   distinct
    # 按照 price的值 进行去去重.
    select distinct price from product;
    
    # 按照 price的值 和 category_id的值 作为1个整体来去重的, 即: 800, 'c002' 和 800, 'c003' 不是同一条数据.
    select distinct price, category_id from product;

DQL语句--分组查询

分组查询就是将查询结果按照指定字段进行分组,字段中数据相等的分为一组

格式:

select 分组字段1, 分组字段2, 聚合函数 from 表名 where 组前筛选 group by 分组字段1, 字段2... having 组后筛选;

细节:

  1. 查询列中不能出现非分组字段, 除了聚合函数.

  2. 分组前的筛选可以通过where实现, 分组后的筛选可以通过having实现.

  3. 分组查询一般都要结合 聚合函数 一起使用, 才有意义.

例:

# 格式: select 分组字段1, 分组字段2, 聚合函数 from 表名 where 组前筛选 group by 分组字段1, 字段2...  having 组后筛选;
# 解释: 分组查询就是将查询结果按照指定字段进行分组,字段中数据相等的分为一组.
# 细节:
#   1. 查询列中不能出现非分组字段, 除了聚合函数, 即分组后, 查询列中只能出现, 分组字段, 聚合函数.
#   2. 分组前的筛选可以通过where实现, 分组后的筛选可以通过having实现.
#   3. 分组查询一般都要结合 聚合函数 一起使用, 才有意义.

# 1. 查询表数据.
select * from product;

# 2. 需求: 按照 商品类别分组, 统计每组商品的总价格.
select category_id, sum(price) total_price from product group by category_id;

# 3. 需求: 将所有商品按组分类,获取每组的平均价格大于600的所有分组
select category_id, round(avg(price), 2) avg_price from product  group by category_id having avg_price > 600;

# 4. 需求: 统计各个分类商品的个数,且只显示个数大于1的信息
select category_id, count(1) total_cnt from product group by category_id having total_cnt > 1;
# 上述的代码, 还可以变形为如下的写法, 效果相同.
select category_id, count(1) from product group by category_id having count(1) > 1;

# 面试题: having 和 where的区别是什么?
# where: 组前筛选, 后边不能跟聚合函数.
# having: 组后筛选, 后边可以跟聚合函数.

# 扩展: with rollup, 在所有记录的最后加上一条记录,显示select查询时聚合函数的统计和计算结果
# 求每组的, 商品平均价格.
select category_id, round(avg(price), 2) avg_price from product  group by category_id with rollup ;

# 求每组的, 商品总价格.
select category_id, sum(price) total_price from product  group by category_id with rollup ;

DQL语句--分页查询

所谓的分页查询指的是: 一次性从数据表中获取指定条数的数据, 即为: 分页查询.

假设:

商品表一共100条数据, 每页显示10条,

此时, 用户看第1页, 只要查1~10条数据即可,

用户看第2页, 只要查11~20即可, 以此类推,

一方面可以提供用户体验, 另一方面也可以减小服务器 和 浏览器的压力.

 

# 格式: select * from 表名 limit 起始索引, 每页的数据条数;
# 解释:
#   1. 数据表中每条数据都是有索引(也叫编号, 脚标, 下标, index)的, 且索引默认从0开始.
#   2. 要想把分页搞明白, 要搞懂4个值, 分别是: 每页的数据条数, 每页的起始索引, 数据总条数, 总页数.
#   3. 每页的数据条数:  产品经理, 项目经理定.
#   4. 数据总条数:     count(1), count(*)
#   5. 每页的起始索引:  (当前页数 - 1) * 每页的数据条数
#   6. 总页数:         (总数据条数 + 每页的数据条数 - 1) / 每页的数据条数    取整.

例:

# 1. 查询表数据.
select * from product;

# 2. 每页3条, 查询第1页
select * from product limit 0, 3;

# 3. 上述需求的简化写法, 如果起始索引是0, 则可以省略不写.
select * from product limit 3;

# 4. 每页3条, 求第3页.        起始索引公式:  (当前页数 - 1 ) * 每页的数据条数 = (3 - 1) * 3 = 6
select * from product limit 6, 3;

# 5. 每页5条, 求第3页.
select * from product limit 10, 5;

# 总结, 一个完整的单表查询SQL语句格式为
# select [distinct] 列1, 列2 as 别名 from 表 where 组前筛选 group by 分组字段 having 组后筛选 order by 排序 [asc/desc] limit 起始索引, 每页的数据条数;

扩展--枚举类型

枚举指的是一些固定的值, 将来往列中填充数据的时候, 必须传入这些指定的值, 否则报错, 一般用于 某些自定义的规则.

# 枚举指的是一些固定的值, 将来往列中填充数据的时候, 必须传入这些指定的值, 否则报错, 一般用于 某些自定义的规则.

例:

# 1. 建表, 老师表, id, 姓名, 性别
drop table teacher;
create table teacher(
    id int primary key auto_increment,      # id, 主键, 自增
    name varchar(20),
    gender enum('男', '女')           # 全称单词, enumeration
);

# 2. 往表中添加元素.
insert into teacher value(null, '张三', 'male'), (null, '李四', 'female');      # 报错, 必须传入枚举值.
insert into teacher value(null, '张三', '男'), (null, '李四', '女');             # 这样写是OK的, 因为传入的是枚举值.

# 3. 查询表数据.
select * from teacher;

约束--外键约束

  • 概述

    • 它属于约束的一种, 主要应用于多表的情况, 有外键(从键)的表被称之为: 外表(从表)

    • 主键所在的表被称之为: 主表.

    • 回顾, 数据类型和约束的作用: 保证数据的完整性和安全性.

  • 格式

    • 方式1: 在创建表的时候直接指定约束.

      constraint 外键约束名 foreign key(外键列) references 主表名(主键列)

    • 方式2: 在建表后, 添加指定的约束.

      alter table 外表名 add constraint 外键约束名 foreign key(外键列) references 主表名(主键列);

  • 特点(记忆)

    外表的外键列 不能出现 主表的主键列, 没有的数据.

  • 示例代码

  • # 关于主外键约束, 需要你记忆的内容:
    #   1. 无论是数据类型还是约束, 都是用于保证 数据的安全性和完整性的.
    #   2. 有外键列的表被称之为: 外表(从表), 有主键列的表被称之为: 主表.
    #   3. 外键约束特点: 外表的外键列 不能出现 主表的主键列没有的数据.
    #   4. 设置主外键约束, 是在 外表中添加的.
    
    # 1. 创建day03数据库.
    create database day03;
    # 2. 切库.
    use day03;
    show tables;
    
    # ---------------------------------------------------- 以下是 外键约束详解 ----------------------------------------------------
    # 案例: 部门表 department(id, name), 员工表(employee, id, name, salary, did),  一个部门有多个员工, 但是1个员工只能属于1个部门.
    # 3. 建表.
    # 3.1 创建部门表
    drop table dept;
    create table dept(
        id int primary key auto_increment,      # 部门id
        name varchar(20)                        # 部门名称
    );
    
    # 3.2 创建员工表
    drop table emp;
    create table emp(
        id int primary key auto_increment,      # 员工id
        name varchar(20),                       # 员工姓名
        salary double,                          # 员工工资
        did int                                # 员工所属的部门id
        #        外键约束名           外键列          主表名(主键列)
        # constraint fk01 foreign key (did) references dept(id)       # 添加外键约束的方式1: 建表时添加约束.
    );
    
    # 4. 添加表数据.
    # 4.1 添加数据到主表(部门表)
    insert into dept value (null, '人事部'), (null, '财务部'), (null, '研发部');
    
    # 4.2 添加数据到外表(员工表)
    insert into emp value(null, '乔峰', 1000, 2);     # 可以, 因为 部门id=2的数据, 在主表(部门表)中 有.
    insert into emp value(null, '虚竹', 3333, 6);     # 报错, 因为 部门id=6的数据, 在主表(部门表)中 没有, 保证数据的 安全性.
    
    # 5. 查看表数据.
    # 5.1 查询 主表 数据(部门表)
    select * from dept;
    # 5.2 查询 外表 数据(员工表)
    select * from emp;
    delete from emp where id = 2;
    
    
    # 6. 查看是否成功添加好 外键约束.
    desc dept;      # 主表, 部门表
    
    desc emp;       # 外表, 员工表.
    
    # 7. 查看外键约束是否生效.
    select @@foreign_key_checks;
    
    # 8. 查看SQL表被哪种执行引擎执行.
    show create table dept;
    show create table emp;
    
    # 9. 这个语句能执行成功吗?
    delete from dept where id = 3;  # 可以, 因为财务部"没员工"
    delete from dept where id = 2;  # 不能, 因为从表有数据在用它, 保证数据的 完整性.
    
    # 10. 扩展-外键约束的创建方式2: 建表后添加外键约束.
    alter table emp add constraint fk02 foreign key (did) references dept(id);  # 细节: 数据合法添加成功, 数据不合法添加失败.
    
    # 11. 扩展--删除外键约束.
    alter table emp drop foreign key fk02;      # 根据外键约束名, 删除指定的外键.
    

多表查询--交叉查询

准备数据源

# 总结: 多表查询的本质就是通过关联条件, 把多张表的数据, 整合到一张表中.

# 1. 切库.
use day03;
show tables;

# 2. 准备多表查询所需要的数据.
# 创建hero表
CREATE TABLE hero
(
    hid       INT PRIMARY KEY,
    hname     VARCHAR(255),
    kongfu_id INT
);

# 创建kongfu表
CREATE TABLE kongfu
(
    kid   INT PRIMARY KEY,
    kname VARCHAR(255)
);

# 插入hero数据
INSERT INTO
    hero
VALUES
    (1, '鸠摩智', 9),
    (3, '乔峰', 1),
    (4, '虚竹', 4),
    (5, '段誉', 12);

# 插入kongfu数据
INSERT INTO
    kongfu
VALUES
    (1, '降龙十八掌'),
    (2, '乾坤大挪移'),
    (3, '猴子偷桃'),
    (4, '天山折梅手');

# 3. 查询表数据
select * from hero;

select * from kongfu;

具体的交叉查询

# 格式:      select * from 表A, 表B;
# 查询结果:   两张表的笛卡尔积, 即: 表A的总条数 * 表B的总条数, 这样会产生大量的脏数据, 所以这种方式不用.
select * from hero, kongfu;

多表查询--连接查询

内连接

例:

# 查询结果: 无论是显式内连接还是隐式内连接, 查询结果都是一样的, 都是表的: 交集.

# 方式1: 显式内连接.
# 格式: select * from 表A inner join 表B on 关联条件;           # 细节: inner可以省略不写
select * from hero h inner join kongfu kf on h.kongfu_id = kf.kid;
select * from hero h join kongfu kf on h.kongfu_id = kf.kid;    # 细节: inner可以省略不写

# 方式2: 隐式内连接.
# 格式:  select * from 表A, 表B where 条件;
select * from hero h, kongfu kf where h.kongfu_id = kf.kid;

外连接

例:文章来源地址https://www.toymoban.com/news/detail-452299.html

# 写法1: 左外连接
# 格式: select * from 表A left outer join 表B on 条件;
# 查询结果: 左表的全集 + 表的交集
select * from hero h left outer join kongfu kf on h.kongfu_id = kf.kid;
# outer可以省略
select * from hero h left join kongfu kf on h.kongfu_id = kf.kid;

# 写法2: 右外连接
# 格式: select * from 表A right outer join 表B on 条件;
# 查询结果: 右表的全集 + 表的交集
select * from hero h right join kongfu kf on h.kongfu_id = kf.kid;

# 这样的话, 效果等价于上边的 左外链接.
select * from kongfu kf right join  hero h on h.kongfu_id = kf.kid;

# 小细节: 左外连接 和 右外连接掌握1个就够了, 推荐掌握左外链接, 因为给表的顺序换一下, 结果一样.

到了这里,关于SQL查询语句的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据备份文件生成--根据表名生成对应的sql语句文件

    最近客户有个需求,希望在后台增加手动备份功能,将数据导出下载保存。 当然,此方法不适用于海量数据的备份,这只适用于少量数据的sql备份。 这是我生成的sql文件,以及sql文件里的insert语句,已亲测,可以直接执行: 项目是SSM框架,接下来就展示我的实现代码: 首先

    2024年02月07日
    浏览(40)
  • 【MySQL】——Select查询语句(其二)

    🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL:数据结构_IT闫的博客-CSDN博客 🐠数据结构:​​​​​​数据结构_IT闫的博客-CSDN博客 💎C++:C++_IT闫的博客-CSDN博

    2024年02月08日
    浏览(51)
  • DQL语句(一) -----简单select查询

    select 列名*N from 表名 where 查询条件1 and/or 查询条件2 group by 列 Having 分组条件 Order by 排序 sql在书写时 除了查询条件 外,大小写都可以 select * from user where uname=\\\'zs\\\'; SELECT *FROM USER WHERE UNAME=\\\'zs\\\'; 要是在公司要 看其他员工 sql是大写还是小写 -- 属于sql语句的注释 所有查询条件为字

    2024年02月05日
    浏览(39)
  • 数据库 实验四 select查询语句

    实验四 一、实验目的 (1) 掌握SELECT语句在多表查询中的应用。 (2) 掌握多表连接的几种连接方式及应用。 二、实验要求 1、学生提前准备好实验报告,预习并熟悉实验步骤; 2、遵守实验室纪律,在规定的时间内完成要求的内容; 3、1~2人为1小组,实验过程中独立操作、相互学

    2023年04月20日
    浏览(45)
  • MySQL Select 查询语句详解及高级用法

    MySQL是一个开源的关系型数据库管理系统,支持多种操作语言,其中最基础、最常用的命令之一就是SELECT语句。在本篇文章中,这里将详细介绍MySQL SELECT语句的各个方面,从最基本的查询语句,到更高级的技巧和功能。 SELECT语句用于从表格中检索数据。其基本语法如下: sq

    2024年02月08日
    浏览(46)
  • (SQL学习随笔3)SQL语法——SELECT语句

    FROM LIMIT与OFFSET ORDER BY 单值比较 = 等于 不等于 、 = 小于、小于等于 、 = 大于、大于等于 多条件组合 范围筛选 空值匹配 LIKE通配 主要有两种通配符—— \\\'%\\\' 与 \\\'_\\\' ,其中 \\\'%\\\' 代表任意多个字符, \\\'_\\\' 代表单个任意字符 条件分组 数据变换 文本处理 MySQL PostgreSQL 在PostgreS

    2023年04月27日
    浏览(41)
  • [SQL挖掘机] - SELECT语句

    当我们处理数据库时, 经常需要从表中获取特定的数据. 为了实现这个目的, 我们使用一种称为\\\"select\\\"的语句. 简单来说, select语句就像一个过滤器或者选择器, 帮助我们选择 (select) 想要的数据. 通过编写select语句并执行查询操作, 我们可以按照我们的需求从数据库中提取特定的数

    2024年02月15日
    浏览(53)
  • INSERT...SELECT语句对查询的表加锁吗

    insert into t2 select * from t1; 这条语句会对查询表 t1 加锁吗?不要轻易下结论。对GreatSQL的锁进行研究之前,首先要确认一下事务的隔离级别,不同的事务隔离级别,锁的表现是不一样的。 创建测试表t1,t2 创建存储过程,向t1表插入测试数据 查询当前事务隔离级别: connection

    2024年03月09日
    浏览(44)
  • 数据库的基础学习1:select语句的查询

    数据库的三个阶段:人工管理阶段、文件系统阶段、数据库系统阶段 数据库管理系统:DBMS 常见的关系型数据库:Oracle、DB2、mysql 常见的非关系型数据库:MongoDB、redies sql的四部分: DML(update、delete、insert) DDL(create、drop、alter、truncate) DQL(select查询语句) DCL(对数据进行变

    2024年02月08日
    浏览(58)
  • MySQL数据库——MySQL SELECT:数据表查询语句

    在 MySQL 中,可以使用 SELECT 语句来查询数据。查询数据是指从数据库中根据需求,使用不同的查询方式来获取不同的数据,是使用频率最高、最重要的操作。 SELECT 的语法格式如下: 其中,各条子句的含义如下: {*|字段列名} 包含星号通配符的字段列表,表示所要查询字段的

    2024年02月05日
    浏览(80)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包