关系数据库SQL之基本数据查询:子查询、分组查询、模糊查询
前言
上一篇关系数据库常用SQL语句语法大全主要是关系型数据库大体结构,本文细说一下关系型数据库查询的SQL语法。
语法回顾
SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>]…
FROM <表名或视图名>[,<表名或视图名>]…
[WHERE <条件表达式>]
[GROUP BY <列名> [HAVING <条件表达式>]]
[ORDER BY <列名> [ASC|DESC]…]
SQL查询语句的顺序:SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY。SELECT、FROM是必须的,HAVING子句只能与GROUP BY搭配使用。
准备工作
1.创建数据库和数据表
2.插入基本数据
3.本文以SQL Server为例介绍
-- 创建学生表
CREATE TABLE Students(
Id int NOT NULL PRIMARY KEY,
Name varchar(20) NOT NULL,
Class varchar(15) NOT NULL,
Gender varchar(10) NULL,
Age int NULL,
Phone varchar(15) NULL,
[Address] varchar(100) NULL
)
-- 创建课程表
CREATE TABLE Courses(
Id int NOT NULL PRIMARY KEY IDENTITY(1,1),
Name varchar(50) NOT NULL
);
-- 创建成绩表
CREATE TABLE Scores(
Id int PRIMARY KEY IDENTITY(1,1),
SId int NOT NULL,
CId int NOT NULL,
Grades decimal(5,2) NOT NULL,
IsPassed bit NOT NULL
);
-- 插入学生表基础数据
INSERT INTO Students (Id,Name,Class,Gender,Age,Phone,[Address]) VALUES(2016001,'小明','一班','男',20,'18817716611','北京');
INSERT INTO Students (Id,Name,Class,Gender,Age,Phone,[Address]) VALUES(2016002,'小龙','一班','男',19,'18817716622','天津');
INSERT INTO Students (Id,Name,Class,Gender,Age,Phone,[Address]) VALUES(2016003,'小王','二班','男',20,'18817716633','北京');
INSERT INTO Students (Id,Name,Class,Gender,Age,Phone,[Address]) VALUES(2016004,'婷婷','一班','女',17,'18817716644','济南');
INSERT INTO Students (Id,Name,Class,Gender,Age,Phone,[Address]) VALUES(2016005,'张三','一班','男',19,'18817716655','北京');
INSERT INTO Students (Id,Name,Class,Gender,Age,Phone,[Address]) VALUES(2016006,'小赵','一班','男',20,'18817716666','北京');
INSERT INTO Students (Id,Name,Class,Gender,Age,Phone,[Address]) VALUES(2016007,'丽丽','二班','女',18,'18817716677','北京');
INSERT INTO Students (Id,Name,Class,Gender,Age,Phone,[Address]) VALUES(2016008,'花花','一班','女',19,'18817716688','沈阳');
INSERT INTO Students (Id,Name,Class,Gender,Age,Phone,[Address]) VALUES(2016009,'静静','二班','女',20,'18817716699','北京');
-- 插入课程表基础数据
INSERT INTO Courses(Name) VALUES('语文');
INSERT INTO Courses(Name) VALUES('数学');
INSERT INTO Courses(Name) VALUES('英语');
-- 插入成绩表基础数据
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016001,1,120,1);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016001,2,70,0);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016001,3,89,1);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016002,1,90,1);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016002,2,88,1);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016002,3,96,1);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016003,1,112,1);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016003,3,102,1);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016004,1,80,1);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016004,2,86,1);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016004,3,47,0);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016005,1,87,1);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016005,2,96,1);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016005,3,68,0);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016006,2,95,1);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016006,3,100,1);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016007,1,87,1);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016007,2,57,0);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016007,3,130,1);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016008,1,89,1);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016008,3,66,0);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016009,1,97,1);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016009,2,104,1);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016009,3,68,1);
简单查询
简单查询只需要
SELECT
、FROM
、WHERE
3个关键字即可实现。
SELECT * FROM Students;
SELECT * FROM Students WHERE Class='一班';
SELECT * FROM Students WHERE Class='一班' AND Age = 20;
别名/更名
语法
SELECT 字段名1 [AS] 别名 [,字段名1 AS 别名]… FROM <表名>
AS可以省略
当别名中含有非字母和下划线时或者是关键字时,需要加上单/双引号
示例
SELECT Id AS '学号',Name '姓名',Class ClassName FROM Students;
子查询(嵌套查询)
子查询也称嵌套查询,是指一个
SELECT
查询语句可以嵌入另一个SELECT
查询语句之中。SQL中允许多级嵌套,子查询在实际使用中非常多。
连接查询:涉及两个及以上的表查询为连接查询。
--查询二班学生成绩
SELECT * FROM Scores WHERE SId IN(SELECT Id FROM Students WHERE Class='二班')
聚合函数查询
聚合函数:是一个值的集合为输入,返回单个值的函数。
SQL预定义了5个聚集函数:AVG(平均值)、MIN(最小值)、MAX(最大值)、SUM(求和)、COUNT(计数)。
具体的数据库还会预定义一些其他常用的函数,比如字符串相聚合函数、时间聚合函数……。
SELECT AVG(Age),MAX(Age),MIN(Age),SUM(Age),COUNT(Id) FROM Students;
分组查询
使用
GROUP BY
子句可进行分组查询
注意:分组查询的时候要在GROUP BY
子句后面跟上所有查询字段的列表
--根据班级分组查询各班平均年龄、最大 年龄、最小年龄、年龄总和、班级人数
SELECT Class,AVG(Age),MAX(Age),MIN(Age),SUM(Age),COUNT(Id) FROM Students GROUP BY Class;
HAVING子句
如果需要在分组前的数据进行限制,可以使用HAVING子句
HAVING子句只能与GROUP BY搭配使用
--根据班级分组查询各班平均年龄并且班级人数大于3人
SELECT Class,AVG(Age) FROM Students GROUP BY Class HAVING COUNT(Id)>3;
HAVING子句和WHERE的区别
WHERE语句在GROUP BY语句之前,SQL会在分组之前计算WHERE语句;
HAVING语句在GROUP BY语句之后,SQL会在分组之后计算HAVING语句。
模糊查询
语法
SELECT 字段列表 FROM 表名 WHERE 字段 LIKE '<通配符>'
模糊查询是通过关键字
LIKE
和通配符实现的
_:任何单个字符(一个'_'只匹配一个字符,多个字符就使用多个_)
%:包含零个或更多字符的任意字符串(匹配任意内容)
[]:指定范围的字符(只匹配[]内的字符)
[ ^]:不在指定范围的字符(只匹配除[]内的字符)
SQL中通配符可以混合使用
- 单个字符匹配
SELECT * FROM Students WHERE Name LIKE '小_';
SELECT * FROM Students WHERE Phone LIKE '188177166__';
- 任意字符匹配
SELECT * FROM Students WHERE Phone LIKE '188177166__';
SELECT * FROM Students WHERE Phone LIKE '%';
SELECT * FROM Students;
这三条SQL语句查询结果都相同只针对此表,原因是瞎猫碰上死耗子。(数据少,刚好查询的结果是全部的内容)
- 范围内查询
-- 查询所有手机号码结尾两位包含1和2的信息
SELECT * FROM Students WHERE Phone LIKE '188177166[12][12]';
- 不在范围内查询
-- 查询所有手机号码结尾两位不包含1、3、5、7的信息
SELECT * FROM Students WHERE Phone LIKE '188177166[^1357][^1357]';
关于SQL查询就到这里告一段落,后面会更新相关内容。
如果你觉得有问题,欢迎和你一起探讨。
关系数据库SQL之基本数据查询:子查询、分组查询、模糊查询的更多相关文章
- SQL语句中的单引号处理以及模糊查询
为了防止程序SQL语句错误以及SQL注入,单引号必须经过处理.有2种办法: 1.使用参数,比如SELECT * FROM yourTable WHERE name = @name; 在C#中使用Sql ...
- spring boot jpa 复杂查询 动态查询 连接and和or 模糊查询 分页查询
最近项目中用到了jpa,刚接触的时候有些激动,以前的到层忽然不用写sql不用去自己实现了,只是取个方法名就实现了,太惊艳了,惊为天人,但是慢慢的就发现不是这么回事了,在动态查询的时候,不知道怎么操作了 ...
- java操作elasticsearch实现前缀查询、wildcard、fuzzy模糊查询、ids查询
1.前缀查询(prefix) //prefix前缀查询 @Test public void test15() throws UnknownHostException { //1.指定es集群 clus ...
- Django:表多对多查询、聚合分组、FQ查询、事务
1表多对多的关系查询 准备工作创建表结构 from django.db import models # Create your models here. class Publisher(models. ...
- 关于SQL查询语句中的LIKE模糊查询的解释
LIKE语句的语法格式为: select * from 表名 where 字段名 like 对应值(字符串) 注:主要是针对字符型字段的,它的作用是在一个字符型字段列中检索包含对应字符串的. 下面列举 ...
- 【知识库】-数据库_MySQL之基本数据查询:子查询、分组查询、模糊查询
简书作者:seay 文章出处: 关系数据库SQL之基本数据查询:子查询.分组查询.模糊查询 回顾:[知识库]-数据库_MySQL常用SQL语句语法大全示例 Learn [已经过测试校验] 一.简单查询 ...
- 关系数据库SQL之高级数据查询:去重复、组合查询、连接查询、虚拟表
前言 接上一篇关系数据库SQL之基本数据查询:子查询.分组查询.模糊查询,主要是关系型数据库基本数据查询.包括子查询.分组查询.聚合函数查询.模糊查询,本文是介绍一下关系型数据库几种高级数据查询SQL ...
- SQL模糊查询碰到空值怎么办?
作者:iamlaosong SQL查询语句用%来做模糊查询.程序中一般要求用户输入部分信息,依据这个信息进行模糊查询. 比如用户输入340104,以下这条语句就是查询昨天客户代码为340104开头的全 ...
- SQL之in和like的连用实现范围内的模糊查询
我们知道in可以实现一个范围内的查询,like可以实现模糊查询, 如 select *where col like 123%但是我们如果有一列attri,如123,132,165... 我们想实现12 ...
随机推荐
- WPF - 属性系统 (1 of 4)
本来我希望这一系列文章能够深入讲解WPF属性系统的实现以及XAML编译器是如何使用这些依赖项属性的,并在最后分析WPF属性系统的实际实现代码.但是在编写的过程中发现对WPF属性系统代码的讲解要求之前的 ...
- [.net 面向对象程序设计进阶] (22) 团队开发利器(一)简单易用的代码管理工具VSS
[.net 面向对象程序设计进阶] (22) 团队开发利器(一)简单易用的代码管理工具VSS 本篇要点:在进阶篇快要结束的时候说说源代码管理器,我们的开发,不是一个人可以完成的事,团队协作很重要,而且 ...
- 《CLR.via.C#第三版》第二部分第8,9章节读书笔记(四)
三种类型的构造方法: 实例构造器(引用类型):实例构造器永远不能被继承(所以方法前没有修饰符):如果类的修饰符为static(sealed和abstract),编译器根本不会在类的定义中生成一个默认构 ...
- android内部培训视频_第三节 常用控件(Button,TextView,EditText,AutocompleteTextView)
第三节:常用控件 一.Button 需要掌握的属性: 1.可切换的背景 2.9.png使用 3.按钮点击事件 1) onClick 3) 匿名类 4) 公共类 二.TextView 常用属性 1.a ...
- EMC学习之电磁辐射
我们在接触新鲜事物的时候,通常习惯用自己熟悉的知识去解释自己不熟悉的事物.EMC知识更多的涉及到微波和射频,对于像我这种专注于信号完整性而 对EMC知识知之甚少的菜鸟来说,最初也只能用SI的一些基础知 ...
- Docker学习笔记
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...
- Windows下使用Dev-C++开发基于pthread.h的多线程程序
一.下载Windows版本的pthread 目前最新版本是:pthreads-w32-2-9-1-release.zip. 二.解压pthread到指定目录 我选择的目录是:E:\DEV-C ...
- 解决FragmentTabHost切换标题栏变更问题
现在都流行FragmentTabHost布局.但是所有的fragment都是共享一个actionbar,但是我们又想给每个fragment定义自定义的标题栏.百度google了好久也没有找到解决方案. ...
- angular开发者吐槽react+redux的复杂:“一个demo证明你的开发效率低下”
曾经看到一篇文章,写的是jquery开发者吐槽angular的复杂.作为一个angular开发者,我来吐槽一下react+redux的复杂. 例子 为了让大家看得舒服,我用最简单的一个demo来展示r ...
- linux管理进程的链表
linux2.6.11的内核中,为了方便管理linux的进程,主要建了5种linux链表.每个链表节点之间的互联有两种方式,一种是hash节点之间的互联,通过hlist_node的数据结构来实现:另一 ...