挺久之前学习sql语句的时候记录下来的,记得学习的资料是sql必知必会(其实后来又有去看了一遍mysql必知必会,发现很大程度上都忘了,所以学习的时候写下笔记还是很重要的,复习的时候会更快)
查询语句
简单的查询
查询单列
select 列名 from 表名
查询多列
select 列名1,列名2 from 表名
查询多列时使用逗号隔开,最后一个列名不需要加逗号
sql语句的简单规则
-
不区分大小写(表名和列名等值要看具体的DBMS)
-
空格会被忽略,可以使用代码式的写法来增加可读性
-
多条SQL语句必须以分号分隔,单条要看DBMS,但是都加上也没错
注意:数据表示上,使用SQL语句一般返回原始的无格式的数据,所以一般很少使用实际直接检索的数据(没有应用程序提供的格式)
检索所有列
select * from 表名
检索不同的值
过滤掉相同的值
select DISTINCT 列名 from 表名
DISTINCT关键字对所有的查询列生效
限制结果
比如限制返回一定数量的行‘
这个在不同的数据库中实现不一样
-
SQL Serve和Access
使用TOP关键字
SELECT TOP 5 列名 FROM 表名
-
DB2
SELECT 列名 FROM 表名 FETCH FIRST 5 ROWS ONLY;
-
Oracle
SELECT 列名 FROM 表名 WHERE ROWNUM <=5
-
MySQL、MariaDB、PostgreSQL或者SQLite
SELECT 列名 FROM 表名 LIMIT 5;
SELECT 列名 FROM 表名 LIMIT 5 OFFSET 5; /*从第5行开始的5行 *这边的计数是从0开始的 */
MySQL、MariaDB和SQLite简略写法
SELECT 列名 FROM 表名 LIMIT 5 ,5;
注释
- 行内注释 –
- 单行注释 #
- 多行 /**/中间包含内容
查询结果排序
可以使用ORDER BY子句取一个或多个列的名字,对查询结果进行排序
如:
SELECT 列名
FROM 表名
ORDER BY 列名
-
ORDER BY子句应该时SELECT 语句的最后一个子句,否则会报错
-
可以使用非检索列来排序,这样也是合法的
-
使用多个列排序的时候,使用逗号分隔
-
可以使用列位置来排序,使用数字来代替列名即可,也可以多个列,这个数字代表了SELECT清单中位置,从1开始数
-
默认是升序排序(ASC)
-
可以指定为降序(DESC)
SELECT 列名 FROM 表名 ORDER BY 列名 DESC,列名 ASC
指定的顺序只对它直接前面的列生效
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dGL53scU-1595859104405)(查询语句.assets/image-20200422143209203.png)]
查询结果过滤(使用WHERE子句)
SELECT 列名
FROM 表名
WHERE 列名 >10;
SELECT 列名
FROM 表名
WHERE 列名 BETWEEN 5 AND 10;
#5到10之间的
符号 | 含义 |
---|---|
=,<,<=,!<,>,>=,!>,!=,<>,BETWEEN,IS NULL,IS NOT NULL | 等于,小于,小于等于,不小于,大于,大于等于,不大于,不等于,不等于,在指定的两个值之间,为空,不为空 |
-
SQL过滤和应用过滤,使用应用过滤时,数据库提供超量的数据提供,在应用中对数据进行过滤,这种方法会极大的影响应用的性能,且使得所创建的应用完全不具备可伸展性,且服务器发送多余数据,对带宽将造成浪费
-
!=和<>几倍呢上时一致的,但是DBMS不一定都支持,要详细看
-
在列值为字符串时,比较值需要加上引号(单引号),为数值时,可以直接使用
-
空值检测需要使用IS NULL
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WCRYY7jN-1595859104411)(查询语句.assets/image-20200422150021703.png)]
高级数据过滤
使用逻辑语句
逻辑词 | 含义 |
---|---|
OR | 满足其一即可,有阻断 |
AND | 都要满足,运算优先级比OR高 |
IN | IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配 |
NOT | 否定其后所跟的任何条件 |
-
OR 和AND 组合使用的情况中,可以使用()来消除歧义
-
IN语句和OR可以达成一样的效果,但是IN语法更清楚,和AND和OR语句组合的时候求值顺序更容易管理,执行速度比OR 快,IN的最大优点是可以包含其他SELECT语句,能够更动态地建立WHERE子句
使用通配符
使用通配符时必须使用LIKE操作符。
-
% 代表匹配任意字符的任意个数(0个也可以,即为空)
注意填充的空格:DBMS 有的时候会将字段用空格填充满,比如规定是20个字符的长度,实际只占用的4个字符,那么可能剩余16个字符就会用字符填充满,那么使用通配符就可能会失败。
比如:feed 和fee% 就可能无法匹配成功
-
_ 匹配一个任意字符(有且仅有一个)
注意:DB2不支持_
注意:Access中不使用_,而是使用?
注意填充的空格:和%的情况一致
-
[]通配符,匹配方括号内字符中的一个(也是有且仅仅一个)
此通配符可以用前缀字符^(脱字号)来否定
举例: [^abc]
使用NOT可以达到相同结果
注意:Access中使用!来否定
使用通配符的技巧
由于通配符的搜索速度比较慢
- 不要过度使用通配符
- 要使用时,尽量不要将其放在 搜索模式的开头,因为这样很慢
- 注意位置
创建计算字段
去除首尾空格
去除字符串首尾的空格:使用TRIM()函数
去除字符串右侧的空格:使用RTRIM()
去除字符串左侧的空格:使用LTRIM()
计算字段不是表中原本就有的数值,一般通过计算或者变换后就可以得到,一般要设置别名来显示。
下面是几种常见的计算字段:
拼接:通过直接处理拼接几个列的数据得到新的数据列
在常见的DBMS中可以分为三种实现方式
-
+: Access和SQL Server中
SELECT RTRIM(列名1)+'('+RTRIM(列名2)+')' AS 新列名 FROM 表名 #结果是:列值1(列值2) #使用这个RTRIM可以去除数据首尾的空格
-
|| :PostgreSQL、SQLite、DB2、Oracle、OPen Office Base中使用
SELECT RTRIM(列名1)||'('||RTRIM(列名2)||')' AS 新列名 FROM 表名 #结果是:列值1(列值2)
-
特殊的函数:在MySQL和MariaDB中
SELECT Concat(RTRIM(列名1),'(',RTRIM(列名2),')') AS 新列名 FROM 表名 #结果是:列值1(列值2)
别名的用处:
别名是可选的,但是一般都要加上,不然在程序中就无法调用
别名的名字既可以是一个单词,也可以是一个字符串。如果是后者,字符串应该括在引号中。虽然这种做法是合法的,但不建议这么去做。多单词的名字可读性高,不过会给客户端应用带来各种问题。因此,别名最常见的使用是将多个单词的列名重命名为一个单词的名字。
别名有时也叫导出列(derived column)
执行算数计算z
可以使用+,-,*,/
SELECT 列名1*列名2 AS 新列名
FROM 表名
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cLjXKafi-1595859104414)(查询语句.assets/image-20200424142122918.png)]
sql函数不推荐提前记忆
因为 各个DBMS之间的差距比较大,用到是去查就好
注意:使用了sql函数会导致可移植性下降,如果要用也要做好注释工作