MySQL必知必会——读书笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuejianhui/article/details/52814501

查询

限制

-- 查询表中前5行的结果
SELECT * FROME 表名 LIMIT 5;

-- 查询表中,从行3开始的4行数据
SELECT * FROME 表名 LIMIT 3,4;

-- 查询表中,从行3开始的4行数据
SELECT * FROME 表名 LIMIT 3 OFFSET 4;

排序

-- 默认排序(A~Z)
SELECT * FROM 表名 ORDER BY 字段; 

-- 升序排序(A~Z),ASC=ASCENDING
SELECT * FROM 表名 ORDER BY 字段 ASC; 

-- 两个条件默认排序
SELECT * FROM 表名 ORDER BY 字段1, 字段2; 

-- 降序
SELECT * FROM 表名 ORDER BY 字段 DESC; 

-- 字段1降序,字段2默认排序
SELECT * FROM 表名 ORDER BY 字段1 DESC, 字段2; 

-- 得到按字段1降序后的第一行
SELECT * FROM 表名 ORDER BY 字段1 DESC LIMIT 1; 

SELECT DISTINCT 字段 FROM 表名;                       -- 只返回不同的值

SELECT * FROM 表名 WHERE 字段 <> 5;                   -- 字段不等于5
SELECT * FROM 表名 WHERE 字段 BETWEEN 5 AND 10;       -- 字段区间[5,10]
"
原文:你可能希望返回具有NULL值得行,但不行。
    因为未知具有特殊含义,数据库不知道它们是否匹配,所以在匹配过滤或不匹配过滤时不返回它们。
    因此,在过滤数据时,一定要验证返回数据中确实给出了被过滤列具有NULL的行。
"
SELECT * FROM 表名 WHERE 字段 IS NULL;                -- 字段为空

SELECT * FROM 表名 WHERE 条件1 OR 条件2;              -- 字段为空
SELECT * FROM 表名 WHERE 条件1 AND 条件2;             -- 字段为空
SELECT * FROM 表名 WHERE (条件1) AND (条件2);         -- 字段为空,推荐使用()明确地分组操作符
-- INOR的功能是相同的
-- 按字段2排序,返回字段1100200的结果    
SELECT * FROM 表名 WHERE 字段1 = 100 OR 字段1 = 200 ORDER BY 字段2-- 按字段2排序,返回字段1100200的结果
SELECT * FROM 表名 WHERE 字段1 IN (100,200) ORDER BY 字段2;                    

"
IN的优点:
    1、更清楚、直观;
    2、计算的次序更易管理(因使用操作符更少);
    3、执行更快;
    4、可包含其他SELECT语句,更动态地建立WHERE语句。
"
-- 按字段2排序,返回字段1不是100200的结果
SELECT * FROM 表名 WHERE 字段1 NOT IN (100,200) ORDER BY 字段2;                 
SELECT * FROM 表名 WHERE 字段 LIKE 'test%';     -- 结果以"test"开头
SELECT * FROM 表名 WHERE 字段 LIKE '%test%';    -- 结果中包含"test"
SELECT * FROM 表名 WHERE 字段 LIKE 'a%b';       -- 结果以a开头,以b结尾
SELECT * FROM 表名 WHERE 字段 LIKE '_bc';       -- 结果以单个字符开头,其后内容为bc
'
"_"只能匹配单个字符,而"%"可以匹配多个字符
    使用通配符搜索处理时间较其他搜索所花费时间更长
    使用技巧:
        1、尽量用其他操作符代替,非必要不用;
        2、尽量不要放在搜索模式的开始处,否则搜索会更慢;
'

正则表达式

"正则表达式用来匹配文本的特殊字符串(字符集合)。"

-- 结果包含'1000'。并不比LIKE好,可能更差。
SELECT * FROM 表名 WHERE 字段 REGEXP '1000' ORDER BY 字段;

-- 结果包含'1000','2000'等
SELECT * FROM 表名 WHERE 字段 REGEXP '.000' ORDER BY 字段;

-- 结果包含'1000'或'2000'
SELECT * FROM 表名 WHERE 字段 REGEXP '1000|2000' ORDER BY 字段;

-- 结果区分大小写
SELECT * FROM 表名 WHERE 字段 REGEXP BINARY 'AbC' ORDER BY 字段;

-- 结果包含1xx或2xx或3xx
SELECT * FROM 表名 WHERE 字段 REGEXP '[123]xx' ORDER BY 字段;

-- 结果不包含1xx或2xx或3xx
SELECT * FROM 表名 WHERE 字段 REGEXP '^[123]xx' ORDER BY 字段;             

"
[123]xx 与 [1|2|3]xx 等价
    ^[123]xx表示不包含1xx或2xx或3xx;
    [0123456789] 与 [0-9] 等价,表示匹配0~9的数字。[a-z]也同理。
"

-- 结果返回0(如有数字则返回1)
SELECT 'hello' REGEXP '[0-9]';

-- 结果包含特殊字符'.',\\用来引导转义特殊字符。
SELECT * FROM 表名 WHERE 字段 REGEXP '\\.' ORDER BY 字段; 
/* 需要转移的字符列表:
    \\f     换页
    \\n     换行
    \\r     回车
    \\t     制表
    \\v     纵向制表
    \\\     反斜杠
    为什么使用两个反斜杠(\),MySQL自己用一个,正则用一个。
*/

/* 常用正则:
    [:alnum:]       任意字母和数字(同[a-zA-Z0-9])
    [:digit:]       任意数字(同[0-9])
    [:alpha:]       任意字符(同[a-zA-Z])
    [:lower:]       任意小写字符(同[a-z])
    [:upper:]       任意大写字符(同[A-Z])

    [:xdigit:]       任意十六进制数字(同[a-fA-F0-9])

    [:cntrl:]       ASCII控制字符(ASCII 0到31和127)
    [:punct:]       既不在[:alnum:],又不在[:cntrl:]中的任意字符

    [:print:]       任意可打印字符
    [:graph:]       与[:print:]相同,但不包含空格

    [:blank:]       空格和制表(同[\\t])
    [:space:]       包括空格在内的任意空白字符(同[\\f\\n\\r\\t\\v])
*/

猜你喜欢

转载自blog.csdn.net/xuejianhui/article/details/52814501