4 DQL 查询数据(最重点)

4.1 DQL

( Date Query Language : 数据查询语言)

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

Select 完整语法:


4.2 指定查询字段

创建三个表 : member ,result ,subject 并插入数据

CREATE TABLE IF NOT EXISTS `member`(`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '编号',`name` VARCHAR(10) NOT NULL DEFAULT '匿名' COMMENT '名字',`sex` VARCHAR(5) NOT NULL DEFAULT '男' COMMENT '性别',`birthday` DATETIME DEFAULT NULL COMMENT '生日',`wechat` VARCHAR(50) DEFAULT NULL COMMENT '微信',`phonenumber` INT(11) DEFAULT NULL COMMENT '电话号码',`address` VARCHAR(30) DEFAULT NULL COMMENT '住址',PRIMARY KEY (`id`))ENGINE=INNODB DEFAULT CHARSET=utf8INSERT INTO `member` (`name`,`sex`,`birthday`,`wechat`,`phonenumber`,`address`)VALUES ('雷成','男','1998-01-23','123456','147852963','旭景碧泽园'),('程岩','男','1998-01-24','123456789','25896314','铭景新城'),('张佳成','男','1997-02-24','13456789','5896314','三爻'),('毛哥','男','199-12-05','123456789','25896314','桃园'),('倩倩','女','1998-03-19','12345678','5896314','皇家草滩'),('王杰','男','1997-04-30','123456758','5263147','横水镇碳村'),('马青','女','1997-07-15','123456','1458785','虢王镇'),('王露','女','1999-11-01','13456','1458596','蓝天')CREATE TABLE IF NOT EXISTS `subject`(`id` INT(20) NOT NULL AUTO_INCREMENT COMMENT '编号',`name` VARCHAR(20) DEFAULT NULL COMMENT '名字',`major` VARCHAR(20) DEFAULT NULL COMMENT '专业',PRIMARY KEY(`id`)  )ENGINE=INNODB DEFAULT CHARSET=utf8CREATE TABLE IF NOT EXISTS `result`(`id` INT(10) NOT NULL AUTO_INCREMENT,`name` VARCHAR(10) DEFAULT NULL,`socer` INT(20) DEFAULT NULL,PRIMARY KEY(`id`)  )ENGINE=INNODB DEFAULT CHARSET=utf8INSERT INTO `result` (`name`,`socer`)VALUES ('雷成','20'),('程岩','30'),('张佳成','40'),('毛哥','50'),('倩倩','60'),('王杰','70'),('马青','80'),('王露','90')

查询:

-- 查询全部的成员  SELECT 字段 FROM 表
SELECT * FROM `result`-- 查询指定字段
SELECT `name`,`socer` FROM result-- 别名,给结果起一个名字   AS   也可以给字段起别名
SELECT `name` AS 名字,`socer` AS 分数 FROM result AS s-- 函数  Concat (a,b)
SELECT CONCAT('姓名:',`name`) AS 新名字 FROM result

语法 : SELECT 字段,…FROM 表

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

去重 distinct

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

-- 查询一下哪些成员参加了考试,成绩
SELECT * FROM result -- 查询全部的考试成绩
SELECT `name` FROM result -- 查询哪些同学参加了考试
SELECT DISTINCT `name` FROM result -- 发现重复数据,去重

数据库的列 (表达式)

SELECT VERSION() -- 查询系统版本
SELECT 100*3-1 AS 计算结果 -- 用来计算 (表达式)
SELECT @@auto_increment_increment -- 查询自增的步长 (变量)-- 成员的考试分数 +1分 查看
SELECT `name`,`socer`+1 AS '提分后' FROM result
SELECT DISTINCT `name`,`socer`+1 AS '加分后' FROM result -- 去重

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

select 表达式 from 表

4.3 where 条件子句

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

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

运算符 语法 描述
and && a and b a && b 逻辑与,两个都为真,结果为真
or || a or b a || b 逻辑或,一个为真,结果为真
NOt ! not a !a 逻辑非,真为假,假为真

尽量使用英文字母

-- ====================== where ==========================================SELECT `id`,`name`,`socer` FROM result  -- 查询所有成员的成绩
SELECT DISTINCT `name`,`socer` FROM result -- 去重-- 查询成绩在 50~90 之间的成员
SELECT DISTINCT `name`,`socer` FROM result -- DISTINCT 去重
WHERE socer>=50 && socer<=90-- 模糊查询(区间)
SELECT DISTINCT `name`,`socer` FROM result
WHERE socer BETWEEN 30 AND 100-- 查询除了 4号以外的学生
SELECT `id`,`name`,`socer` FROM result
WHERE id != 4-- != 等于 not
SELECT `id`,`name`,`socer` FROM result
WHERE NOT `id` = 4

模糊查询 :比较运算符

运算符 语法 描述
IS NULL a is null 如果操作符为 null ,结果为真
IS NOT NULL a is not null 如果操作符不为 null ,结果为真
BETWEEN a between b and c 若a在b和c之间,则结果为真
Like a like b SQL匹配,如a匹配b,则结果为真
In a in (a1,a2,a3…) 假设a 在 a1,或者a2…其中的某一个值中,结果为真
-- =============================== 模糊查询 ========================================
SELECT `name`,`sex` FROM `member`
-- 查询姓王的成员
-- like 结合 %(代表0到任意个字符)     _ (代表一个字符)
SELECT `name`,`sex` FROM `member`
WHERE `name` LIKE '王%'-- 查询姓雷的同学,后面只有一个字的
SELECT `name`,`sex` FROM `member`
WHERE `name` LIKE '雷_'-- 查询姓张的同学,后面是两个字的
SELECT `name`,`sex` FROM `member`
WHERE `name` LIKE '张__'-- 查询名字带毛的同学
SELECT `name`,`sex` FROM `member`
WHERE `name` LIKE '%毛%'-- 查询名字带佳的同学
SELECT `name`,`sex` FROM `member`
WHERE `name` LIKE '%佳%'-- ======================== in (具体的一个或多个值)=================================
-- 查询编号5,6,7的成员
SELECT `id`,`name` FROM `member`
WHERE `id` IN (5,6,7)-- 查询在 横水碳村的成员
SELECT `name`,`sex` FROM `member`
WHERE address IN ('横水镇碳村','旭景碧泽园') -- In (必须是具体的一个或者多个值)-- =========================== null 或者 not null=======================-- 查询地址为空的学生  null  ''
SELECT `id`,`name`,`address` FROM `member`
WHERE address='' OR address IS NULL-- 查询有出生日期的同学   不为空
SELECT `name`,`sex`,`birthday` FROM `member`
WHERE `birthday` IS NOT NULL-- 查询没有出生日期的同学  为空
SELECT `name`,`sex`,`birthday` FROM `member`
WHERE `birthday` IS NULL

4.4 联表查询

JOIN 对比

-- ============================= 联表查询 =========================================
-- 查询参加考试的同学的专业,性别,wechat,分数等等
SELECT * FROM result
SELECT * FROM `subject`
/*思路:1:分析需求,分析查询的字段来自哪些表,(联表查询)2:确定使用哪种连接查询? 7种3:确定交叉点(这两个表中那两个数据是相同的)4:判断的条件:subject表中的 id = result表中的 id*/-- 查询编号,专业,分数
SELECT s.id,`major`,`socer`
FROM `subject` AS s
INNER JOIN result AS r
WHERE s.`id`=r.`id`-- 查询名字,专业,分数
SELECT s.name,major,socer
FROM `subject` AS s
INNER JOIN result AS r
WHERE r.name=s.name-- 查询名字,性别,WeChat,专业
SELECT s.name,sex,wechat,major
FROM `member` AS m
INNER JOIN `subject` AS s
WHERE m.name=s.name-- Right Join
SELECT s.name,sex,wechat,major
FROM `member` m
RIGHT JOIN `subject` s
ON m.name=s.name-- Left Join
SELECT s.name,sex,wechat,major
FROM `member` m
LEFT JOIN `subject` s
ON m.name=s.name-- 查询没有专业的同学 (左表的应用)
SELECT s.name,sex,wechat,major
FROM `member` m
LEFT JOIN `subject` s
ON m.name=s.name
WHERE major IS NULL-- ================================================================================================================-- join on 连接查询  ( on 代表条件判断 ) ( join 连接的表 )
-- where   等值查询-- 思考: ( 查询成员的名字,性别,专业,分数)
/*思路:1:分析需求,分析查询的字段来自哪些表,(联表查询) member,subject,result2:确定使用哪种连接查询? 7种3:确定交叉点(这两个表中那两个数据是相同的)4:判断的条件:name 相同
*/
SELECT s.name,sex,major,socer
FROM `member` AS m
RIGHT JOIN `subject` s
ON s.name=m.name
INNER JOIN result AS r
ON s.name=r.name-- ==============================================================================================================
-- 我要查询哪些数据 select...
-- 从哪几个表中查看 FROM 表 xxx Join 连接的表 on 交叉条件
-- 假设存在一种多张表查询,先查询两张,在慢慢增加-- From a left join b  以左表 a 为基准
-- From a right join b 以右表 b 为基准
操作 描述
Inner Join 如果表中至少有一个匹配,就会返回值
left Join 会从左表中返回所有的值,即使右表中没有匹配
right join 会从右表中返回所有的值,即使左表没有匹配

自连接

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

CREATE TABLE `person` (`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主编号',`pid` INT(10) DEFAULT NULL COMMENT '副编号',`subjetname` VARCHAR(20) DEFAULT NULL COMMENT '科目名字',PRIMARY KEY(`id`))ENGINE=INNODB DEFAULT CHARSET=utf8INSERT INTO `person` (`id`,`pid`,`subjetname`)VALUES ('2','1','软件工程'),('3','1','软件开发'),('4','3','数据库'),('5','1','美术设计'),('6','3','web开发'),('7','5','ps技术'),('8','2','办公信息');-- 查询父子信息,把一张表看成是两张一样的表SELECT a.subjetname AS '父栏目',b.subjetname AS '子栏目'FROM `person` AS a,`person` AS bWHERE a.id=b.pid

4.5 分页和排序

排序

-- 排序:升序 ASC ,降序 DESC
-- ORDER BY 通过哪个字段排序,怎么排
-- 查询到的结果根据  成绩降序  排序
SELECT DISTINCT `name`,`socer` FROM `result`
ORDER BY `socer` ASC

分页

-- ====================================== 分页 limit 和排序 order by ===================================================-- 排序:升序 ASC ,降序 DESC
-- ORDER BY 通过哪个字段排序,怎么排
-- 查询到的结果根据  成绩降序  排序
SELECT DISTINCT `name`,`socer` FROM `result`
ORDER BY `socer` ASC-- 分页
-- 缓解数据库压力,给人的体验更好,瀑布流-- 分页,每页只显示两条数据
-- 语法: limit 当前页,页面的大小
SELECT DISTINCT `name`,`socer` FROM `result`
ORDER BY `socer` ASC
LIMIT 2,2-- 第一页  limit 0,5    (1-1)*5
-- 第二页  limit 0,5    (2-1)*5
-- 第三页  limit 0,5    (3-1)*5
-- 第N页   limit 0,5    (n-1)*pageSize,pageSize
-- [pageSize: 页面大小]
-- [(n-1)*pageSize: 起始值]
-- [n:当前页]
-- [数据总数/页面大小 = 总页数]-- 思考:查询成绩排名前五的成员,并且分数大于50的学生信息(名字,专业,分数)
SELECT DISTINCT m.`name`,`major`,`socer`
FROM `member` m
RIGHT JOIN `subject` s
ON m.name=s.name
INNER JOIN result r
WHERE s.name=r.name AND socer>=50
ORDER BY socer DESC
LIMIT 0,5

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

4.6 子查询

4.7 分组和过滤

-- 查询不同地址的平均分,最高分,最低分,平均分大于80
-- 核心:(根据不同的地址分组)SELECT `address`,AVG(socer),MAX(socer),MIN(socer)
FROM result r
INNER JOIN `member` m
ON m.name=r.name
GROUP BY m.name    -- 通过什么字段来分组
HAVING AVG(socer)>40

数据查询语言及联表查询相关推荐

  1. Mysql- --DQl语句(select数据查询语言,多表查询,View试图)linux常用(重点)

    文章目录 一.SELECT WHERE子句(条件) 1.逻辑操作符 2.DISTINCT 去除重复列 3.LIKE: 通配符 4.空值查询 5.统计 6.分组:统计 7.排序 8.限定查询结果 9.I ...

  2. mysql的联表查询和去重复数据

    mysql的联表查询和去重复数据 /* SQLyog Ultimate v10.00 Beta1 MySQL - 5.7.17-log : Database - pusmtnew ********** ...

  3. mybatis联表查询且统计数据

    mybatis联表查询且统计数据 表1的数据+表2的数据的统计==>vo接收 前端原型图如下: 涉及到两张表 t_record t_user_record 详情A/B A:未签收人数 B:全部人 ...

  4. Spring Hibernate JPA 联表查询 复杂查询

    (转自:http://www.cnblogs.com/jiangxiaoyaoblog/p/5635152.html) 今天刷网,才发现: 1)如果想用hibernate注解,是不是一定会用到jpa的 ...

  5. java sql 联表查询系统_Spring Hibernate JPA 联表查询 复杂查询(转)

    关系类型Owning-SideInverse-Side one-to-one @OneToOne @OneToOne(mappedBy="othersideName") one-t ...

  6. MySQL学习记录04where条件子句、联表查询、子查询

    文章目录 MySQL学习记录04where条件子句.联表查询.子查询 4.1DQL 4.2指定查询字段 4.3where条件子句 4.4联表查询 4.5分页和排序 4.6子查询 MySQL学习记录04 ...

  7. java jpa自身关联查询_Spring Hibernate JPA 联表查询 复杂查询

    关系类型Owning-SideInverse-Side one-to-one @OneToOne @OneToOne(mappedBy="othersideName") one-t ...

  8. MYSQL 联表查询 ORDER 效率低?

    今天在处理一个分页时候,发现速度感人,点下一页等了半天.然后查看代码,发现是一个left jion语句. SELECT DISTINCT ordr.id,ordr.*,cf.nickname FROM ...

  9. 【explain】MySQL联表查询中的驱动表

    写在前面 1.不要求每个人一定理解 联表查询(join/left join/inner join等)时的mysql运算过程 2.不要求每个人一定知道线上(现在或未来)哪张表数据量大,哪张表数据量小 3 ...

最新文章

  1. 青岛理工邀请赛(难受的一次经历)之显示屏(按着倍数放大数字)
  2. Java中常见RuntimeException与其他异常表及Exception逻辑关系详解
  3. 返回值由hresult变为void型_java高级之泛型
  4. 数据--第31课 - 树的存储结构
  5. 正则表达式在python中的应用_正则表达式:Python3中的应用简介
  6. 树莓派之Debian游戏(部分)
  7. vue 图片拖拉转放大缩小组件
  8. 数据库 case wen条件语句的运用
  9. 解决:adb devices error protocol falut(no status)
  10. 哈佛专家推荐5种最健康食物
  11. 网络版的知乎点赞问题~
  12. Word中替换手动换行符的处理
  13. Vue+ .netcore3.1 模拟QQ邮箱发送验证码
  14. 放肆一点又何妨(一)-银川与腾格里沙漠
  15. byte数组转blob类型_Jfinal 存byte[] 到mysql数据库中blob类型
  16. 苹果电脑上几款不错的文字处理工具
  17. q创建群聊显示服务器繁忙是什么意思,一种堵车时聊天群的建立方法及系统
  18. 伟大的淘宝IP库的API接口竟然提示503挂掉了
  19. linux 两块硬盘做r0,本文是emp3r0r:Linux用户打造的Linux后渗透框架的后续。
  20. Three.js入门学习笔记07:外部模型导入-C4D转成json文件供网页使用-fbx导入

热门文章

  1. 用友推出电子发票服务平台 互联网发力
  2. 关于 Android 6.0 的流媒体播放异常
  3. python爬取网页内容post_python爬虫之使用POST抓取网页内容
  4. autoCAD 创建对象 使用面域 创建图案填充
  5. appvlv中偶有不爽
  6. Installation failed with message Invalid File 无法调试
  7. mac 修改java版本_Mac如何更改maven的java版本
  8. 黄健翔昨天在意大利对澳大利亚的比赛上的解说激情四射
  9. Nagios监控软件源码安装
  10. r语言remarkdown展示图_为什么Markdown R有较大概率成为科技写作主流? ← 阳志平的个人网站::技术...