DQL ( Data Query Language) 是数据查询语言,如 Select 语句
#### 一、DQL 语法

```sql
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}];
# 指定查询的记录从哪条至哪条
```
其中 [ ] 中的内容为可选,{ } 中的内容为必填

##### 1、指定查询字段
在查询表的时候,可以指定查询结果是数据列,如果查询表中是所有数据列用 “ <b>*</b> ”表示。如:
`SELECT * FROM student;`
代表查询 student 表中是所有数据 ,但是这种方法效率比较低,不推荐。

```sql
# 查询指定列(学号,姓名)
SELECT studentno,studentname FROM student;
```
##### 2、As子句作为别名
As 的作用有一下几点:
1. 给数据列取一个新名字
2. 给表取一个新名字
3. 可以把计算后的结果用另一个新的名称来代替

==注==:AS 关键字可以省略

```sql
# 这里是为列取别名
SELECT studentno AS 学号,studentname AS 姓名 FROM student;

# 使用as也可以为表取别名
SELECT studentno AS 学号,studentname AS 姓名 FROM student AS s;

# 使用as,为查询结果取一个新名字
# CONCAT()函数拼接字符串
SELECT CONCAT('姓名:',studentname) AS 新姓名 FROM student;
```
##### 3、DISTINCT关键字
DISTINCT 关键字的作用就是去掉查询结果中重复的记录,

```sql
# 查看哪些同学参加了考试(学号)--去除重复项
SELECT * FROM result; # 查看考试成绩
SELECT studentno FROM result; # 查看哪些同学参加了考试
SELECT DISTINCT studentno FROM result;
# 了解:DISTINCT 去除重复项 , (默认是ALL)
```
应用场景 :

1. SELECT语句返回结果列中使用
2. SELECT语句中的ORDER BY , HAVING等子句中使用
3. DML语句中的where条件语句中使用表达式

##### 4、where 条件语句
where 条件语句用于检索符合条件的记录,搜索条件一般由一个或多个逻辑表达式组成,结果一般为真或假。逻辑操作符如下表所示:
|操作符| 语法 |描述
|--|--|--|
| AND 或 && | a AND b 或 a && b |逻辑与,同为真结果才为真
|OR 或 \| \||a OR b 或 a \|\| b|逻辑或,只要一个为真结果就为真
|NOT 或 ! |NOT a 或 ! a|逻辑非,若操作数为假,则结果为真
实例 1:查询学生考试成绩在 95-100 之间的

```sql
SELECT Studentno,StudentResult
FROM result
WHERE StudentResult>=95 AND StudentResult<=100;
```
实例 2:查询除了 10号 同学,其他同学的成绩

```sql
SELECT studentno,studentresult
FROM result
WHERE studentno!=10;
```
### 二、模糊查询
比较操作符用来进行模糊查询,比较操作符如下表所示:
|操作符| 语法 |描述|
|--|--|--|
| IS NULL |a IS NULL | 若操作符为 NULL 则结果为真
|IS NOT NULL| a IS NOT NULL|若操作符不为 NULL ,则结果为真
|BETWEEB|a BETWEEN b AND c|若 a 在范围 b 与 c 之间,则结果为真
| LIKE| a LIKE b|SQL 匹配模式,若 a 匹配 b 则结果为真
|IN|a IN (a1,a2,...)|若 a 等于 a1 ,a2 其中一个,则结果为真
##### 1、LIKE 操作符 实例演示,代码如下:

```sql
#查询姓李的同学的学号及姓名

#like结合使用的通配符 : % (代表0到任意个字符) _ (一个字符)
SELECT studentno,studentname FROM student
WHERE studentname LIKE '李%';

#查询姓李的同学,后面只有一个字的
SELECT studentno,studentname FROM student
WHERE studentname LIKE '李_';

#查询姓李的同学,后面只有两个字的
SELECT studentno,studentname FROM student
WHERE studentname LIKE '李__';

#查询姓名中含有 “静” 字的
SELECT studentno,studentname FROM student
WHERE studentname LIKE '%静%';
```
##### 2、IN 操作符,代码演示如下:

```sql
#查询学号为1000,1001,1002的学生姓名
SELECT studentno,studentname FROM student
WHERE studentno IN (1000,1001,1002);

#查询地址在北京,南京,河南洛阳的学生
SELECT studentno,studentname,address FROM student
WHERE address IN ('北京','南京','河南洛阳');
```
##### 3、NULL 操作符,代码演示如下:

```sql
#查询出生日期没有填写的同学
#不能直接写=NULL , 这是代表错误的 , 用 is null
SELECT studentname FROM student
WHERE BornDate IS NULL;

#查询出生日期填写的同学
SELECT studentname FROM student
WHERE BornDate IS NOT NULL;

#查询没有写家庭住址的同学(空字符串不等于null)
SELECT studentname FROM student
WHERE Address='' OR Address IS NULL;
```
### 三、连接查询
如需要多张数据表的数据进行查询,则可通过连接运算符实现多个查询,

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190719203344976.png?#pic_center)
join 的不同用法
##### 1、内连接 inner join
内连接查询的结果为两个表中结果集的交集,两个表根据共同 ID 进行逐条匹配 ,效率较高,代码演示为

```sql
/*思路:
(1):分析需求,确定查询的列来源于两个表,student result,连接查询
(2):确定使用哪种连接查询?(内连接)
*/
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
```
##### 2、外连接
外连接分为左外连接,右外连接。
1. ==左外连接 left join==
(以左表作为基准,右边表来一一匹配,匹配不上的,返回左表的记录,右表以NULL填充)
2. ==右外连接 right join==
(以右表作为基准,左边表来一一匹配,匹配不上的,返回右表的记录,左表以NULL填充)

##### 3、等值连接
&emsp;&emsp;等值连接的时候2个表会先进行笛卡尔乘积运算,生成一个新表格,占据在电脑内存里,当表的数据量很大时,很耗内存,这种方法效率比较低,尽量不用,代码演示

```sql
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s , result r
WHERE r.studentno = s.studentno
```
##### 4、自连接
自连接是数据表与自身连接,实例演示:

```sql
/*
需求:从一个包含栏目ID , 栏目名称和父栏目ID的表中
查询父栏目名称和其他子栏目名称
*/

# 创建一个表
CREATE TABLE `category` (
`categoryid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主题id',
`pid` INT(10) NOT NULL COMMENT '父id',
`categoryName` VARCHAR(50) NOT NULL COMMENT '主题名字',
PRIMARY KEY (`categoryid`)
) ENGINE=INNODB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8

# 插入数据
INSERT INTO `category` (`categoryid`, `pid`, `categoryName`)
VALUES('2','1','信息技术'),
('3','1','软件开发'),
('4','3','数据库'),
('5','1','美术设计'),
('6','3','web开发'),
('7','5','ps技术'),
('8','2','办公信息');
# 编写SQL语句,将栏目的父子关系呈现出来 (父栏目名称,子栏目名称)
# 核心思想:把一张表看成两张一模一样的表,然后将这两张表连接查询(自连接)

SELECT a.categoryName AS '父栏目',b.categoryName AS '子栏目'
FROM category AS a,category AS b
WHERE a.`categoryid`=b.`pid`
```
### 四、排序和分页
##### 1、排序 ORDER BY

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

实例 1:查询 数据库结构 的所有考试结果(学号 学生姓名 科目名称 成绩),代码如下:

```sql
# 按成绩降序排序
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
```
##### 2、分页
语法:`SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset`

分页的好处是:
1. 可以减少查询压力,
2. 减低宽带使用,提高访问速度
3. 用户体验比较好

演示代码如下:
```sql
# 每页显示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='数据库结构'
ORDER BY StudentResult DESC , studentno
LIMIT 0,5
```

```sql
#查询 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
```

==推导==

```sql
推导:
第一页 : limit 0,5
第二页 : limit 5,5
第三页 : limit 10,5
......
第N页 : limit (pageNo-1)*pageSzie,pageSzie
[pageNo:页码,pageSize:单页面显示条数]
```
### 五、子查询
子查询 就是
* 在查询语句中的WHERE条件子句中,又嵌套了另一个查询语句
* 嵌套查询可由多个子查询组成,求解的方式是由里及外;
* 子查询返回的结果一般都是集合,故而建议使用IN关键字;

实例代码演示:

```sql
# 查询 数据库结构-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;

```

使用DQL查询数据库的更多相关文章

  1. mysql学习【第3篇】:使用DQL查询数据

    狂神声明 : 文章均为自己的学习笔记 , 转载一定注明出处 ; 编辑不易 , 防君子不防小人~共勉 ! mysql学习[第3篇]:使用DQL查询数据 DQL语言 DQL( Data Query Lan ...

  2. MySQL学习04(DQL查询)

    DQL查询 DQL语言 DQL( Data Query Language 数据查询语言 ) 查询数据库数据 , 如SELECT语句 简单的单表查询或多表的复杂查询和嵌套查询 是数据库语言中最核心,最重 ...

  3. SQL Server中查询数据库及表的信息语句

    /* -- 本文件主要是汇总了 Microsoft SQL Server 中有关数据库与表的相关信息查询语句. -- 下面的查询语句中一般给出两种查询方法, -- A方法访问系统表,适应于SQL 20 ...

  4. SQL查询数据库中所有指定类型的字段名称和所在的表名

    --查询数据库中所有指定类型的字段名称和所在的表名 --eg: 下面查的是当前数据库中 所有字段类型为 nvarchar(max) 的字段名和表名 SELECT cols.object_id , co ...

  5. MySql 查询数据库中所有表名

    查询数据库中所有表名select table_name from information_schema.tables where table_schema='csdb' and table_type= ...

  6. ArcGIS Javascript查询数据库并添加到地图上

    将数据存放到数据库中,动态的调取比较灵活,数据变动后不需要改变图层的属性表. 此处采用的方法是通过jquery查询数据库,并将数据库的结果生产json串返回给js,在js中动态解析json串增加点至地 ...

  7. 【mysql元数据库】使用information_schema.tables查询数据库和数据表信息

    概述 对于mysql和Infobright等数据库,information_schema数据库中的表都是只读的,不能进行更新.删除和插入等操作,也不能加触发器,因为它们实际只是一个视图,不是基本表,没 ...

  8. SQLSERVER | 查询数据库中所有的表的名字 | 查询数据库中的所有数据库名

    SQLSERVER 1.查询某个数据库中所有的表名:  SELECT Name FROM SysObjects Where XType='U' ORDER BY Name 2.查询数据库中的所有数据库 ...

  9. Java 通过JDBC查询数据库表结构(字段名称,类型,长度等)

    Java 通过JDBC查询数据库表结构(字段名称,类型,长度等) 发布者:唛唛家的豆子   时间:2012-11-20 17:54:02   Java 通过JDBC查询数据库表结构(字段名称,类型,长 ...

随机推荐

  1. 向github提交本地项目

    首先你需要一个github账号,所有还没有的话先去注册吧! https://github.com/ 我们使用git需要先安装git工具,这里给出下载地址,下载后一路直接安装即可: https://gi ...

  2. VC 调用 MinGW 生成的dll good

    首先,如果dll 中导出了C++的类,那么就不要折腾了.不同的编译器编译出来的C++代码是不保证通用的.如果dll中只是一些C 函数,那么是可以互相调用的. MinGW 生成dll时即使生成了 .a  ...

  3. vista下开机启动 简单绕过UAC的方法(自己使用runas参数重新启动自己,有点意思)

    背景      vista下,如果不开启UAC,那就没有我下面要说的问题了,呵呵.下面说的都是在vista开启UAC的前提下说的,win7也适用.      在vista下,系统开启了UAC,如果你的 ...

  4. C++大小写转换和性能(C语言,C++,API,STL一共4种方法)

    大小写转换和性能 前言 本文主要讨论最基本的一些大小写转换函数和API,不讨论一些常见的字符串程序库里面的大小写转换接口,另外本文的落脚点是这些转换函数的性能和日常开发中遇到的一些问题. 不考虑范围 ...

  5. JavaScript MVC框架PK:Angular、Backbone、CanJS与Ember(转载)

    原文地址:http://sporto.github.io/.../comparison-angular-backbone-can-ember/ 原文作者:Sebastian Porto @Twitte ...

  6. asp.net mvc下实现微信公众号(JsApi)支付介绍

    本文主要讲解asp.net mvc框架下公众号支付如何实现,公众号支付主要包括三个核心代码,前台调起支付js代码.对应js调用参数参数生成代码.支付成功处理代码. 一.微信支付方式介绍 微信提供了各种 ...

  7. 深入理解Java G1垃圾收集器

    本文首先简单介绍了垃圾收集的常见方式,然后再分析了G1收集器的收集原理,相比其他垃圾收集器的优势,最后给出了一些调优实践. 一,什么是垃圾回收 首先,在了解G1之前,我们需要清楚的知道,垃圾回收是什么 ...

  8. 对新数据库使用 Code First

    如果使用的是 Visual Studio 2010,还需要安装 Nuget 1.创建应用程序 简单起见,我们将构建一个使用 Code First 执行数据访问的基本控制台应用程序. 打开 Visual ...

  9. Hadoop 三剑客之 —— 集群资源管理器 YARN

    一.hadoop yarn 简介 二.YARN架构         1. ResourceManager         2. NodeManager         3. ApplicationMa ...

  10. windows pyspider WEB显示框太小解决方法

    环境:windows7 + chrome + pyspider 解决方法: WEB预览框过小的原因在于页面元素的css属性height被替换为60px: CSS文件所在地方:C:\Users\Admi ...