SQL-基础学习3--通配符:LIKE,%,(_); 拼接:+,||,concat;

第六课 用通配符进行过滤

6.1  LIKE操作符

通配符本身实际上是SQL的WHERE子句中有特殊含义的字符,SQL支持几种通配符。为在搜索子句中使用通配符,必须使用LIKE操作符。LIKE指示DBMS,后跟的搜索模式利用通配符匹配而不是简单的相等匹配进行比较。

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

6.1.1 百分号(%)通配符

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

例如,为了找出所有以词Fish起头的产品,可发布以下SELECT语句:

输入▼
SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE ‘Fish%‘;

输出▼
prod_id     prod_name
-------     ------------------
BNBG01      Fish bean bag toy

分析▼

此例子使用了搜索模式‘Fish%‘。在执行这条子句时,将检索任意以Fish起头的词。%告诉DBMS接受Fish之后的任意字符,不管它有多少字符。

注意:通配符可在搜索模式中的任意位置使用,并且可以使用多个通配符。

特别注意:除了能匹配一个或多个字符外,%还能匹配0个字符。%代表搜索模式中给定位置的0个、1个或多个字符。

说明:请注意后面所跟的空格

包括Access在内的许多DBMS都用空格来填补字段的内容。例如,如果某列有50个字符,而存储的文本为Fish bean bag toy(17个字符),则为填满该列需要在文本后附加33个空格。这样做一般对数据及其使用没有影响,但是可能对上述SQL语句有负面影响。子句WHERE prod_name LIKE ‘F%y‘只匹配以F开头、以y结尾的prod_name。如果值后面跟空格,则不是以y结尾,所以Fish bean bag toy就不会检索出来。简单的解决办法是给搜索模式再增加一个%号:‘F%y%‘还匹配y之后的字符(或空格)。更好的解决办法是用函数去掉空格。请参阅第8课。

警告:请注意NULL

通配符%看起来像是可以匹配任何东西,但有个例外,这就是NULL。子句WHERE prod_name LIKE ‘%‘不会匹配产品名称为NULL的行。

6.1.2 下划线(_)通配符

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

说明:DB2通配符

DB2不支持通配符_。

说明:Access通配符

如果使用的是Microsoft Access,需要使用?而不是_。

6.1.3 方括号([ ])通配符

方括号([])通配符用来指定一个字符集,它必须匹配指定位置(通配符的位置)的一个字符。但是MySQL是不支持方括号通配符的;那么可以使用AND, OR逻辑操作符来实现;

例如:找出所有名字以J或者M起头的联系人,可进行如下查询:

输入▼
SELECT cust_contact
FROM Customers
WHERE cust_contact LIKE ‘J%‘ OR cust_contact LIKE ‘M%‘
ORDER BY cust_contact;

输出▼
cust_contact
-----------------
Jim Jones
John Smith
Michelle Green

注意:使用AND , OR 等逻辑操作符时,后面要接完整的条件语句,而不能和前面共用列名,或者其他字符;

如上面 WHERE 语句写成:WHERE cust_contact LIKE ‘J%‘ OR ‘M%‘ 或者 WHERE cust_contact LIKE ‘J%‘ OR LIKE ‘M%‘ 都是错误的;

 

6.2 使用通配符的技巧

使用通配符是有代价的,即通配符搜索一般比前面讨论的其他搜索要耗费更长的处理时间。这里给出一些使用通配符时要记住的技巧:

  • 不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符。
  • 在确实需要使用通配符时,也尽量不要把它们用在搜索模式的开始处。把通配符置于开始处,搜索起来是最慢的。
  • 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据。

 

第七课 创建计算字段

7.1 计算字段

存储在数据库表中的数据一般不是应用程序所需要的格式,下面举几个例子。

  • 需要显示公司名,同时还需要显示公司的地址,但这两个信息存储在不同的表列中。
  • 城市、州和邮政编码存储在不同的列中(应该这样),但邮件标签打印程序需要把它们作为一个有恰当格式的字段检索出来。
  • 列数据是大小写混合的,但报表程序需要把所有数据按大写表示出来。
  • 物品订单表存储物品的价格和数量,不存储每个物品的总价格(用价格乘以数量即可)。但为打印发票,需要物品的总价格。
  • 需要根据表数据进行诸如总数、平均数的计算。

在上述每个例子中,存储在表中的数据都不是应用程序所需要的。我们需要直接从数据库中检索出转换、计算或格式化过的数据,而不是检索出数据,然后再在客户端应用程序中重新格式化。

这就是计算字段可以派上用场的地方了。与前几课介绍的列不同,计算字段并不实际存在于数据库表中。计算字段是运行时在SELECT语句内创建的。

字段(field)

基本上与列(column)的意思相同,经常互换使用,不过数据库列一般称为列,而术语字段通常与计算字段一起使用。

特别注意:只有数据库知道SELECT语句中哪些列是实际的表列,哪些列是计算字段。从客户端(如应用程序)来看,计算字段的数据与其他列的数据的返回方式相同。

 

7.2 拼接字段

在SQL中的SELECT语句中,可使用一个特殊的操作符来拼接两个列。根据你所使用的DBMS,此操作符可用加号(+)或两个竖杠(||)表示。在MySQL和MariaDB中,必须使用特殊的函数。

说明:是+还是||?

Access和SQL Server使用+号。DB2、Oracle、PostgreSQL、SQLite和Open Office Base使用||。详细请参阅具体的DBMS文档。

下面是使用加号的例子(多数DBMS使用这种语法):

输入▼
SELECT vend_name + ‘ (‘ + vend_country + ‘)‘
FROM Vendors
ORDER BY vend_name;
输出▼
-----------------------------------------------------------
Bear Emporium                                (USA        )
Bears R Us                                   (USA        )
Doll House Inc.                              (USA        )
Fun and Games                                (England    )
Furball Inc.                                 (USA        )
Jouets et ours                               (France     )

分析▼

上面两个SELECT语句拼接以下元素:

存储在vend_name列中的名字;

包含一个空格和一个左圆括号的

存储在vend_country列中的国家;

包含一个右圆括号的字符串。

从上述输出中可以看到,SELECT语句返回包含上述四个元素的一个列(计算字段)。

再看看上述SELECT语句返回的输出。结合成一个计算字段的两个列用空格填充。许多数据库(不是所有)保存填充为列宽的文本值,而实际上你要的结果不需要这些空格。为正确返回格式化的数据,必须去掉这些空格。这可以使用SQL的RTRIM()函数来完成,如下所示:

输入▼
SELECT RTRIM(vend_name) + ‘ (‘ + RTRIM(vend_country) + ‘)‘
FROM Vendors
ORDER BY vend_name;
输出▼
-----------------------------------------------------------
Bear Emporium (USA)
Bears R Us (USA)
Doll House Inc. (USA)
Fun and Games (England)
Furball Inc. (USA)
Jouets et ours (France) 

分析▼

RTRIM()函数去掉值右边的所有空格。通过使用RTRIM(),各个列都进行了整理。

使用别名

从前面的输出可以看到,SELECT语句可以很好地拼接地址字段。但是,这个新计算列的名字是什么呢?实际上它没有名字,它只是一个值。如果仅在SQL查询工具中查看一下结果,这样没有什么不好。但是,一个未命名的列不能用于客户端应用中,因为客户端没有办法引用它。

为了解决这个问题,SQL支持列别名。别名(alias)是一个字段或值的替换名。别名用AS关键字赋予。请看下面的SELECT语句:

输入▼
SELECT RTRIM(vend_name) + ‘ (‘ + RTRIM(vend_country) + ‘)‘
       AS vend_title
FROM Vendors
ORDER BY vend_name;
输出▼
vend_title
-----------------------------------------------------------
Bear Emporium (USA)
Bears R Us (USA)
Doll House Inc. (USA)
Fun and Games (England)
Furball Inc. (USA)
Jouets et ours (France)

下面是MySQL和MariaDB中使用的语句:

输入▼
SELECT Concat(vend_name, ‘ (‘, vend_country, ‘)‘)
       AS vend_title
FROM Vendors
ORDER BY vend_name;

7.3 执行算术计算

Orders表包含收到的所有订单,OrderItems表包含每个订单中的各项物品。下面的SQL语句检索订单号20008中的所有物品:

输入▼
SELECT prod_id, quantity, item_price
FROM OrderItems
WHERE order_num = 20008;
输出▼
prod_id        quantity        item_price
----------     -----------     ---------------------
RGAN01         5               4.9900
BR03              5               11.9900
BNBG01         10              3.4900
BNBG02         10              3.4900
BNBG03         10              3.4900

item_price列包含订单中每项物品的单价。如下汇总物品的价格(单价乘以订购数量):

输入▼
SELECT prod_id,
       quantity,
       item_price,
       quantity*item_price AS expanded_price
FROM OrderItems
WHERE order_num = 20008;
输出▼
prod_id        quantity        item_price       expanded_price
----------     -----------     ------------     -----------------
RGAN01         5               4.9900           24.9500
BR03              5               11.9900          59.9500
BNBG01         10              3.4900           34.9000
BNBG02         10              3.4900           34.9000
BNBG03         10              3.4900           34.9000

分析▼

输出中显示的expanded_price列是一个计算字段,此计算为quantity*item_price。客户端应用现在可以使用这个新计算列,就像使用其他列一样。

时间: 2024-08-04 21:33:06

SQL-基础学习3--通配符:LIKE,%,(_); 拼接:+,||,concat;的相关文章

Oralce菜鸟学习之 通配符%和_的使用

首发:http://www.arppinging.com/wordpress/?p=104 Oralce菜鸟学习之 通配符%和_的使用 1.% 在Oracle中,%表示匹配所有,使用通配符前要使用like SQL> select * from student where sname like 'Z%'; SNO SNAME SAGE ---------- ------------------------------ ---------- 1 ZhangSan 21 4 ZhaoYun 24 SQ

SQL基础学习_05_函数、谓词、CASE表达式

函数 算术函数 1. 四则运算: +.-.*./? 2. ABS:求绝对值, ABS(数值) 3. MOD: 求余,MOD(被除数,除数) 4. ROUND:四舍五入,ROUND(对象数值,保留小数的位数) 字符串函数 1. 字符串拼接: ||, str1 || str2 || str3 || - || strn ?AS str_all 2. 字符串长度:LENGTH,LENGTH(str1) AS len_str1 3. 小写转换:LOWER,LOWER(str1) AS low_str 4.

sql基础学习

学习参考网站:http://www.runoob.com/sql/sql-tutorial.html 一.SQL命令 1.SELECT 语句 用于从数据库中选取数据. select column_name,column_name from table_name; #数据库中选取某个表格某几列数据 select * from table_name; #数据库中选取某个表格所有列数据 2.SELECT DISTINCT 语句 用于返回唯一不同的值. select distinct column_na

SQL基础学习_04_视图

视图 1. 视图的创建 ? ? 视图就是保存好的SELECT语句,这些SELECT语句执行之后会产生新的表,所以在SQL中,视图和表是不做差别对待的,也就是SQL也可以对视图做一些操作: ? ? 由于视图并不实际保存数据,只是保存了执行的SELECT语句,可以节约存储空间,但是对于大数据量的存储,使用视图来频繁操作的话,势必会占用较大的计算时间,也算是一种用时间换空间的方案. ? ? 通过以下语句创建视图: ? ? CREATE VIEW 视图名称 (<视图列1>,<视图列2>,&

SQL 基础学习: 和深度学习资料

SQL is a standard language for storing, manipulating and retrieving data in databasee. 关系型数据库:RDBMS(Relational Database Mangement System) SQLite3: Rails默认的轻量级数据库,集成于Rails中,在db/development.sqlite3这个档案中. 用途:单机用途.所以在实际部署的时候会换成MySQL等数据库服务器. MySQL: 目前流行的开

SQL基础学习笔记(三)—约束

约束: 一.创建表时,定义约束 create table emp2( id number(10) constraint emp2_id_nn not null, name varchar2(20) not null, salary number(10,2) ) constraint emp2_id_nn 给约束起个名增加阅读性,不写也行,会自动加上sys_XXXX 作用范围: ①列级约束只能作用在一个列上 ②表级约束可以作用在多个列上(当然表级约束也可以作用在一个列上) 定义方式:列约束必须跟在

SQL基础知识--多行查询结果拼接

今天在工作中遇到如下这个问题,需要将如下的查询结果,拼接成一行! 1 select PERSON_NAME from S_PROJECT_MEMBER where PROJECT_ID = '2c9081473e2f8bda013e3028e4700049'; 先直接上代码吧!-------------------------有问题的,麻烦指出-------------------------------------------------------- select CAST(stuff((

SQL基础学习笔记(一)

感觉SQL,学的云里雾里的,整理一下笔记吧. SQL语言分为三种: DML: Data Manipulation Language 数据操纵语言 DDL:  Data Definition Language 数据定义语言 DCL:  Data Control Language 数据控制语言 select * (表示查询表中所有的列 ) from employees; select employee_id , last_name,email from employees;(查询指定) SELECT

SQL基础学习笔记(二)

向表中插入一条数据 <span style="font-family:KaiTi_GB2312;font-size:18px;"><strong>create table emp1 as select employee_id , last_name , hire_date , salary from employees where 1 = 2</strong></span> 需要注意的是,插入的数据,必须和表中数据种类,一一对应 <

SQL基础学习_03_数据更新

数据的插入 1. 基本INSERT语句 ? ? INSERT的基本语法为: ? ? INSERT INTO ?<表名> (列1, 列2, 列3, ?-) VALUES (值1, 值2, 值3, -)??; ? ? 例如:INSERT INTO Shohin (shohin_mei,shohin_bunrui,hanbai_tanka,shiire_tanka,torokubi) VALUES ('pen','office',100,NULL,'2009-11-11'); ? ? 如果插入的是所