SQL学习笔记(一)

  • 多条语句必须以分号分隔
  • SQL语句不区分大小写

检索数据

检索单个列

SELECT 列名 FROM 表名;

结果将返回所有行的该列字段。

检索多个列

在SELECT关键字后面给出多个列名,列名之间以逗号分隔。

SELECT 列名1,列名2,列名3 FROM 表名;

检索所有列

在实际列名的位置使用*通配符即可检索所有列。

SELECT * FROM 表名;

检索不同的值

如果希望过滤掉相同的值,只返回不同(唯一)的值,则使用DISTINCT关键字,放在列名前面:

SELECT DISTINCT 列名 FROM 表名;

在应用于多个列时,DISTINCT关键字应用于所有指定的列。

限制结果

SELECT语句返回指定表中所有匹配的行,很可能是每一行。
如果只想返回特定数量的行,在MySQL中要使用LIMIT子句:

SELECT 列名 FROM 表名 LIMIT 数量;

OFFSET关键字用于指定从什么位置开始检索:

SELECT 列名 FROM 表名 LIMIT 数量 OFFSET 起始位置;

比如limit 5 offset 5表示返回从第六行开始的五行数据。

  • 注意,offset指定的偏移量从0开始计数,因此limit 1 offset 1会检索第二行。
  • 可以使用简化语法LIMIT 3,4,逗号之前的值对应OFFSET,逗号后面的值对应LIMIT

使用注释

注释的形式是两个连字符:--
多行注释则是/* */,这种方式常用于注释代码。

排序检索数据

排序数据

单纯使用上面提到过的SELECT语句返回的数据不保证顺序。
为了明确地排序用SELECT语句检索出的语句,可使用ORDER BY子句。
ORDER BY子句取一个或多个列的名字,据此对输出进行排序。

SELECT 列名 FROM 表名 ORDER BY 列名;

注意ORDER BY子句一定是SELECT语句中最后一条语句,否则会报错。

ORDER BY子句中使用的列可以是非检索列,而不一定是指定的列。

按多个列排序

经常需要按不止一个列进行数据排序。
要按多个列排序,简单指定列名,列名之间用逗号分开即可。

SELECT 列名1,列名2 FROM 表名 ORDER BY 列名2,列名3;

这将会首先按列名2排序,然后按列名3排序。

按列位置排序

ORDER BY还支持按相对列位置进行排序。
即指出的是列的相对位置而不是列名。
ORDER BY 2 表示按SELECT清单中的第二个列进行排序。
ORDER BY 2,3 表示首先按SELECT清单中的第二个列进行排序,然后按第三个列进行排序。

这一技术的好处在于不用重新输入列名。但是对于不在SELECT清单中列无法依据其进行排序。

指定排序方向

默认的排序顺序是升序,还可以利用关键字DESC设置降序排序。

SELECT 列名 FROM 表名 ORDER BY 列名 DESC;

如果依据多个列进行排序,DESC只应用于位于其前面的列名:

SELECT 列名1,列名2 FROM 表名 ORDER BY 列名2 DESC,列名3;

在这个例子中,首先依据列名2倒序排序,然后按列名3升序排序。

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

过滤数据

使用where子句

在SELECT语句中,数据根据where子句中指定的搜索条件进行过滤。
WHERE子句在FROM子句之后给出:

SELECT 列名 FROM 表名 WHERE 列名 = 值;

这个示例使用了简单的相等检验,检验这一列的值是否等于指定值。

where子句操作符

where子句支持以下操作符:

= 等于
<> 不等于
!= 不等于
< 小于
<= 小于等于
!< 不小于
> 大于
>= 大于等于
!> 不大于
BETWEEN 在指定的两个值之间
IS NULL 为null值 

要检查范围值,可以应用BETWEEN操作符:

SELECT 列名 FROM 表名 WHERE 列名 BETWEEN 值1 AND2;

使用BETWEEN时,必须指定两个值:最低值和最高值。这两个值用AND分隔。BETWEEN匹配范围内的所有值,包括指定的开始值和结束值。

当表中某一个列不包含值时,称其包含空值NULL,这与包含0、空字符串或空格不同。

要确定是否为空值,不能简单地检查是否=NULL,而可以利用IS NULL子句:

SELECT 列名 FROM 表名 WHERE 列名 IS NULL;

高级数据过滤

组合where子句

上一节的WHERE子句在过滤数据是使用的都是单一的条件,为了进行更强的过滤控制,SQL允许给出多个WHERE子句,这些子句以AND或OR的方式使用。

AND操作符

要通过不止一个列进行过滤,可以使用AND操作符给WHERE子句附加条件:

SELECT 列名 FROM 表名 WHERE 列名1 = 值1 AND 列名2 <= 值2;

多个过滤条件之间都要用AND关键字连接。
只有满足所有过滤条件才会被返回。

OR操作符

OR操作符指示只要满足任一条件即可:

SELECT 列名 FROM 表名 WHERE 列名1 = 值1 OR 列名2 >= 值2;

求值顺序

WHERE子句可以包含任意数目的AND和OR操作符。
而对于组合过滤条件的求值顺序,AND拥有更高的优先级
为了改变求值顺序可以使用圆括号进行分组。

IN操作符

IN操作符用于指定条件范围,范围中的每个条件都可以进行匹配。
IN操作符取一组由逗号分隔,括在圆括号中的合法值。

SELECT 列名 FROM 表名 WHERE 列名1 IN (值1,值2);

其实IN操作符完成了和OR操作符相同的功能,下面的语句与上面的语句完成相同的工作:

SELECT 列名 FROM 表名 WHERE 列名1 = 值1 OR 列名1 = 值2;

但是使用IN操作符有一系列好处:

  • 当有很多合法选项时,IN操作符更直观
  • IN操作符一般比一组OR操作符执行得更快
  • IN的最大优点是可以包含其他SELECT语句,能够动态建立WHERE子句。

NOT操作符

WHERE子句中的NOT操作符用来否定其后所跟的任何条件。

SELECT 列名 FROM 表名 WHERE NOT 列名1 = 值1;

用通配符进行过滤

LIKE操作符

为了在搜索子句中使用通配符,必须使用LIKE操作符。LIKE操作符指示后面的是通配符匹配模式而不是简单地相等匹配。

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

百分号%通配符

最常用的通配符是%。在搜索串中,%表示任何字符出现任意次数。
例如,为了寻找以FISH开头的产品,可以使用以下SELECT子句:

SELECT 列名 FROM 表名 WHERE 列名1 LIKE 'FISH%';

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

SELECT 列名 FROM 表名 WHERE 列名1 LIKE '%bean bag%';

搜索模式’%bean bag%’表示匹配任何位置上包含文本bean bag的值。

通配符也可以出现在搜索模式中间:

SELECT 列名 FROM 表名 WHERE 列名1 LIKE 'F%y';

上面的句子将找出所有以F开头、以y结尾的数据。

下划线_通配符

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

SELECT 列名 FROM 表名 WHERE 列名1 LIKE '__ inch teddy bear';

两个下划线表示两个字符,因此8 inch teddy bear这样的数据是不会被返回的。

方括号[]通配符

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

SELECT 列名 FROM 表名 WHERE 列名1 LIKE '[JM]%';

这样会匹配以J或M开头的数据。

这个通配符可以使用前缀字符^来否定。
例如,下面的语句匹配所有以J和M开头之外的数据:

SELECT 列名 FROM 表名 WHERE 列名1 LIKE '[^JM]%';

使用通配符的技巧

通配符会比其他搜索耗费更长的处理时间。

  • 不要过度使用通配符。如果其他操作符能达到相同目的,应该使用其他操作符。
  • 在确实需要使用通配符时,也尽量不要把它们用在搜索模式的开始处,这样搜索起来是最慢的。

创建计算字段

有时我们可能希望直接从数据库中检索出转换、计算或格式化过的数据,这时就需要使用计算字段了。

拼接字段

假设我们需要一个由两个字段组合而成的数据,那么就要在SELECT语句中用一个特殊的操作符来拼接两个列。

SELECT Concat(列名1,列名2) FROM 表名;

也可以加上更多辅助的字符:

SELECT Concat(列名1,'(',列名2,')') FROM 表名;

使用别名

新拼接出的字段没有名字,SQL支持赋予别名:

SELECT Concat(列名1,'(',列名2,')') AS 别名 FROM 表名;

执行算术计算

计算字段的另一常见用途就是对检索出的数据进行算术运算。

SELECT 列名1,列名2,列名1*列名2 AS 别名 FROM 表名

可以使用加减乘除这四种算术操作符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值