一、SELECT语句
使用SELECT语句可以从表中检索一个或者多个数据列。
关键字(keyword)作为SQL组成部分的保留字。关键字不能用作表或者列的名字。

1、检索单个列
输入:SELECT prod_name
             FORM Products;

分析:上述语句利用select语句从Products表中检索一个名为prod_name的列。所需的列名在select关键字之后给出,from关键字指出从其中检索数据的表名。

SQL语句中大小写:注意在SQL语句中不区分大小写,因此都可以识别,但是为了方便调试和阅读,可以将SQL关键字写成大写,所有表和列可以使用小写。

2、检索多个列
要想从一个表中检索多个列,使用相同的SELECT语句。唯一的不同是必须在SELECT关键字后给出多个列名,列名之间必须以逗号分隔。

注意:在选择多个列时候,一定要在列名之间加上逗号,但是最后一个列名后不加。加了之后将出现错误。
输入:SELECT prod_id, prod_name, prod_price
             FROM Products;

分析:在这句当中,指定了3个列名,列名之间用逗号分隔。

3、检索所有列
除了指定所需的列外,SELECT语句还可以检索所有的列而不必逐个列出它们。这可以通过在实际列名的位置使用(*)通配符来达到。

输入:SELECT *
             FROM Products;

分析:如果给定一个通配符(*),则返回表中所有列。

二、排序检索数据
1、一般的SELECT语句查询出来的行是没有排序的,所以根据需要,可以使用ORDER BY子句对查询的数据进行排序。

输入:SELECT prod_name
      FROM Products
      ORDER BY prod_name;
 
分析:这条语句除了指示DBMS软件对prod_name列以字母顺序排序数据的ORDER BY子句外,前面语句相同,后面子句取一个或者多个列的名字,据此对输出进行排序。

2、按多个列排序
经常需要按不止一个列进行数据的排序。例如,如果要显示雇员清单,可能希望按姓和名排序(首先按姓排序,然后在每个姓中再按名排序)。如果多个雇员具有相同的姓,这样做很有用。
为了按照多个列排序,简单指定列名,列名之间用逗号隔开即可(就像选择多个列那样)

输入:SELECT prod_id,prod_price,prod_name
      FROM Products
      ORDER  BY prod_price,prod_name;

分析:首先是按照价格排序,然后是按照名称排序,如果在价格完全相同时,才会按照名称排序,要是列中所有的价格都是唯一的,哪儿不会按照名称再排序。

3、按列位置排序
除了能用列名指出排序顺序外,ORDER BY还支持按相对列位置进行排序。理解这个内容的最好办法是看下例子:

输入:SELECT prod_id,prod_price,prod_name
             FROM Products
             ORDER BY 2,3;

正如所见,这里的输出与上面的查询相同。不同之处在于ORDER BY子句。SELECT清单中指定的是选择列的相对位置而不是列名。ORDER BY 2表示按照SELECT清单中第二个列,prod_name列进行排序。ORDER BY 2,3表示先按prod_price,再按prod_name进行排序。

此项技术的主要好处在于不用重复输入列名。但它也有缺点。首先,不明确给出列名增加了错用列名排序的可能性。其次,在对SELECT清单进行更改时容易错误地对数据进行排序(忘记对ORDER BY子句做出相应的改动)。最后,如果进行排序的列不在SELECT清单中,显然不能使用这项技术。

4、指定排序方向
数据排序不限于升序排序(从A-Z)。这只是默认的排序顺序,还可以使用ORDER BY子句降序(从Z-A)顺序排序。为了进行降序排序,必须指定DESC关键字。

下面的例子按价格以降序排序产品(最贵的排在最前面)

输入:SELECT prod_id,prod_price,prod_name
             FROM Produces
             ORDER BY prod_price DESC;

要是打算用多个列排序怎么办?例子如下,只需在后面添加逗号列即可

输入:SELECT prod_id,prod_price,prod_name
             FROM Produces
             ORDER BY prod_price DESC,prod_name;

DESC关键字只应用到直接位于其前面的列名。在上例中,只对prod_price列指定DESC,对prod_name列不指定。因此,prod_price列以降序排序,而prod_name列(在每个价格内)任然按标准的升序排列。

在多个列上降序排序:如果想要在多个列上进行降序排序,必须对每个列指定DESC关键字。

三、过滤数据
1、使用WHERE子句
数据库表一般包含大量的数据,很少需要检索表中的所有行。通常只要会根据特定操作或报告的需要提取表数据的子集。只检索所需要的数据需要指定搜索条件,搜索条件也称为过滤条件。
在SELECT语句中,数据根据WHERE子句中指定的搜索 条件进行筛选。WHERE子句在表名(FROM子句)之后给出,例如:

输入:SELECT prod_name,prod_price
             FROM Products
             WHERE prod_price=3.55;

分析:语句从products表中检索两个列,但不返回所有行,只返回prod_price=3.55的行。

注意:要是同时使用ORDER BY和WHERE子句时候,应该让ORDER BY位于WHERE之后,否则将会产生错误。

2、WHERE子句操作符
我们在关于相等的测试时看到了第一个WHERE子句,它确定一个列是否包含特定的值。

检查单个值

我们已经看了测试相等的例子,现在来看看
几个使用其他操作符的例子。

输入:SELECT prod_name,prod_price
             FROM Products
             WHERE prod_price<10;

分析:列出价格小于10美元的所有产品。

输入:SELECT prod_name,prod_price
             FROM Products
             WHERE prod_price<=10;

分析:列出价格小于等于10美元的所有产品。

不匹配检查

输入:SELECT prod_id,prod_name
             FROM Products
             WHERE prod_id<>'DLL01';

分析:列出产品id不是DLL01的所有产品。

注意:引号的使用,单引号用来限定字符串。如果将值与串类型的列进行比较,则需要限定引号,用来与数值列进行比较的值不用引号。

输入:SELECT prod_id,prod_name
             FROM Products
             WHERE prod_id!='DLL01';

!=和<>通常可以互换使用。但是并非所有的DBMS都支持这两种不等于操作符。所以还得参阅相应的DBMS文档。

范围值检查

为了检查某个范围的值,可使用BETWEEN操作符。其语法与其他WHERE子句的操作符稍有不同,因为它需要两个值,即范围的开始值和结束值。

输入:SELECT prod_name,prod_price
             FROM Products
             WHERE prod_price BETWEEN 5 AND 10;

分析:两个值用AND关键字分隔。BETWEEN匹配范围中所有的值,包括指定的开始和结束值。

空值检查

在创建表时,表设计人员可以指定其中的列是否可以不包含值。在一个列不包含值时,称其为包含空值NULL。

NULL  无值(no value),它与字段包含0,空字符串或仅仅包含空格不同。

SELECT语句有一个特殊的WHERE子句,可以用来检查具有NULL值的列。就是IS NULL子句。

输入:SELECT prod_name
             FROM Products
             WHERE prod_price IS NULL;

这条语句返回没有价格(空prod_price字段,不是价格为0)的所有产品。

四、高级数据过滤

高级数据过滤主要体现在用组合WHERE子句建立功能更强的高级搜索条件。使用NOT和IN操作符。
1、组合WHERE子句
在之前使用的WHERE子句大多使用的都是单一的条件。为了进行更强的过滤控制,SQL允许给出多个WHERE子句。这些子句可以用两种方式使用,即:以AND子句的方式或者OR子句的方式使用。

操作符(operator)用来联结或改变WHERE子句中的子句的关键字。也称为逻辑操作符(logical operator)。

2、AND操作符
为了通过不知一个列进行过滤,可以使用AND操作符给WHERE子句附加条件。如:
输入:SELECT prod_id,prod_price,prod_name
             FROM Products
             WHERE vend_id='DLL01' AND prod_price<=4;

分析:此SQL语句检索由供应商DLL01制造并且价格小于等于4美元的所有产品的名称和价格。在SELECT语句中WHERE子句包含两个田间,要同时满足两个条件才可以被检索。

3、OR操作符
OR操作符与AND操作符不同,它指示数据库管理系统软件检索匹配任一条件的行。事实上,许多DBMS在OR WHERE子句的第一个条件满足的情况下,不再计算第二个条件。

输入:SELECT prod_name,prod_price
             FROM Products
             WHERE vend_id='DLL01'OR prod_price<=4;
分析:此操作语句只检索满足前一条件的DLL01的即可,要是检索出来就不再检索第二个条件。不用同时满足两个条件。

4、计算次序
WHERE可包含任意数目的AND和OR操作符。允许两者结合以进行复杂和高级的过滤。
但是,组合AND和OR带来了一个有趣的问题。为了说明这个问题,举个例子:

输入:SELECT prod_name,prod_price
             FROM Products
             WHERE vend_id='DLL01'OR prod_price<=4
                          AND prod_id='DLL12';

分析:在这里的语句中,同时有三个条件被AND和OR连接,但是AND在计算次序中有限级更高,会先计算后两个AND的组合,也就是说计算顺序错误了。解决的办法就是使用圆括号明确的分组相应的操作符。

输入:SELECT prod_name,prod_price
             FROM Products
             WHERE (vend_id='DLL01'OR prod_price<=4)
                          AND prod_id='DLL12';
因为圆括号具有较AND和OR操作符更高的计算次序。圆括号能够有效地消除歧义。

5、IN操作符
IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN取合法值得逗号分隔的清单,全都在圆括号中。下面的例子说明了这个操作符:

输入:SELECT prod_name,prod_price
          FROM Products
          WHERE vend_id IN ('DLL01','BRS01')
          ORDER BY prod_name;

分析:这句SELECT语句检索供应商DLL01和BRS01制造的所有产品。IN操作符后跟由逗号分隔的合法值清单,整个清单必须包括在圆括号中。

其优点为:
1\在使用长的合法选项清单时候,IN操作符的语法更清楚且更直观。
2\在使用IN时,计算的次序更容易管理(因为使用的操作符更少)。
3\IN操作符一般比OR操作符清单执行更快。
4\IN的最大优点是可以包含其他SELECT语句,能够更动态地建立WHERE子句。

6、NOT 操作符
WHERE子句中的NOT操作符有且只有一个功能,那就是否定它之后所跟的任何条件。因为NOT从不自己使用(它总是与其它操作符一起使用),它的语法与其它 操作符有所不同。NOT可以用在要过滤的列前,而不仅是在其后。

NOT WHERE子句中用来否定后跟条件的关键字。

输入:SELECT prod_name
             FROM Products
             WHERE NOT vend_id='DLL01'
             ORDER BY prod_name;

这里的NOT否定跟在它之后的条件,因此,DBMS不是匹配vend_id为DLL01,而是匹配非DLL01之外的其它所有东西。
同时也可以使用<>操作符来完成。

五、用通配符进行过滤

通配符(wildcard):用来匹配值的一部分的特殊字符。
搜索模式(search pattern):由字面值、通配符或者两者组合构成的搜索条件。

1、LIKE操作符
利用通配符可以创建比较特定数据的搜索模式。在这个例子中,如果要找出包含bean bag的所有产品,可以构造一个通配符搜索模式,找出产品名中任何位置出现bean bag的产品。

注意:通配符搜索只能用于文本字段(串),非文本数据类型字段不能使用通配符搜索。

2、百分号(%)通配符
最常使用的通配符是百分号(%),在搜索串中,%可以表示任何字符出现任意次数。例如:

输入:SELECT prod_id,prod_name
             FROM Products
             WHERE prod_name LIKE 'Fish%';

分析:在执行这条句子时,将检索任意以FISH起头的词。%告诉DBMS接受fish之后的任意字符,不管它有多少字符。

3、下划线(_)通配符
另一个又用的通配符是下划线(_)。下划线的用途与%一样,但下划线只匹配单个字符而不是多个字符。

输入:SELECT prod_id,prod_name
             FROM Products
             WHERE prod_name LIKE '_inch teddy bear';

与%能匹配0个字符不一样,_总是匹配一个字符,不能多也不能少。

4、方括号([])通配符
方括号([])通配符用来指定一个字符集,它必须匹配指定位置(通配符的位置)的一个字符。
例如:
输入:SELECT prod_id,prod_name
             FROM Products
             WHERE prod_name LIKE '[JM]%'
             ORDER BY prod_id;
 分析:此语句的WHERE子句中的模式为'[JM]%'。此搜索模式使用了两个不同的通配符。[JM]匹配任何以方括号中字母开头的联系人名,它只能匹配单个字符。因此,任何多于一个字符的名字都不匹配。[JM]之后的%通配符匹配第一个字符之后的任意数目的字符,返回所需的结果。

此通配符可以用前缀字符^(脱字号)来否定。例如,下面的查询匹配不以J或M开头的任意联系人
输入:SELECT prod_id,prod_name
             FROM Products
             WHERE prod_name LIKE '[^JM]%'
             ORDER BY prod_id;

数据库SQL语句检索相关相关推荐

  1. Java各类技能知识点学习链接大全:四、数据库Sql,Mysql相关

    以下内容大多是学习链接,他人整理,个人收藏以便复习,同时归纳分享出来(如有不妥,原作者可随时联系本人删除,感谢!) 四.数据库Sql,Mysql相关 1.MySQL中锁详解(行锁.表锁.页锁.悲观锁. ...

  2. 数据库SQL语句学习笔记(4)-过滤数据

    1.数据库检索要求满足特定搜索条件的行会被检索出来,搜索条件也被称作是过滤条件. 在SELECT语句中,数据更具WHERE子句进行搜索条件过滤,在FROM子句之后给出 SELECT prod_name ...

  3. 建立学生选课表 mysql 语句_学生选课数据库SQL语句45道练习题整理及mysql常用函数(20161019)...

    学生选课数据库SQL语句45道练习题: 一.            设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四 ...

  4. mysql sql exists_数据库sql语句的exists总结

    数据库sql语句的exists总结 sql exists in 学习 先来比较下语法: --deals=交易表,areas=地域表,例如香港:我们的目的:查看有交易的地域 select * from ...

  5. 计算机导论sql试题,数据库SQL语句练习题

    一.            设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表( ...

  6. 数据库三级考mysql还是sqlse_计算机三级考试数据库SQL语句整理

    计算机三级考试数据库SQL语句整理 本文是关于计算机三级考试数据库SQL语句整理,包括创建数据库.删除数据库.备份sql server.创建新表等,供同学们参考学习!想了解更多相关信息请持续关注我们应 ...

  7. 【Python之pymysql库学习】三.sql语句的相关知识(保姆级图文+实现代码)

    目录 实现效果 实现思路 实现代码 总结 欢迎关注 『Python之pymysql库学习』 系列,持续更新中 欢迎关注 『Python之pymysql库学习』 系列,持续更新中 实现效果 把给读取数据 ...

  8. 数据库SQL语句课堂总结(2)——子查询

    废话引言 我有一个梦想,有一天能跟上单大师敲sql的速度QAQ 本文数据库同数据库SQL语句课堂总结(1) 主要介绍子查询的相关语句 正文开始 子查询介绍 定义: 子查询允许把一个查询嵌套在另一个查询 ...

  9. mysql查询选课程的学生学号和姓名_数据库SQL语句中查询选修了全部课程的学生的学号和姓名理解...

    首先头脑中有三点概念: 1.EXISTS子查询找到的提交 NOTEXISTS子查询中找不到的提交 说明:不要去翻译为存在和不存在,把脑袋搞晕. 2.建立程序循环的概念,这是一个动态的查询过程.如FOR ...

最新文章

  1. C语言从51单片机led数组,51单片机之C语言-4.2数组
  2. 04 - Object-C协议与代理设计
  3. Mysql优化之开山篇
  4. python正则表达式提取电话号码_Python学习笔模式匹配与正则表达式之电话号码和Email地址提取程序...
  5. [Pyhon疫情大数据分析] 三.新闻信息抓取及词云可视化、文本聚类和LDA主题模型文本挖掘
  6. 正则表达式格式化字符串
  7. 微软亚洲研究院的“人立方”搜索
  8. 广电总局拟规定设立未成年人频道
  9. Spring-tx-PlatformTransactionManager(DataSourceTransactionManager)
  10. 【QT】QT从零入门教程(十):QT布局管理QLayout
  11. 经典调用共享变量wait()方法的实例
  12. 如何恢复出厂设置并还原Apple Silicon M1 Mac?
  13. jmeter java_Jmeter 使用-JAVA请求
  14. 明华M1读卡器操作基本方法
  15. WinRAR 曝出代码执行漏洞,你的官方中文无广告版该升级了
  16. 方法教程 | Python爬虫:爬取某易云数据并且可视化展示
  17. (二)八卦起点作家转会纵横-------- 比较全(包括JJ,起点ceo.邪月MM的发言的发言)...
  18. 5g消息服务器,5G消息开启信息服务新篇章
  19. 转转代扣“支付通道费”被“放大”背后,二手交易的命门是什么?
  20. 如何评估个人的软件开发能力

热门文章

  1. 音响功放用R型变压器有什么好处?
  2. Linux C语言调用C++动态链接库-改
  3. VoIP全球发展现状
  4. 开源运维自动化平台-opendevops
  5. DCT变换(JAVA)
  6. (js)switch
  7. @Transactional(propagation)
  8. IDEA 配置Go环境,编写Golang代码,学习笔记(一)
  9. Spring-Messaging远程代码执行漏洞复现(CVE-2018-1270)
  10. 文件服务器之一:NFS 服务器