Sql小白入门(五)查询语句

来源:互联网 发布:合肥万户网络 编辑:程序博客网 时间:2024/06/06 03:21

    上篇文章,我们讲解了CRUD操作,其中增加(Create)、更新(Update)和删除(Delete)操作比较简单,唯独查询(Retrieve)比较复杂!上篇文章也只是简单的介绍了查询操作。所以,今天特地将复杂查询操作的相关语句整理总结。

    看过上篇文章后,我们都知道查询操作,主要使用的命令是

SELECT 列名称 FROM 表名称
或者
SELECT * FROM 表名称
    那么今天我们就要介绍的是查询的条件语句,即WHERE语句。下面开始文章!

1.WHERE。

用于有条件的从表中选取数据!

语法

SELECT 列名称 FROM 表名称 WHERE 列 运算符 值
下面的运算符可在 WHERE 子句中使用:


注释:在某些版本的 SQL 中,操作符 <> 可以写为 !=。

PS:

(1).BETWEEN

操作符BETWEEN用于寻找位于一个给定最大值和最小值之间的值,这个最大值和最小值是包含在内的。这些值可以是日期、文本和数值。

语法

SELECT column_name(s)FROM table_nameWHERE column_nameBETWEEN value1 AND value2

例如,想要查找students表中‘age’位于19到21之间的所有记录,语句该怎么写呢?思考一下哦!请看截图中的命令以及结果。


(2).IN。

IN 操作符用于把一个值与一个指定列表进行比较,当被比较的值至少与列表中的一个值想匹配时,它会返回true。

语法

SELECT column_name(s)FROM table_nameWHERE column_name IN (value1,value2,...)
例如,想要查找students表中‘age’等于19、21或22的记录,语句该怎么写呢?知道怎么写吗?请看截图中的命令以及结果。

使用操作符IN 可以得到与操作符OR一样的结果,但它的速度更快。

(3).LIKE。

LIKE 操作符利用通配符把一个值与类似的值进行比较,通配符有两个:

百分号(%)和下划线(_)。

百分号代表零个、一个或多个字符,下划线代表一个数字或字符。这些符号可以复合使用。
例如下面演示的查询语句,




事例:

(1).想要查询students表中‘age’大于20的所有记录,那么查询语句如何写呢?

select * from students where age>20;
最终结果如下所示,


(2).想要查询students表中'sex'为‘nan’的所有记录,那么查询语句如何写呢?

select * from students where sex='nan';
最终结果如下所示,


PS:引号的使用

SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)。如果是数值,请不要使用引号。

2.复杂语句。

(1).AND 和 OR 运算符。

AND 和 OR 运算符用于基于一个以上的条件对记录进行过滤。

AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来。
如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。
如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录。

事例:

想要查询students表中'sname'等于‘zhangsan’并且'sex'为‘nan’的记录,那么查询语句如何写呢?

select * from students where sname='zhangsan' and sex='nan';

结果如图所示,


想要查询students表中'sname'等于‘zhangsan’或者'sname'为‘wangwu’的记录,那么查询语句如何写呢?

select * from students where sname='zhangsan' and sname='wangwu';

结果如图所示,


(2).ORDER BY

ORDER BY 语句用于根据指定的列对结果集进行排序。
ORDER BY 语句默认按照升序对记录进行排序。如果对输出为字符的结果进行排序,升序就是A到Z的次序,降序是以Z到A的次序,显示字符结果。对于数字值来说,升序是从1到9,降序是从9到1。
如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。

事例:

想要查询出来的结果按照‘age’升序排序,要输入什么语句呢?

select * from studnets order by age  ;
查询结果如下图所示,


想要查询出来的结果按照‘age’降序排序,要输入什么语句呢?

select * from studnets order by age desc ;
查询结果如下图所示,


(3).GROUP BY 。

语句用于结合合计函数,根据一个或多个列对结果集进行分组。

语法

SELECT column_name, aggregate_function(column_name)FROM table_nameWHERE column_name operator valueGROUP BY column_name

(4).HAVING 子句。

SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。

语法

SELECT column_name, aggregate_function(column_name)FROM table_nameWHERE column_name operator valueGROUP BY column_nameHAVING aggregate_function(column_name) operator value

3.常用函数。

(1).count()。

count()函数用来完成统计工作!

语法如下:

select count(*) from table_name;

count()函数使用一对圆括号来指定目标字段,或是一个星号表示统计表里的全部记录。

PS: 如果被统计的字段是 not null(必前字段),那么其值得数量就与表里记录的数量相同,但一般来说,我们使用count(*)来统计表里的记录数量。

事例:统计表里一共有几条记录,语句如下所示:

select count(*) from students;

结果运行如下,


(2).SUM()。

SUM()函数返回一组记录中某一个字段值得总和。它可以与distinct一起使用。

语法

SELECT SUM(column_name) FROM table_name

PS:SUM()函数所处理的字段类型必须是数值型的,不能是其他类型。

(3).AVG()。

AVG()可以计算一组知道记录的平均值。AVG()返回数值列的平均值。NULL 值不包括在计算中。

语法

SELECT AVG(column_name) FROM table_name

事例,统计表中学生的平均年龄,


(4).MAX()。

MAX ()返回一列中的最大值。NULL 值不包括在计算中。

语法

SELECT MAX(column_name) FROM table_name

事例,统计表中学生的最大年龄,


(5).MIN()。

MIN 函数返回一列中的最小值。NULL 值不包括在计算中。
语法

SELECT MIN(column_name) FROM table_name
事例,统计表中学生的最小年龄,


PS:注释:MIN 和 MAX 也可用于文本列,以获得按字母顺序排列的最高或最低值。

(6).FIRST()。

FIRST() 返回指定的字段中第一个记录的值。
提示:可使用 ORDER BY 语句对记录进行排序。

语法

SELECT FIRST(column_name) FROM table_name
(7).LAST() 。
LAST() 返回指定的字段中最后一个记录的值。
提示:可使用 ORDER BY 语句对记录进行排序。

语法

SELECT LAST(column_name) FROM table_name

4.小结。

本篇文章罗列了查询语句中经常出现的语句。当然还有其他的语句,由于时间仓促,没有罗列完,请谅解!

PS:

SQL 的语法并不按照语法顺序执行
SQL 语句有一个让大部分人都感到困惑的特性,就是:SQL 语句的执行顺序跟其语句的语法顺序并不一致。SQL 语句的语法顺序是:
SELECT[DISTINCT]
FROM
WHERE
GROUP BY
HAVING
UNION
ORDER BY
为了方便理解,上面并没有把所有的 SQL 语法结构都列出来,但是已经足以说明 SQL 语句的语法顺序和其执行顺序完全不一样,就以上述语句为例,其执行顺序为:
FROM
WHERE
GROUP BY
HAVING
SELECT
DISTINCT
UNION
ORDER BY
关于 SQL 语句的执行顺序,有三个值得我们注意的地方:

1、 FROM 才是 SQL 语句执行的第一步,并非 SELECT 。数据库在执行 SQL 语句的第一步是将数据从硬盘加载到数据缓冲区中,以便对这些数据进行操作。(译者注:原文为“The first thing that happens is loading data from the disk into memory, in order to operate on such data.”,但是并非如此,以 Oracle 等常用数据库为例,数据是从硬盘中抽取到数据缓冲区中进行操作。)
2、 SELECT 是在大部分语句执行了之后才执行的,严格的说是在 FROM 和 GROUP BY 之后执行的。理解这一点是非常重要的,这就是你不能在 WHERE 中使用在 SELECT 中设定别名的字段作为判断条件的原因。

SELECT A.x + A.y AS zFROM AWHERE z = 10 -- z 在此处不可用,因为SELECT是最后执行的语句!

如果你想重用别名z,你有两个选择。要么就重新写一遍 z 所代表的表达式:

SELECT A.x + A.y AS zFROM AWHERE (A.x + A.y) = 10

…或者求助于衍生表、通用数据表达式或者视图,以避免别名重用。请看下文中的例子。

3、 无论在语法上还是在执行顺序上, UNION 总是排在在 ORDER BY 之前。很多人认为每个 UNION 段都能使用 ORDER BY 排序,但是根据 SQL 语言标准和各个数据库 SQL 的执行差异来看,这并不是真的。尽管某些数据库允许 SQL 语句对子查询(subqueries)或者派生表(derived tables)进行排序,但是这并不说明这个排序在 UNION 操作过后仍保持排序后的顺序。
注意:并非所有的数据库对 SQL 语句使用相同的解析方式。如 MySQL、PostgreSQL和 SQLite 中就不会按照上面第二点中所说的方式执行。

既然并不是所有的数据库都按照上述方式执行 SQL 预计,那我们的收获是什么?我们的收获是永远要记得: SQL 语句的语法顺序和其执行顺序并不一致,这样我们就能避免一般性的错误。如果你能记住 SQL 语句语法顺序和执行顺序的差异,你就能很容易的理解一些很常见的 SQL 问题。
当然,如果一种语言被设计成语法顺序直接反应其语句的执行顺序,那么这种语言对程序员是十分友好的,这种编程语言层面的设计理念已经被微软应用到了 LINQ 语言中。




0 0
原创粉丝点击