MySQL(4)— 数据查询
四、数据查询(DQL)
4-1、查询指定字段
select 完整 语法:
select [distinct] 字段名1 [as] [别名],字段名2 [as] [别名]
from 表1
[ left | right | inner join 表2] on 两表有关联的连接点 -- 连表查询
[where ... ] -- 选择条件
[group by 字段名 ] -- 根据 字段名进行分组
[having ... ] -- 对分组后的结果列,再进行筛选
[order by 字段名 asc|desc ] -- 对查询结果根据 字段名 排序,默认asc升序
[limit startIndex,pageSize ] -- 对查询结果分页,默认从 0 开始。
别名 [as] ,拼接函数 concat( a,b ),分页查询 limit a,b
-- 起别名 select 字段 [as] 别名 from 表
SELECT studentNo 学号, studentName 学生姓名 FROM student
-- 函数 concat(a,b) 拼接
SELECT CONCAT('姓名:',studentName) FROM student
-- 分页查询 limit a,b [a,a+(b-1)]
SELECT CONCAT('姓名:',studentName) FROM student LIMIT 1,5 \Typora_Notes\MYSQL-学习笔记.assets\1587904975972.png)
查询姓名,拼接为 ('姓名':xx ) 格式 ,结果列取别名为 '我取的别名',且显示 4-(4+8-1)之间的数据,

去重 distinct
select distinct `studentNo` from result
从考试表中,查询参加了考试(至少一门)的学生学号
\Typora_Notes\MYSQL-学习笔记.assets\1587905171591.png)
数据库的列(表达式)
-- 查询系统版本
SELECT VERSION()
-- 计算
SELECT 100*3 AS 计算结果
-- 查询自增的步长
SELECT @@auto_increment_increment
数据库中的表达式:函数,计算表达式,系统变量,文本值,表的列,null...
select 表达式 from 表
4-2、where条件子句
逻辑判断
| 运算符 | 含义 | 描述 |
|---|---|---|
| and , && | 与 | 一假则假 |
| or , || | 或 | 一真即真 |
| not , ! | 非 | 真假取反 |
-- 查询任意有一门成绩90及以上的学号和学生姓名
SELECT DISTINCT s.studentNo 学号,studentName 姓名
FROM student s,result WHERE studentResult >= 90
-- 查询课程编号1,或者2中成绩在70-85 之间的学号和学生姓名
SELECT DISTINCT s.studentNo 学号,studentName 姓名
FROM student s,result WHERE studentResult BETWEEN 70 AND 85
-- 查询除了1号学生之外的学生成绩
SELECT * FROM result WHERE NOT studentNo = 1
模糊查询
| 运算符 | 语法 | 描述 |
|---|---|---|
| like | name like '王%' (姓王的) | 模糊查询 |
| in | id in (1,2,3) (id 在 1,2,3 之间) | 在集合中 |
| is null ,is not null | phone is not null(手机号不为空) | 是否为空 |
| between .. and .. | score between 80 and 100 (分数在区间 [80,100] 之间的 ) | 是否在区间 |
-- like 模糊查询, % : 任一字符, _ : 单个字符
-- 姓关谷,且后面只有2个字的学生信息
SELECT * FROM student WHERE studentName LIKE '关谷__'
-- 查询名字里,带有'海'的学生信息
SELECT * FROM student WHERE studentName LIKE '%海%'
-- 查询学号在 1,2,3 之间的学生信息
SELECT * FROM student WHERE studentNo IN (1,2,3)
-- 查询生日为null的学生信息
SELECT * FROM student WHERE bornDate IS NULL
4-3、连表查询
join ... on ...
| 连接查询语法 | 含义 |
|---|---|
| inner A jion B on a.xx = b.xx | 查询A,B两表公共的信息 |
| left [outer] A join B on a.xx = b.xx | 查询A,B两表公共的信息,包括A中和B没关联的信息 |
| right [outer] A join B on a.xx = b.xx | 查询A,B两表公共的信息,包括B中和A没关联的信息 |
思路:
/*
1 分析需求,查询的字段来自哪几张表?
2 确定使用哪种连接查询?(xxx join)
3 确定 连接点(on) 和 判断的条件(where)
*/
举例如下:
内联:查询 A B 表公共的信息 ==> inner A join B on
-- 查询学生id,学生姓名和所在年级
SELECT studentNo,studentName,grade_name
FROM student s INNER JOIN grade g
ON s.`gradeId` = g.`grade_id`
结果视图:

左连接:可在 A B 表连接查询显示信息时,查出 A 表里所有的内容,即包括和 B 表没有关联的信息。
==> left A join B on
左连接示例1: 查询所有学生的,以及他在的年级,包括年级为null的学生!
-- 查询所有学生的,以及他在的年级,包括年级为null的学生!
--(左外连接:可查出左表里,和右表没有关联的信息。 例如此例可以查出 没有年级的学生)
SELECT DISTINCT s.* ,g.grade_name FROM
student s LEFT OUTER JOIN grade g
ON s.gradeId = g.grade_id
结果视图:

左连接示例2:查询没有分配年级的学生的
-- 查询没有分配年级的学生的
SELECT DISTINCT s.* ,g.grade_name FROM
student s LEFT JOIN grade g
ON s.gradeId = g.grade_id
WHERE s.gradeId IS NULL
结果视图:

右连接:可在 A B 表连接查询并显示信息时,查出 B 表里所有的内容,即包括和 A 表没有关联的信息。
==> rightA join B on
-- 查询所有学生的,以及显示他在的年级,包括显示没有学生的年级!
--(右外连接:可查出右表里,和左表没有关联的信息。例如此例可以 显示出没有学生的年级)
SELECT DISTINCT s.* ,g.grade_name FROM
student s RIGHT OUTER JOIN grade g
ON s.gradeId = g.grade_id
结果视图:

三表查询练习1 : 查询参加了考试的学生的学号,姓名,课程名,课程成绩,并且按照学号升序排列
思路:先查询两张表,然后再慢慢增加!
-- 查询参加了考试的学生的学号,姓名,课程名,课程成绩,并且按照学号升序排列
SELECT stu.studentNo,stu.studentName,subjectName,studentResult
FROM (student stu RIGHT JOIN result r
ON stu.studentNo = r.studentNo)
LEFT JOIN SUBJECT sub
ON sub.subjectNo = r.subjectNo
ORDER BY studentNo ASC

三表查询练习2 : 查询参加了 高数4 的同学信息:学号,学生姓名,科目名,分数
-- 查询参加了 高数4 的同学信息:学号,学生姓名,科目名,分数
-- 思路:先内联查询参加了考试的学生,再查询 考试科目为数据结构的
SELECT stu.studentNo '学号' , studentName , '姓名',
subjectName '科目名' ,studentResult '分数'
FROM (student stu INNER JOIN result r
ON stu.studentNo = r.studentNo) INNER JOIN SUBJECT sub
ON sub.subjectNo = r.subjectNo
WHERE subjectName LIKE '%高等数学%4%'

自连接:把一张表拆分成两张表查询。
思路:
就好比是一张员工表,组长是员工,组员也是员工,但是组员的上级id = 组长的员工id。
所以这表其实本来可以细分为底层员工表,和管理者表。
练习:将category表,继续细分类别
SELECT a.categoryname '父栏目',b.categoryname '子栏目'
FROM `category` a , `category` b -- 或者写为 FROM `category` a inner join`category` b
WHERE b.`pid` = a.`categoryid` -- on b.`pid` = a.`categoryid`
-- 还意外得出个结论: 逗号分隔其实就是隐式的内连接!

4-4、分页及排序查询
排序:根据字段名进行升降序排列。
==> order
字段名by [ ASC / DESC ] 默认是ASC升序排列
分页:显示开始索引位置startIndex ,到往后pageSize个长度的结果。
==> limit startIndex , pageSize (不写开始索引位置,默认是从0开始)
练习:查询 java 第一学年,成绩前5的学生,且分数大于85,的学生信息(学号,姓名,课程名称,成绩)
-- 查询 java 第一学年,成绩前5的学生,且分数大于85,的学生信息(学号,姓名,课程名称,成绩)
SELECT stu.studentNo,studentName,subjectName,studentResult
FROM (student stu INNER JOIN result r
ON stu.studentNo = r.studentNo) INNER JOIN SUBJECT sub
ON r.subjectNo = sub.subjectNo
WHERE subjectName = 'Java第一学年' AND studentResult >= 90
ORDER BY studentResult DESC
LIMIT 5
结果视图:

4-5、子查询和嵌套查询
练习:查询 '高等数学-1',前五名同学的成绩信息,(学号,姓名,课程名,成绩)
连表查询 方式实现:
-- 连表查询:查询高等数学-1,前五名同学的成绩信息,(学号,姓名,课程名,成绩)
SELECT s.`studentNo` , s.`studentName` , `subjectName`,`studentResult`
FROM (student AS s INNER JOIN result AS r
ON s.studentNo = r.studentNo) INNER JOIN `subject` AS sub
ON r.subjectNo = sub.subjectNo
WHERE sub.`subjectName` = '高等数学-1'
ORDER BY studentResult DESC
LIMIT 5
子查询 方式实现:
-- 子查询:查询高等数学-1,前五名同学的信息,(学号,姓名,课程名,成绩)
SELECT DISTINCT s.`studentNo` , s.`studentName`, sub.`subjectName` , r.`studentResult`
FROM student s ,result r,`subject` sub
WHERE s.`studentNo` IN (
SELECT studentNo
FROM result
WHERE subjectNo = (
SELECT subjectNo
FROM `subject`
WHERE subjectName = '高等数学-1'
)
ORDER BY studentResult DESC
)
ORDER BY studentResult DESC
LIMIT 5
结果视图:
注意点:子查询里不能用外面的表别名!

4-6、分组查询
group by
字段名having
过滤条件
注意:此处的 having 是对分组后的,属性进行筛选,相当于复试。
而where 是对还没分组的所有属性进行筛选,相当于海选,注意 where 不能使用聚合函数。
-- 查询所有科目的 最低分,最高分,平均成绩(大于90分)
SELECT subjectName 课程名, MIN(studentResult) 最低分 , MAX(studentResult) 最高分 , AVG(studentResult)平均分
FROM SUBJECT s INNER JOIN result r
ON s.`subjectNo` = r.`subjectNo`
GROUP BY s.subjectNo
HAVING 平均分 >= 80
结果视图:

MySQL(4)— 数据查询的更多相关文章
- MySQL:数据查询
数据查询 一.基本查询语句 1.语法:写一行 select{*<字段列表>}//查询的字段,多个字段用逗号分开 from<表1>,<表2>…//数据表名 {//可选 ...
- mysql 大数据 查询方面的测试
---方法1: 直接使用数据库提供的SQL语句---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N---适应场景: 适用于数据量较少的情况(元组百/千 ...
- SpringMVC+Mybatis实现的Mysql分页数据查询
周末这天手痒,正好没事干,想着写一个分页的例子出来给大家分享一下. 这个案例分前端和后台两部分,前端使用面向对象的方式写的,里面用到了一些回调函数和事件代理,有兴趣的朋友可以研究一下.后台的实现技术是 ...
- Python MySQL - 进行数据查询
#coding=utf-8 import mysql.connector import importlib import sys # reload(sys) # sys.setdefaultencod ...
- MySql的数据查询
SELECT语句是最常用的查询语句,它的使用方式有些复杂,但功能却相当强大.SELECT语句的基本语法如下: select selection_list//要查询的内容,选择哪些列 from数据表名/ ...
- mysql重复数据查询
假设有表test mysql> select * from test; +----+------+------+ | id | name | sex | +----+------+------+ ...
- python之MySQL学习——数据查询
import pymysql as ps # 打开数据库连接 db = ps.connect(host='localhost', user='root', password='123456', dat ...
- Mysql重复数据查询置为空
前两天产品有个需求,相同的商品因为价格不同而分开展示,但是明细还是算一条明细,具体区分展示出商品的价格和数量信息,其他重复的商品信息要置空. 需求并不难,用程序代码循环处理就可以了.但是后面涉及到打印 ...
- 【nodejs】express框架+mysql后台数据查询
一 环境部署 1,首先安装nodejs,并配置好环境变量(看自己习惯), 2,安装Express npm install express -g //全局安装 npm install express-g ...
- MySQL大数据量分页查询
mysql大数据量使用limit分页,随着页码的增大,查询效率越低下. 测试实验 1. 直接用limit start, count分页语句, 也是我程序中用的方法: select * from p ...
随机推荐
- Android xUtils3.0使用手册(二) - 数据库操作
步骤: (1). 创建数据表: (2). DaoConfig 获取数据库的配置信息: (3). 获取数据库实例: x.getDb(daoConfig); (4). 数据库的增删改查. 1. 创建 ...
- Alpine Linux 3.9.2 发布,轻量级 Linux 发行版
开发四年只会写业务代码,分布式高并发都不会还做程序员? Alpine Linux 3.9.2 已发布,Alpine Linux 是一款面向安全的轻量级 Linux 发行版,体积十分的小. Alpi ...
- SQLCommand 相关应用
SQL command 对象:执行指定数据库中相应的操作 (执行相应的SQL语句)string str1 = "select * from tb_student "Create: ...
- 使用Hexo框架搭建博客,并部署到github上
开发背景:年后回来公司业务不忙,闲暇时间了解一下node的使用场景,一篇文章吸引了我15个Nodejs应用场景,然后就被这个hexo框架吸引了,说时迟,那时快,赶紧动手搭建起来,网上找了好多资料一天时 ...
- C语言编程入门题目--No.8
题目:输出9*9口诀. 1.程序分析:分行与列考虑,共9行9列,i控制行,j控制列. 2.程序源代码: #include "stdio.h" main() { int i,j,re ...
- <学习笔记 之 JQuery 基础语法>
jQuery 库 - 特性 jQuery 是一个 JavaScript 函数库. jQuery 库包含以下特性: HTML 元素选取 HTML 元素操作 CSS 操作 HTML 事件函数 JavaSc ...
- Adobe Reader XI 打开后“已停止工作”的解决办法
搜了好多方法按照步骤做完,基本无用,试了以下方法搞定. 具体方法是: 把域名解析到本机. 打开 C:\Windows\System32\drivers\etc\hosts 添加 127.0.0.1 a ...
- Ubuntu 1804 安装xmind8详细过程
安装比较简单, 折腾了很久,一启动就报错,切换了JDK版本就能用了: 安装 登陆官网,下载xmind8: 下载得到文件xmind-8-update9-linux.zip: 将文件解压至路径xmind下 ...
- echarts 中 symbol 自定义图片
首先我使用的技术框架的VUE,当然该方法在其他框架也是适用的,这点大家注意一下~ 在官方文档里面,修改标记的图形(symbol)的方法有三种: 一:ECharts 提供的标记类型有 'circle', ...
- Spring Cloud 系列之 Config 配置中心(三)
本篇文章为系列文章,未读前几集的同学请猛戳这里: Spring Cloud 系列之 Config 配置中心(一) Spring Cloud 系列之 Config 配置中心(二) 本篇文章讲解 Conf ...