数据库库基础05——单表查询

数据库库基础05——单表查询

一、简单SELECT 查询

语法:select [distinct]* |列名,列名 from 表[where 条件]

在处理 SQL 语句时,其中所有空格都被忽略。

SQL 语句不区分大小写 ,为了可读性更强建议区分

多条 SQL 语句必须以分号(; )分隔。 (有的数据库也可以不加,但是加上没坏处)

​ 1、检索单个列 SELECT prod_name FROM products;

​ 2、检索多个列 SELECT prod_id, prod_name, prod_price FROM products;

​ 3、检索所有列 SELECT * FROM products;

​ 4、检索不同的值(去重) SELECT DISTINCT vend_id FROM products;

​ 5、限制查询行数

SQL Server 和 Access 使用TOP 关键字:

SELECT TOP 5 prod_name FROM Products;

DB2,很可能习惯使用下面这一 DBMS 特定的 SQL 语句 :

SELECT prod_name FROM Products FETCH FIRST 5 ROWS ONLY;

Oracle,需要基于 ROWNUM(行计数器)来计算行 :

SELECT prod_name FROM Products WHERE ROWNUM <=5;

MySQLMariaDBPostgreSQL 或者 SQLite,需要使用 LIMIT子句 :

SELECT prod_name FROM Products LIMIT 5;

​ limit: 限制条数,如果是要查询指定区间的数据,比如从第2行(不包括2)开始数后面5行

SELECT * from products LIMIT 5 OFFSET 2; 表示,3,4,5,6,7 这5行的数据

提示:MySQL 和 MariaDB 捷径
MySQLMariaDB支持简化版的LIMIT 4 OFFSET 3语句,即LIMIT 3,4
​ 使用这个语法,逗号之前的值对应 OFFSET,逗号之后的值对应 LIMIT

​ 6、注释

​ 行内注释:注释使用-- (两个连字符)嵌在行内。 – 之后的文本就是注释 ;

​ 单行注释:#

​ 多行:/* */

二、单条件查询 (where关键字)

操作符 说明 操作符 说明
= 等于 > 大于
<> 不等于 >= 大于等于
!= 不等于 !> 不大于
< 小于 BETWEEN 在指定的两个值之间
< 小于等于 IS NULL 为NULL值
!< 不小于 EXISTS 是否存在满足
特定条件的记录

注意:并非所有 DBMS 都支持这些操作符

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

字符串、时间用单引号,数值不需要引号

还有:ALL 、SOME、ANY 区别如下:

All:对所有数据都满足条件,整个条件才成立 ,例如:5000大于所有返回的薪水
Any:只要有一条数据满足条件,整个条件成立,例如,5000大于薪水中的3000,10000,7000
Some的作用和Any一样 。Some是 Any的别名

select * from products where prod_price < All(—条件—)

例子:

1、(单个值比较)列出所有价格小于 10 美元的产品 :

SELECT prod_name, prod_price FROM Products WHERE prod_price < 10;

2、(不匹配)列出所有不是供应商 DLL01 制造的产品 :

SELECT vend_id,prod_name FROM products WHERE vend_id != 'DLL01';

SELECT vend_id,prod_name FROM products WHERE vend_id <> 'DLL01';

3、(Between)检索价格在 5 美元和 10美元之间的所有产品

SELECT prod_name,prod_price FROM products WHERE prod_price BETWEEN 5 AND 10;

4、(空值检查 is null)查询所有没有电子邮件地址的数据

SELECT cust_name FROM customers where cust_email IS NULL;

三、多条件查询

1、AND和OR

SELECT prod_name, prod_price FROM Products 
WHERE vend_id = 'DLL01' AND vend_id = 'BRS01';

SELECT prod_name, prod_price FROM Products 
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01';

注意: and 和or 同时用,and的优先级高于,or;;所以:任何时候使用具有 AND 和 OR 操作符的 WHERE 子句,都应该使用圆括号明确地分组操作符。

例如:比较下面两种是不一样的

SELECT prod_name, prod_price
FROM Products
WHERE (vend_id = 'DLL01' OR vend_id = 'BRS01')
AND prod_price >= 10;

SELECT prod_name, prod_price
FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01'
AND prod_price >= 10;

2、IN 操作符

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

**3、NOT 操作符 **

WHERE 子句中的 NOT 操作符有且只有一个功能,那就是否定其后所跟的任何条件。

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

四、通配符查询——LIKE操作符(术语叫谓词)

只能用于文本字段(字符串) ;区分大小写

1、百分号(%)通配符 :%表示任何字符出现任意次数 ,如查询所有以商品名以Fish开头的。。

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

还可以%abc%表示条件包含abc字符串,a%c表示条件以a开头c结尾,中间可以是任何数据

WHERE prod_name LIKE '%'不会匹配产品名称为 NULL 的行

2、下划线(_)通配符 :只匹配单个字符,而不是多个字符

SELECT prod_id, prod_name FROM Products WHERE prod_name LIKE '_ inch teddy bear';

只能匹配prod_name为 8 inch teddy bear ,因为下划线只能匹配一个字符,不能多也不能少,如果是__两个下划线就会匹配:12 inch teddy bear 和18 inch teddy bear

3、方括号([ ])通配符 (只有微软的 Access 和 SQL Server 支持集合。 )

方括号([])通配符用来指定一个字符集,它必须匹配指定位置(通配符的位置)的一个字符

关于通配符的使用:

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

五、创建计算字段

1、拼接字段

concatenate 将值联结到一起(将一个值附加到另一个值)构成单个值

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

Access 和 SQL Server 使用**+号**。

DB2、 Oracle、 PostgreSQL、 SQLite 和Open Office Base 使用**||**。

例如:

SELECT vend_name + ' (' + vend_country + ')' FROM Vendors ORDER BY vend_name;

SELECT vend_name || ' (' || vend_country || ')' FROM Vendors ORDER BY vend_name;

但是这样会有空格,需要用**RTRIM ()**去掉多余空格,修改为如下:

SELECT RTRIM(vend_name)+ ' (' + RTRIM(vend_country)+ ')' FROM Vendors ORDER BY vend_name;

SELECT RTRIM(vend_name)|| ' (' || RTRIM(vend_country)|| ')' FROM Vendors ORDER BY vend_name;

MySQL 或 MariaDB :使用**Concat()**函数,内容逗号隔开:如下

SELECT Concat(vend_name, ' (', vend_country, ')') FROM Vendors ORDER BY vend_name;

说明:TRIM 函数
大多数 DBMS 都支持 RTRIM()(正如刚才所见,它去掉字符串右边的空格)、

LTRIM()(去掉字符串左边的空格)以及

TRIM()(去掉字符串左右两边的空格)。

2、使用别名

别名(alias)是一个字段或值的替换名。别名用 AS 关键字赋予。 别名有时也称为导出列(derived column)

上面的sql可以改为如下:

	-- Sql Server
SELECT RTRIM(vend_name)+ ' (' + RTRIM(vend_country)+ ')' AS vend_title  FROM Vendors ORDER BY vend_name;
	-- Oracle
SELECT RTRIM(vend_name)|| ' (' || RTRIM(vend_country)|| ')' AS vend_title FROM Vendors ORDER BY vend_name;
	-- MySql 和MariaDB
SELECT Concat(vend_name, ' (', vend_country, ')') AS vend_title FROM Vendors ORDER BY vend_name;

这样查出的数据就可以被使用了,vend_title就是生成的计算字段,作为查询结果的别名被外部使用

提示:别名的其他用途

别名还有其他用途。常见的用途包括在实际的表列名包含不合法的字符(如空格)时重新命名它,在原来的名字含混或容易误解时扩充它。

别名最常见的使用是将多个单词的列名重命名为一个单词的名字。即:最好重命名并且可读

**3、执行算术计算 **

例如:查询货物表的数量,单价,并且计算总价

SELECT prod_id,quantity,item_price,quantity*item_price AS expanded_price FROM orderitems WHERE order_num=20008;

还支持其他操作符:

操作符 说明
+
-
*
/

SELECT语句如果省略FROM字句可以进行简单测试如: SELECT 3 * 2;将返回 6, SELECT Trim(’ abc ');
将返回 abc

六、排序检索数据

1、ORDER BY :

在指定一条 ORDER BY 子句时,应该保证它是 SELECT 语句中最后一条子句

如:SELECT prod_name FROM Products ORDER BY prod_name;

2、指定排序方向(asc 和desc,默认升序asc 可省略)

SELECT prod_name FROM Products ORDER BY prod_name;--升序
SELECT prod_name FROM Products ORDER BY prod_name DESC;--降序

3、按多个列排序

SELECT prod_id, prod_price, prod_name FROM Products ORDER BY prod_price,prod_name;
/*先按照价格排序,然后再按照商品名排序,第二个条件是在第一个条件的基础上排序的,不会改变prod_price的顺序,除非在商品价格相同的情况,prod_name才起作用*/
--换句话说,比如先按姓排序,再按照名字排序

4、按列位置排序

SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY 2, 3;
--查询结果和上面3相同,其实就是先按照第2列prod_price排序,再按照第3列prod_name排序

猜你喜欢

转载自blog.csdn.net/u011138190/article/details/84938594