SQL-SQL查询检索阶段二
一 前提准备
先声明一下,下面的库表只是简易的学习示例,不是生产的设计,不要深究,此文我们的目的是学习sql的检索不是库表设计;初学者最好跟着作者的文章一步一步敲一遍,如果没有使用过sql的可以查阅作者SQL系列专栏;
1.1 顾客表
CREATE TABLE `customer` (
`userId` int(11) NOT NULL AUTO_INCREMENT COMMENT '顾客id',
`userName` varchar(255) DEFAULT NULL COMMENT '顾客名称',
`telephone` varchar(255) DEFAULT NULL COMMENT '顾客电话',
PRIMARY KEY (`userId`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
INSERT INTO `springboot`.`customer`(`userId`, `userName`, `telephone`) VALUES (1, 'zxzxz', '1327');
INSERT INTO `springboot`.`customer`(`userId`, `userName`, `telephone`) VALUES (2, 'youku1327', '1996');
1.2 商品表
CREATE TABLE `product` (
`productId` int(11) NOT NULL AUTO_INCREMENT COMMENT '产品id',
`productName` varchar(255) DEFAULT NULL COMMENT '产品名称',
`price` varchar(255) DEFAULT NULL COMMENT '产品价格',
PRIMARY KEY (`productId`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
INSERT INTO `springboot`.`product`(`productId`, `productName`, `price`) VALUES (1, '苹果', '5');
INSERT INTO `springboot`.`product`(`productId`, `productName`, `price`) VALUES (2, '梨', '4');
INSERT INTO `springboot`.`product`(`productId`, `productName`, `price`) VALUES (3, '香蕉', '3');
1.3 订单表
CREATE TABLE `order` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
`userId` int(11) DEFAULT NULL COMMENT '客户id',
`productId` int(11) DEFAULT NULL COMMENT '产品id',
`orderName` varchar(255) DEFAULT NULL COMMENT '订单名称',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
INSERT INTO `springboot`.`order`(`id`, `userId`, `productId`, `orderName`) VALUES (1, 1, 1, '乖乖订单');
INSERT INTO `springboot`.`order`(`id`, `userId`, `productId`, `orderName`) VALUES (2, 2, 2, '悦悦订单');
INSERT INTO `springboot`.`order`(`id`, `userId`, `productId`, `orderName`) VALUES (3, 1, 3, '香香订单');
二 聚集函数的使用
聚集函数的定义就是讲一些行的数据运行某些函数,返回一个期望值;下面讲述的是开发中经常使用到的聚集函数;
2.1 avg()
avg函数也就是计算行的数量,通过计算这些行的特定列值和,计算出平均值(特定列值之和/行数=平均值);使用时注意其会忽略列值为NULL的行;
语句示例:
SELECT AVG(price) FROM product;
语句结果:
4
语句分析:
查询价格平均值来自商品表(5+4+3)/3=4;
2.2 count()
count函数用于计算行数,其中count(*)计算所有行的数目,count("column")会忽略column为NULL的行数;
语句示例:
SELECT count(*) FROM product;
语句结果:
3
语句分析:
查询总行数来自商品表;
2.3 max()
max函数返回特定列值的最大值;忽略特定列为NULL的行;
语句示例:
SELECT max(price) FROM product;
语句结果:
5
语句分析:
查询价格的最大值来自商品表;
2.4 min()
返回特定列的最小值;忽略特定列为NULL的行;
语句示例:
SELECT min(price) FROM product;
语句结果:
3
语句分析:
查询价格的最小值来自商品表;
2.5 sum()
返回特定列的和;忽略特定列为NULL的行;
语句示例:
SELECT sum(price) FROM product;
语句结果:
12
语句分析:
查询价格的总和来自商品表;
三 分组数据
分组定义就是按照特定的列进行分组查询,使用 GROUP BY 子句进行分组查询;注意点:SELEC后面的列必须出现在group by 子句后面,否则报语法错误;通常 group by 子句的位置是where 条件之后,order by 子句之前;
3.1 分组求和
语句示例:
SELECT sum(price) FROM product GROUP BY productName;
语句结果:
4
5
3
语句分析:
先根据商品名称分为三组 苹果 ,梨 , 香蕉 ;再根据不同的分组求和,因为我们表中的数据只有这三条所以就是每行的值;
3.2 分组过滤
语句示例:
SELECT count(*) FROM `order` GROUP BY userId HAVING count(*) > 1;
语句结果:
2
语句分析
查询 条数来自 订单表 根据客户id分组,过滤条件 条数大于2;注意 having 与 where其实差别不大,通常我们讲where当作标准的过滤条件,having用作分组过滤条件;注意有的数据库管理系统having不支持别名作为分组过滤条件中的一部分;
3.3 分组排序
语句示例:
SELECT count(*) as count FROM `order` GROUP BY userId ORDER BY count;
语句结果:
1
2
语句分析
查询 行数 来自 订单表 根据 客户id分组,根据 行数排序;注意点是经过分组后结果看似经过排序,其实并不能确保是排序后的结果,所以要排序一定要使用order by子句;
四 子查询
子查询的定义是在查询中嵌套查询;注意子查询只能返回单列,若企图返回多列会报语法错误;
语句示例:
SELECT
userName
FROM
customer
WHERE
userId = ( SELECT userId FROM `order` WHERE orderName = '乖乖订单' )
语句结果:
zxzxz
语句分析:
是执行语句 【SELECT userId FROM order WHERE orderName = '乖乖订单' 】得到结果 userId = '1' ;
然后执行语句 【 SELECT userName FROM customer WHERE userId = '1'】;
五 联结表
联结表也就是我们通常意义上的关联表查询,主要功能是能在多表中使用一条sql检索出期望值,但实际库表中是存在的,只在查询期间存在;其主要分为内联结和外连接使用的 join 关键字;联结表会返回一对多,一对一,多对多关系;联结表不建议超过三张表以上;
5.1 简单联结
语句示例:
SELECT
userName,
orderName
FROM
customer,
`order`
WHERE
customer.userId = `order`.userId;
语句结果:
zxzxz 乖乖订单
youku1327 悦悦订单
zxzxz 香香订单
语句分析 :
查询 用户名来自用户表,查询订单名称来自订单表,根据 订单表的客户id 等于 客户表的客户id做为联结条件;也就是说会查询出两张表根据userId为等值条件的 userName 和 orderName 的 数据;
注意点 : 简单联结中where子句后面 必须 要带上 两张表的联结关系,否则会出现笛卡尔集(比如3行数据联结另一张表3行数据会产生3*3=9条)
5.2 内联结
内连接(inner join) 又称等值联结,其查询结果跟之前的简单联结一致;
语句示例:
SELECT
userName,
orderName
FROM
customer
INNER JOIN `order` ON ( customer.userId = `order`.userId );
语句结果:
zxzxz 乖乖订单
youku1327 悦悦订单
zxzxz 香香订单
语句分析:
跟之前的简单联结稍微不同的是 等值条件 是放在 on 关键字后面,在等值条件后面还可以进行 where 子句过滤条件查询;
5.3 自然联结
自然联结与标准的联结不同就是只返回值唯一的列,不会返回重复的列;
自然联结示例:
SELECT
userName,
orderName
FROM
customer
INNER JOIN `order` ON ( customer.userId = `order`.userId );
自然联结结果
zxzxz 乖乖订单
youku1327 悦悦订单
zxzxz 香香订单
非自然联结示例:
SELECT
*
FROM
customer
INNER JOIN `order` ON ( customer.userId = `order`.userId );
非自然联结结果:
1 zxzxz 1327 1 1 1 乖乖订单
2 youku1327 1996 2 2 2 悦悦订单
1 zxzxz 1327 3 1 3 香香订单
重复列是 userId;
5.4 外联结
右外联结
语句示例:
SELECT
*
FROM
`order`
RIGHT OUTER JOIN customer ON ( customer.userId = `order`.userId );
右外联结是指 相对于 OUTER JOIN 右边的表,那么这会查询出右边表的所有数据 和根据等值条件匹配左边表的数据,如果左边表的数据不匹配,那么其返回列的值是NULL充当;
左外联结
语句示例:
SELECT
*
FROM
customer
LEFT OUTER JOIN `order` ON ( customer.userId = `order`.userId );
左外联结是指 相对于 OUTER JOIN 左边的表,那么这会查询出左边表的所有数据 和根据等值条件匹配右边表的数据,如果右边表的数据不匹配,那么其返回列的值是NULL充当;
区别:
左外联结和右外联结其实没什么不同,只是查询表顺序不一致,我们通过置换 表的相对位置就可以查询出一样的结果;
六 组合查询
组合查询是指可以执行多条SELECT 语句,其查询的结构是一致的,返回查询结果,通常我们称为复合操作或者并(union)
语句示例:
SELECT
userId
FROM
customer UNION
SELECT
userId
FROM
`order`
返回结果:
1
2
语句分析:
union 关联的字段或者聚合函数在两张表中必须是相同的,其默认会讲结果进行去重处理;如果不去重可以使用 union all
语句示例:
SELECT
userId
FROM
customer UNION ALL
SELECT
userId
FROM
`order`
执行结果:
1
2
1
2
1
语句分析:
等同于讲客户表和订单表的用户id都合并为一个并集查询出来,而且不去重;如果对组合语句进行排序,默认是会作用于组合后的数据字段排序,而不是作用于其中的一条查询语句;
七 结束语
到本文看完,基本的查询语句都已经学会了,后面就是插入,更新,删除,相对于查询比较简单,有空后续会写相关文章;

SQL-SQL查询检索阶段二的更多相关文章
- SQL- SQL查询检索阶段一
一 说明 如果是初学者,建议去网上寻找安装Mysql的文章安装,以及使用navicat连接数据库,以后的示例基本是使用mysql数据库管理系统: 二 准备前提 需要建立一张学生表,列分别是id,名称, ...
- SQL Server查询性能优化——堆表、碎片与索引(二)
本文是对 SQL Server查询性能优化——堆表.碎片与索引(一)的一些总结. 第一:先对 SQL Server查询性能优化——堆表.碎片与索引(一)中的例一的SET STATISTICS IO之 ...
- 你真的会玩SQL吗?之逻辑查询处理阶段
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...
- [SQL] SQL 基础知识梳理(二) - 查询基础
SQL 基础知识梳理(二) - 查询基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 这是<SQL 基础知识梳理( ...
- SQL Server 查询处理中的各个阶段(SQL执行顺序)
SQL 不同于与其他编程语言的最明显特征是处理代码的顺序.在大数编程语言中,代码按编码顺序被处理,但是在SQL语言中,第一个被处理的子句是FROM子句,尽管SELECT语句第一个出现,但是几乎总是最后 ...
- SQL Server查询性能优化——覆盖索引(二)
在SQL Server 查询性能优化——覆盖索引(一)中讲了覆盖索引的一些理论. 本文将具体讲一下使用不同索引对查询性能的影响. 下面通过实例,来查看不同的索引结构,如聚集索引.非聚集索引.组合索引等 ...
- SQL基本查询_单表查询(实验二)
SQL基本查询_单表查询(实验二) 查询目标表结构及数据 emp empno ename job hiedate sal comn deptno 1007 马明 内勤 1992-6-12 4000 2 ...
- {MySQL的逻辑查询语句的执行顺序}一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析
MySQL的逻辑查询语句的执行顺序 阅读目录 一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析 一 SEL ...
- 如何在SQL Server查询语句(Select)中检索存储过程(Store Procedure)的结果集?
如何在SQL Server查询语句(Select)中检索存储过程(Store Procedure)的结果集?(2006-12-14 09:25:36) 与这个问题具有相同性质的其他描述还包括:如何 ...
随机推荐
- 理解Redis持久化
本文首发于:https://mp.weixin.qq.com/s/WVUGWuNrGoyY_7aDf7NNmA 微信公众号:后端技术指南针 0.前言 通俗讲持久化就是将内存中的数据写入非易失介质中,比 ...
- 2019-9-19:渗透测试,HTML基础学习,html绘制表格
1,受理员业务统计表 效果图: 代码: <!DOCTYPE html><html><head> <title>表格1</title>< ...
- day 37 CSS
参考博客:https://www.cnblogs.com/majj/p/9021419.html 1.CSS的三种链接样式: 行内链接(优先级最高) 内接样式 外接样式 <html lang=& ...
- Java8 日期时间API
一.转换 1.与字符串 //LocalDateTime 转 字符串 String str = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss ...
- django-formset实现数据表的批量操作
什么是formset 我们知道forms组件是用来做表单验证,更准确一点说,forms组件是用来做数据库表中一行记录的验证.有forms组件不同,formset是同科同时验证表中的多行记录,即form ...
- C语言l-2019秋作业01
2.1 你对软件工程专业或者计算机科学与技术专业了解是怎样? 在进入大学之前,我认为软件工程就是学习开发软件的,后来,从网上搜索了有关它的定义,软件工程是一门研究用工程化方法构建和维护软件的学科,它以 ...
- Linux安装图像页面的命令
在shell里输入: sudo apt-get install x-window-system-core #安装x-windows的基础 sudo apt-get install gdm #安装登录管 ...
- Linux下搭建web服务
第一:安装java 第二:安装tomcat 第三:部署程序 第一:安装java 下载地址: http://www.oracle.com/technetwork/java/javase/download ...
- java前端与后端怎么选??
想做这个行业,就应该了解职能以及技能需求,这样学习才能更高效.我知道一些刚刚入行的小伙伴不清楚前端.后端.到底指的是什么?两者直接的区别 前端开发 前端开发主要涉及网站和App,用户能够从浏览器上或A ...
- linux下docker安装部署项目(全)
一 .系统安装 基于CentOS-7-x86_64-Minimal-1708.iso安装系统 1.2. 配置系统 1.2.1 在线更新内核版本(建议更新,旧版内核会有docker BUG) 1.2 ...