数据库库基础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;
MySQL、MariaDB、PostgreSQL 或者 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 捷径
MySQL和 MariaDB支持简化版的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排序