MySQL【DQL查询数据(最重点)】

2023-11-03

DQL查询数据(最重点)

4.1、DQL(Data Query LANGUAGE:数据查询语言)

  • 所有的查询操作都用它 Select
  • 简单的查询,复杂的查询它都能做
  • 数据库中最核心的语言,最重要的语句
  • 使用频率最高的语句

4.2、指定查询字段

-- 查询全部的学校 select 字段 from 表
SELECT * FROM student;

-- 查询指定字段
SELECT `StudentNo`,`StudentName` FROM student

-- 别名,给结果起一个名字 AS 可以给字段起别名,也可以给表起别名
SELECT `StudentNo` AS 学号, `StudentName` AS 学生姓名 FROM student AS s

-- 函数 Concat(a,b)
SELECT CONCAT('姓名:',StudentName) AS 新名字 FROM student;

语法:select 字段...FROM 表

有的时候,列名字不是那么见名知意,我们起别名 AS 字段名 as 别名 表名 as 别名

去重 distinct

作用:去除select查询出来的结果中重复的数据,只显示一条

-- 查询一下有哪些同学参加了考试,成绩
select * from result --查询全部的考试成绩
select `studentNo` from result --查询有哪些同学参加了考试
select distinct `StudentNo` from result --发现重复数据,去重

数据库的列(表达式)

select version() -- 查看系统版本
select 100*3-1 as 计算结果 -- 用来计算
select @@auto_increment_increment -- 查询自增的步长(变量)

-- 学员考试成绩+1分查看
select `StudentNo`,`StudentResult`+1 AS '提分后' from result

Select 完整的语法

select [all | distinct]
{* | table.* | [table.field1[as alias1][,table.field2[as alias2]][,...]]}
from table_name [as table_alias]

    [left | right | inner join table_name2] --联合查询
    [where ...] --指定结果需满足的条件
    [group by...] --指定结果按照哪几个字段来分组
    [having] --过滤分组的记录必须满足的次要条件
    [order by...] --指定查询记录按照一个或者多个条件排序
    [limit {[offset,]row_count | row_countOFFSET offset}];

    --指定查询的记录从哪条到哪条
注意:[]括号代表可选的,{}括号代表必选的

总结:

数据库中的表达式:文本值,列,Null,函数,计算表达式,系统变量

4.3、where条件子句

作用:检索数据中符合条件的值

搜索的条件由一个或者多个表达式组成,结果都是一个布尔值

逻辑运算符

SELECT studentNo, `studentResult`FROM result
--查询考试成绩在95~100分之间
SELECT studentNo, `studentResult` FROM resultwHERE StudentResu7t>=95 AND studentResult<=100
-- and&&
SELECT studentno, `studentResult` FROMresultwHERE StudentResu7t>=95 && studentResult<=100
-- 模糊查询(区间)
SELECT studentNo, `studentResult` FROM resultwHERE StudentResult BETWEEN 95 AND 100
-- 除了1000号学生之外的同学的成绩
SELECT studentNo,`studentResult` FROM resultwHERE studentNo!=1000;
-- !=not
SELECT studentNo, `studentResu1t`FROM resultwHERE NOT studentNo = 1000

模糊查询:比较运算符

--查询姓刘的同学
-- like结合%(代表0到任意个字符)_(一个字符)
SELECT `studentNo` , `studentName` FROM `student` wHERE StudentName LIKE '刘%'
--查询姓刘的同学,名字后面只有一个字的
SELECT studentNo , `studentName` FROM `student`wHERE StudentName LIKE '刘_'
--查询姓刘的同学,名字后面只有两个字的
SELECT `studentNo` , `studentName` FROM `student`

--查询名字中间有嘉字的同学%嘉%
SELECT `studentNo`, `studentName` FROM studentWHERE studentName LIKE'%嘉%'
--=a=== in(具体的一个或者多个值)=三三==--查询1001,1002,1003号学员
SELECT `studentNo , studentName FROMstudentwHERE studentNo IN (1001,1002,1003);
--查询在北京的学生
SELECT studentNo ` , `studentName` FROM`student wHERE `Address` IN('安徽','河南洛阳');

--查询地址为空的学生nu11 
SELECT  `studentNo` , `studentName`FROM student wHERE address=''oR address IS NULL
--查询有出生日期的同学―不为空
SELECT `studentNo` , `studentName` FROM student wHERE `BornDate` IS NOT NULyI
--查询没有有出生日期的同学为空 
SELECT `studentNo` , `studentName` FROM `student wHERE `BornDate` IS NULL

4.4、联表查询

JOIN 对比

/*
连接查询
   如需要多张数据表的数据进行查询,则可通过连接运算符实现多个查询
内连接 inner join
   查询两个表中的结果集中的交集
外连接 outer join
   左外连接 left join
       (以左表作为基准,右边表来一一匹配,匹配不上的,返回左表的记录,右表以NULL填充)
   右外连接 right join
       (以右表作为基准,左边表来一一匹配,匹配不上的,返回右表的记录,左表以NULL填充)
       
等值连接和非等值连接

自连接
*/

-- 查询参加了考试的同学信息(学号,学生姓名,科目编号,分数)
SELECT * FROM student;
SELECT * FROM result;

/*思路:
(1):分析需求,确定查询的列来源于两个类,student result,连接查询
(2):确定使用哪种连接查询?(内连接)
*/
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno

-- 右连接(也可实现)
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
RIGHT JOIN result r
ON r.studentno = s.studentno

-- 等值连接
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s , result r
WHERE r.studentno = s.studentno

-- 左连接 (查询了所有同学,不考试的也会查出来)
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
LEFT JOIN result r
ON r.studentno = s.studentno

-- 查一下缺考的同学(左连接应用场景)
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
LEFT JOIN result r
ON r.studentno = s.studentno
WHERE StudentResult IS NULL

-- 思考题:查询参加了考试的同学信息(学号,学生姓名,科目名,分数)
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON sub.subjectno = r.subjectno

自连接(了解)

自己的表和自己的表连接,核心:一张表拆分为两张一样的表即可

父类

子类

操作:查询父类对应的子类关系

 

-- 编写SQL语句,将栏目的父子关系呈现出来 (父栏目名称,子栏目名称)
-- 核心思想:把一张表看成两张一模一样的表,然后将这两张表连接查询(自连接)
SELECT a.categoryName AS '父栏目',b.categoryName AS '子栏目'
FROM category AS a,category AS b
WHERE a.`categoryid`=b.`pid`

-- 查询学院所属的年级(学号,学生的姓名,年级名称)
SELECT studentno,studentname,`gradename`
FROM student s
INNER JOIN `grade` g
ON s.`gradeid`=g.`gradeid`

-- 查询科目所属的年级(科目名称,年级名称)
SELECT `subjectname`,`gradename`
FROM `subject` sub
INNER JOIN `grade` g
ON sub.gradeid=g.`gradeid`

-- 查询 数据库结构-1 的所有考试结果(学号 学生姓名 科目名称 成绩)
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON r.subjectno = sub.subjectno
WHERE subjectname='数据库结构-1'

 4.5、分页和排序

/*============== 排序 ================
语法 : ORDER BY
   ORDER BY 语句用于根据指定的列对结果集进行排序。
   ORDER BY 语句默认按照ASC升序对记录进行排序。
   如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。
   
*/

-- 查询 数据库结构-1 的所有考试结果(学号 学生姓名 科目名称 成绩)
-- 按成绩降序排序
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON r.subjectno = sub.subjectno
WHERE subjectname='数据库结构-1'
ORDER BY StudentResult DESC

/*============== 分页 ================
语法 : SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
好处 : (用户体验,网络传输,查询压力)

推导:
   第一页 : limit 0,5
   第二页 : limit 5,5
   第三页 : limit 10,5
   ......
   第N页 : limit (pageNo-1)*pageSzie,pageSzie
   [pageNo:页码,pageSize:单页面显示条数]
   
*/

-- 每页显示5条数据
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON r.subjectno = sub.subjectno
WHERE subjectname='数据库结构-1'
ORDER BY StudentResult DESC , studentno
LIMIT 0,5

-- 查询 JAVA第一学年 课程成绩前10名并且分数大于80的学生信息(学号,姓名,课程名,分数)
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON r.subjectno = sub.subjectno
WHERE subjectname='JAVA第一学年'
ORDER BY StudentResult DESC
LIMIT 0,10

语法:limit(查询起始下标,pageSize)

4.6、子查询

where(这个值是计算出来的)

本质: 在where语句中嵌套一个子查询语句

where(select * from)

/*============== 子查询 ================
什么是子查询?
   在查询语句中的WHERE条件子句中,又嵌套了另一个查询语句
   嵌套查询可由多个子查询组成,求解的方式是由里及外;
   子查询返回的结果一般都是集合,故而建议使用IN关键字;
*/

-- 查询 数据库结构-1 的所有考试结果(学号,科目编号,成绩),并且成绩降序排列
-- 方法一:使用连接查询
SELECT studentno,r.subjectno,StudentResult
FROM result r
INNER JOIN `subject` sub
ON r.`SubjectNo`=sub.`SubjectNo`
WHERE subjectname = '数据库结构-1'
ORDER BY studentresult DESC;

-- 方法二:使用子查询(执行顺序:由里及外)
SELECT studentno,subjectno,StudentResult
FROM result
WHERE subjectno=(
   SELECT subjectno FROM `subject`
   WHERE subjectname = '数据库结构-1'
)
ORDER BY studentresult DESC;

-- 查询课程为 高等数学-2 且分数不小于80分的学生的学号和姓名
-- 方法一:使用连接查询
SELECT s.studentno,studentname
FROM student s
INNER JOIN result r
ON s.`StudentNo` = r.`StudentNo`
INNER JOIN `subject` sub
ON sub.`SubjectNo` = r.`SubjectNo`
WHERE subjectname = '高等数学-2' AND StudentResult>=80

-- 方法二:使用连接查询+子查询
-- 分数不小于80分的学生的学号和姓名
SELECT r.studentno,studentname FROM student s
INNER JOIN result r ON s.`StudentNo`=r.`StudentNo`
WHERE StudentResult>=80

-- 在上面SQL基础上,添加需求:课程为 高等数学-2
SELECT r.studentno,studentname FROM student s
INNER JOIN result r ON s.`StudentNo`=r.`StudentNo`
WHERE StudentResult>=80 AND subjectno=(
   SELECT subjectno FROM `subject`
   WHERE subjectname = '高等数学-2'
)

-- 方法三:使用子查询
-- 分步写简单sql语句,然后将其嵌套起来
SELECT studentno,studentname FROM student WHERE studentno IN(
   SELECT studentno FROM result WHERE StudentResult>=80 AND subjectno=(
       SELECT subjectno FROM `subject` WHERE subjectname = '高等数学-2'
  )
)

摘录遇见狂神说【MySQL】

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL【DQL查询数据(最重点)】 的相关文章

  • 如何在 MySQL 中测试 Select for Update

    我正在表演SELECT FOR UPDATE或 InnoDB 表的行级锁定 我的目的是只有一个请求可以读取同一行 因此 如果两个用户同时请求相同的数据 其中只有一个人获取数据 即第一个触发查询的人 但是我如何测试锁定是否已放置 因为我正在通
  • mysql 中的二进制、十六进制和八进制值

    我对在 mysql 数据库中使用二进制 十六进制和八进制系统非常感兴趣 首先 请给我一个建议 为什么我们在存储信息时需要它们 因为信息太多 或者为什么 另外 哪种类型的值必须存储在标记系统中 另外这里还有像 这是例子 gt SELECT 5
  • 非常大的字段会对 MySQL 数据库产生负面影响吗?

    我目前正在使用 Django 构建一个网站 并希望托管用户生物样式页面 该页面可能长达几 KB 这些字段不一定需要搜索 但在查找用户名时确实需要提供 将这些数据存储在数据库中会产生负面影响吗 如果我使用带有数据库链接的静态文本文件 我的服务
  • 数据库字段中的逗号分隔值

    我有一个产品表 该表中的每一行对应一个产品 并由唯一的 ID 标识 现在 每个产品都可以有多个与该产品关联的 代码 例如 Id Code 0001 IN ON ME OH 0002 ON VI AC ZO 0003 QA PS OO ME
  • PHP MySql 百分比

    我的问题是关于百分比 我不是专家 所以我会尽力以更好的方式进行解释 我的 mysql 服务器中有一个表 假设有 700 条记录 如下所示 Name country language Birth Lucy UK EN 1980 Mari Ca
  • 如何在MYSQL中将整个字符串小写并保持第一个大写[重复]

    这个问题在这里已经有答案了 我的表栏目 我预期的输出会在列中发生变化 Smith Allen Doyle Dennis Baker Waker 这是我尝试过的 但不起作用 UPDATE TABLE employee SET last nam
  • 在 SQL 中,如何从 SELECT * FROM ... 中排除结果?

    我知道我的标题不太具有描述性 让我在这里详细解释一下 假设一个表有 26 个字段 例如字段 a 字段 z 我只想要一个选择查询只返回 15 个字段 所以 通常 我会执行 SELECT field a field b field o FROM
  • 内置函数将每个单词的第一个字母大写

    如果 SQL Server 中已存在此类函数 我不想为此创建自定义函数 输入字符串 This is my string to convert预期输出 This Is My String To Convert SET ANSI NULLS O
  • 如何通过 SQL 表关联 SQL 中的实体

    我是数据库设计的初学者 我需要为项目创建数据库 我可以用面向对象的术语解释我想要做什么 值得庆幸的是 数据库专家会很友善地向我解释如何在数据库方面处理这个问题 我想创建一个与位置实体 州 城市 有关系的用户 ID 名称 实体 所以在编程语言
  • 将庞大数据库从亚马逊RDS导出到本地mysql

    我在 Amazon RDS 上有一个 mysql 数据库 大约 600GB 数据 我需要将其移回本地专用服务器 但我不知道从哪里开始 每次我尝试初始化 sqldump 时它都会冻结 有没有办法将其移至 S3 甚至可能在开始下载之前将其分成更
  • 如何从 SQL Server 2008 查询结果中删除“NULL”

    我有一个包含 59 列和超过 17K 行的表 很多行都有NULL在某些列中 我想删除NULL以便查询返回空白 而不是NULL 我可以运行一些更新功能来替换所有NULL with 使用 SQL Server 2008R2 Management
  • 删除数据库中的行后如何重新排序ID

    我正在使用 C 来制作具有 sql 数据库的程序 在数据库中我有一个名为Workers 它有一个自动增量和主键ID column 当我删除一条记录时 ID 之间会出现间隙 删除记录后如何重新排序 ID UPDATE 我要做的就是找到记录后将
  • SELECT max(x) 返回 null;我怎样才能让它返回0?

    运行以下命令时如何返回 0 而不是 null SELECT MAX X AS MaxX FROM tbl WHERE XID 1 假设没有XID 1的行 or SELECT coalesce MAX X 0 AS MaxX FROM tbl
  • SQL查询查找表的主键?

    我怎样才能找到哪一列首要的关键使用查询来创建表 这是重复的question https stackoverflow com questions 893874 mysql determine tables primary key dynami
  • 我不断收到错误“关系 [TABLE] 不存在”

    我一直在尝试查询数据库中的两个表 在服务器资源管理器中 我可以看到两个表 甚至可以看到其中的列 我们将它们称为 Schema table1 和 Schema table2 其中 Schema 的第一个字母大写 我尝试运行以下查询 selec
  • SQL 约束以防止根据列的先前值更新列

    是否可以使用检查约束 或其他一些技术 来防止在更新记录时设置与其先前值相矛盾的值 一个例子是 NULL 时间戳 表明发生了某些事情 例如 file exported 一旦文件被导出并且具有非 NULL 值 就不应再将其设置为 NULL 另一
  • MySQL 追加字符串

    How can I append a string to the end of an existing table value Let s say I have the table below And let s say that Mari
  • Mysql插入表后不显示右单引号(’)

    我有一个名为 测试 的表 我插入了一行 其中包含unicode字符右单引号 0x2019在名称字段中 SQL insert into Testing values Sno Name Address insert into Testing v
  • 如何在 SQL Server 中连接

    我的数据库没有特定的列 因此我通过开关在查询中创建了一个列 我需要的是将此列与数据库中的另一列连接起来 select certificateDuration DurationType case when certificateDuratio
  • 是否可以引用同一个表中的不同列?

    如果博客有一个 类别 表 如下所示 CREATE TABLE categories id INTEGER PRIMARY KEY AUTO INCREMENT parent id INTEGER NOT NULL name VARCHAR

随机推荐

  • CSS线性渐变linear-gradient

    线性渐变是多种颜色沿着一条直线即渐变线过渡 发生渐变依靠渐变线和色标 其中渐变线来控制发生渐变的方向 色标包括颜色值和位置来控制渐变的色彩变化 创建一个线性渐变 需要指定两种颜色 还可以实现不同方向 指定为一个角度 的渐变效果 如果不指定方
  • 文件上传-.user.ini的妙用

    小伙伴们大家好 本期为大家带来的是 user ini在文件上传漏洞中的妙用 目录 user ini user ini的妙用原理 利用 user ini的环境 实战演示 1 先尝试直接上传webshell 2 看是否能够上传除php和png外
  • img标签和p标签是行内元素还是块级元素?以及p标签中可以放img标签吗?

    img标签 行内块元素 类似于 inline block 可以被p标签包裹 比如p是居中 图片也中了 p标签 块级元素 默认宽度占满一行 HTML p 是段落标签 除了可以添加文字内容外 完全可以添加其他html标签也包括IMG图片标签 其
  • 十大热门编程语言的介绍

    小编给大家分享一篇关于现阶段十大热门编程语言的文章 经过流行的搜索引擎 如谷歌 必应 雅虎 维基百科 亚马逊 YouTube和百度 用于计算评级 得出十大热门编程语言排行榜的榜单 根据百度百科以及网上查阅总结分析以上十大热门编程语言的介绍
  • 安全体系建立标准

    随着我国企业信息化的普及 信息化给我国企业带来积极影响的同时 也带来了信息安全方面的消极影响 一方面信息化在企业发展的过程中 对节约企业成本和达到有效管理起到了积极的推动作用 另一方面伴随着全球信息化和网络化进程的发展 与此相关的信息安全问
  • mysql中索引的null值问题

    在mysql中 对含有null值的索引列 以及is null is not null的查询条件是否会走索引这点 网上有很多说法 为此我自己单独做了个实验 首先创建两张表 一张表所有字段默认为null 另一张表所有字段默认为not null
  • QWidget(长文)

    一 描述 1 QWidget 是用户界面的原子 它从窗口系统接收鼠标 键盘和其他事件 并在屏幕上绘制自己的表示 每个小部件都是矩形的 它们按Z顺序排序 小部件由其父部件和它前面的小部件剪裁 2 未嵌入父窗口小部件的 QWidget 称为窗口
  • springboot发布dubbo服务注册到nacos

    目录 dubbo注册服务到nacos的pom依赖 使用dubbo发布rest服务报错 解决403 unknown user错误 如何把dubbo服务注册到nacos指定的命名空间 dubbo消费端 dubbo发布rest服务 启动报错 解决
  • 集合Set和List相互转换

    import java util public class Set3 public static void main String args Random rand new Random red 6 1 33 Set
  • 谷歌带来Cloud Spanner更新:查询自省、新可用区域和多区域配置

    在最近的一篇博文中 谷歌宣布了Cloud Spanner 一个全局分布式NewSQL数据库 的一些增强功能 谷歌基于用户要求进行了更新 带来了查询自省改进 新可用区域和新的多区域配置 谷歌Cloud Spanner是一种将关系数据库结构优势
  • 软件测试学习心得-3

    静态技术 一 静态技术与测试过程 静态测试和动态测试的区别 二 评审 正式评审过程 角色与职责 评审类型 三 静态分析和工具支持 编译器分析工具 规范标准一致性 数据流分析 控制流分析 圈复杂度 一 静态技术与测试过程 静态测试不以测试数据
  • 输入一维数组字符串,在输入一个字符串,获取字符串中,相同的字符,并且把相同的字符串输出

    package com qf day6 import java util Arrays public class Test5 public static void main String args String Names zs zl zs
  • laravel 学习记录

    1 安装 apache php mysql linux下安装lnmp lamp windows下可以安装xampp 2 安装composer 3 命令行下 转到网站目录后 执行下面的命令 composer create project la
  • 升级vim到8.2以及配置vimrc

    liuzhicheng Huaqin sudo add apt repository ppa jonathonf vim Unofficial package for Vim Packaging files are based on lat
  • 关于PCB模拟地和数字地的处理

    在PCB布线时板子上可能有几个地的情况 比较差的傻瓜式做法就是直接铺铜 这种对于低速板或者对干扰不敏感的板子来讲还是没问题的 但是高速或者要求精密的板子就不可取 这时候就需要把模拟地和数字地隔离好 通常楼主的做法是把模拟的元器件和数电的元器
  • msys2中导入window环境变量

    配置环境变量 MSYS2 PATH TYPE inherit
  • 1、Ubuntu16.04编译安装llvm+clang

    Ubuntu16 04编译安装llvm clang 一 环境介绍 操作系统 Ubuntu 16 04 不是虚拟机哦 在虚拟机上做过无数次尝试 均以失败告终 LLVM Clang版本 3 6 Cmake版本 3 6 二 下载安装 1 下载源码
  • java评论功能怎么实现_评论功能的简单实现

    最近在写一个问答功能 类似于评论 几番找资料才有点感觉 主要是太菜了 为了加深印象就单独抽出来记下笔记 然后这篇写完就开始SpringBoot的复习了 1 说明 网上看到有三种类型的评论 按照笔者的理解记下了过程 可能理解错了 望大神指出
  • 哈希算法题(砝码&数量得到种数)

    现有n种砝码 重量互不相等 分别为 m1 m2 m3 mn 每种砝码对应的数量为 x1 x2 x3 xn 现在要用这些砝码去称物体的重量 放在同一侧 问能称出多少种不同的重量 注 称重重量包括 0 include
  • MySQL【DQL查询数据(最重点)】

    DQL查询数据 最重点 4 1 DQL Data Query LANGUAGE 数据查询语言 所有的查询操作都用它 Select 简单的查询 复杂的查询它都能做 数据库中最核心的语言 最重要的语句 使用频率最高的语句 4 2 指定查询字段