SQL基础操作
基础查询
查询所有列
1 | SELECT * FROM table_name; |
*表示通配符,*表示选择表中的所有列
table_name表示需要查询的表的名称
查询多列
1 | SELECT column1,column2,... FROM table_name; |
这条语句会返回table_name表中的column1,column2,…列的所有行
使用别名
1 | SELECT first_name AS name,last_name AS surname FROM table_name AS tn; |
这条语句会返回表中的first_name,last_name列,并将它们分别重命名为name和surname。同时table_name被重命名为tn
查询结果的过滤
1 | SELECT column1,column2,... FROM table_name WHERE condition; |
WHERE子句可以根据条件过滤结果
condition:限制条件
查询结果的排序
1 | SELECT column1,column2,... FROM table_name ORDER BY column1 [ASC|DESC],column2 [ASC|DESC],...; |
ORDER BY子句可以根据指定的列对查询结果进行排序。
column1 [ASC|DESC]:按照column1[升序|降序]进行排序,若不加ASC或者DESC则默认升序。
查询结果的去重
1 | SELECT DISTINCT column1,column2,... FROM table_name; |
使用DISTINCT关键字可以去除查询结果中的重复行。
对column1,colum2,…列中的重复行进行去除。
查询结果的限制
1 | SELECT column1,column2,... FROM table_name LIMIT n; |
在某些数据库系统中,使用LIMIT子句限制查询结果的行数。
限制输出n行
条件查询
多列排序
1 | ORDER BY column1 ASC,column2 DESC; |
ASC:表示按升序排序(默认值)
DESC:表示按降序排序
column1:指定要排序的列名
同时也可以在ORDER BY 子句中使用列的别名进行排序。
例如
1 | SELECT column1,column2 AS co FROM user_profile ORDER BY co DESC; |
基础操作符
操作符用于WHERE子句中指定条件,以过滤查询结果。
- 比较运算符(=、<>或!=、>、<、>=、<=)
- 逻辑运算符:AND、OR、NOT
- IN操作符:
IN操作符用于指定多个可能的值,返回布尔值。
1 | SELECT column1,column2 FROM table_name WHERE column1 IN (value1,value2,...); |
- BETWEEN操作符
BETWEEN操作符用于指定一个范围,返回布尔值。
1 | SELECT column1,column2 FROM table_name WHERE column1 BETWEEN value1 AND value2; |
- LIKE操作符
LIKE操作符用于模式匹配,返回布尔值。
1 | SELECT column1,column2 FROM table_name WHERE column1 LIKE pattern; |
%:匹配任意数量的字符,包括零字符
_:匹配单个字符
高级操作符
IS NULL和IS NOT NULL,用于检查一个列是否为NULL或不为NULL。
1 | # 查询工资为NULL的员工 |
EXISTS操作符用于检查子查询是否返回任何行。如果子查询返回至少一行,则EXISTS条件为TRUE。
1 | SELECT column1,column2 FROM table_name WHERE EXISTS (SELECT 1 FROM another_table WHERE condition); |
ALL和ANY操作符用于比较一个值与子查询返回的值集,ALL:与子查询返回的所有值进行比较,ANY:与子查询返回的任意一个值进行比较。
1 | SELECT column1,column2 FROM table_name WHERE column1>ALL(SELECT column1 FROM another_table WHERE condition); |
正则表达式
常见的正则表达式
字符类
字符类用于匹配特定的字符集集合
.:匹配任何单个字符(除换行符外):a.b匹配a后面跟着任何字符,再跟着b,如a1b,a-b[abc]:匹配方括号内的任意一个字符:[abc]匹配a、b或c[^abc]:匹配不在方括号内的任意一个字符:[^abc]匹配除a、b和c之外的任何字符[a-z]:匹配指定范围内的任意一个字符:[a-z]匹配任何小写字母[A-Z]:匹配任何大写字母[0-9]:匹配任何数字
预定义字符类
预定义字符类是一些常用的字符类的简写形式
\d:匹配任何数字,等价于[0-9]:\d匹配任何单个数字\D匹配任何非数字字符,等价于[^0-9]:匹配任何非数字字符\s:匹配任何空白字符,包括空格、制表符、换行符等。\s匹配任何空白字符。\S:匹配任何非空白字符。\S匹配任何非空白字符。\w:匹配任何字母数字字符,等价于 [a-zA-Z0-9_]。\w匹配任何字母数字字符或下划线。\W:匹配任何非字母数字字符。\W匹配任何非字母数字字符。
边界匹配
边界匹配用于匹配字符串的开始或结束位置。
^:匹配字符串的开始位置。^abc匹配以abc开头的字符串。$:匹配字符串的结束位置。abc$匹配以abc结尾的字符串。\b:匹配单词边界。\bword\b匹配完整的单词word,而不是word的子字符串。
量词
量词用于指定前面的字符或字符类可以出现的次数。
*:匹配前面的字符或字符类 0 次或多次。a*匹配 0 个或多个a,如a、aa、aaa或空字符串。+:匹配前面的字符或字符类 1 次或多次。a+匹配 1 个或多个a,如a、aa、aaa,但不匹配空字符串。?:匹配前面的字符或字符类 0 次或 1 次。a?匹配 0 个或 1 个a,如a或空字符串。{n}:匹配前面的字符或字符类恰好n次。a{3}匹配恰好 3 个a,如aaa。{n,}:匹配前面的字符或字符类至少 n 次。a{3,}匹配 3 个或更多a,如aaa、aaaa。{n,m}:匹配前面的字符或字符类至少n次,但不超过m次。a{2,4}匹配 2 到 4 个a,如aa、aaa、aaaa。
分组和捕获
分组和捕获用于将正则表达式的一部分分组,并捕获匹配的内容。
():分组和捕获。(abc)匹配abc,并捕获匹配的内容。(?:...):非捕获分组。(?:abc)匹配abc,但不捕获匹配的内容。
选择
选择用于匹配多个模式中的一个。
|:选择。abc|def匹配abc或def。
贪婪和非贪婪
量词的贪婪和非贪婪模式决定了匹配的长度。
- 贪婪模式:默认情况下,量词是贪婪的,尽可能多地匹配字符。a+ 匹配尽可能多的 a。
- 非贪婪模式:在量词后加 ?,使其变为非贪婪模式,尽可能少地匹配字符。a+? 匹配尽可能少的 a。
断言
断言用于指定匹配的条件,但不消耗字符。
- 前瞻断言:
- 正前瞻:
(?=...),匹配后面跟着指定模式的字符。abc(?=def)匹配abc,但只有在其后面跟着def时才匹配。 - 负前瞻:
(?!...),匹配后面不跟着指定模式的字符。abc(?!def)匹配abc,但只有在其后面不跟着def时才匹配。
- 正前瞻:
- 后顾断言:
- 正后顾:
(?<=...),匹配前面跟着指定模式的字符。(?<=abc)def匹配def,但只有在其前面跟着 abc 时才匹配。 - 负后顾:
(?<!...),匹配前面不跟着指定模式的字符。(?<!abc)def匹配def,但只有在其前面不跟着abc时才匹配。
- 正后顾:
使用语法
在Mysql中,可以使用REGEXP或RLIKE操作符来使用正则表达式
1 | # REGEXP |
使用LIKE和正则表达式的区别
LIKE操作符:- 适用于简单的匹配模式,支持
%和_两个通配符 - 性能较好,适用于大多数简单的文本匹配需求
- 适用于简单的匹配模式,支持
- 正则表达式
- 适用于复杂的模式匹配,支持更广泛的模式匹配功能
- 性能可能稍差,但在处理复杂模式时非常强大
