mysql方法_mysql 常用方法汇总

show columns from 表名;

desc 表名;(全写:describe 表名)

show create table 表名;

< <

<= <=

> > ]]>

>= >= = ]]>

& &

’ '

" "

# 换行

UPDATE tablename SET FIELD = REPLACE(REPLACE(FIELD, CHAR(10), ''), CHAR(13), '');

CHAR(10): 换行符

CHAR(13): 回车符

# [mysql查询不区分大小写](https://www.cnblogs.com/lukelook/p/11636652.html)

select * from TableA where binary columnA ='aaa';

mysql修改字段类型:

--能修改字段类型、类型长度、默认值、注释

--对某字段进行修改

ALTER TABLE 表名 MODIFY [COLUMN] 字段名 新数据类型 新类型长度 新默认值 新注释;

-- COLUMN关键字可以省略不写

alter table table1 modify column column1 decimal(10,1) DEFAULT NULL COMMENT '注释'; -- 正常,能修改字段类型、类型长度、默认值、注释

alter table table1 modify column1 decimal(10,2) DEFAULT NULL COMMENT '注释';

-- 正常,能修改字段类型、类型长度、默认值、注释

mysql修改字段名:

ALTER TABLE 表名 CHANGE [column] 旧字段名 新字段名 新数据类型;

alter table table1 change column1 column1 varchar(100) DEFAULT 1.2 COMMENT '注释'; -- 正常,此时字段名称没有改变,能修改字段类型、类型长度、默认值、注释

alter table table1 change column1 column2 decimal(10,1) DEFAULT NULL COMMENT '注释' -- 正常,能修改字段名、字段类型、类型长度、默认值、注释

alter table table1 change column2 column1 decimal(10,1) DEFAULT NULL COMMENT '注释' -- 正常,能修改字段名、字段类型、类型长度、默认值、注释

alter table table1 change column1 column2; -- 报错

mysql> alter table white_user change column name nick_name varchar(50) null comment '昵称'; -- 正确

Query OK, 0 rows affected (0.02 sec)

CREATE OR REPLACE VIEW

DROP VIEW

show full columns from table;

#包括两个边界

between '2018-01-01 00:00:00' and '2018-01-01 00:00:02'

#GROUP_CONCAT

以stuName分组,把score字段的值打印在一行,逗号分隔(默认)

select GROUP_CONCAT(score),stuName from grade1 GROUP BY stuName;

#指定分隔符

group_concat(price separator ‘;’)

#去重

group_concat(distinct price)

#排序

group_concat(price order by price desc)

coalesce(a,b,c);

参数说明:如果a==null,则选择b;如果b==null,则选择c;如果a!=null,则选择a;如果a b c 都为null ,则返回为null(没意义)

WITH ROLLUP:在group分组字段的基础上再进行统计数据。

SELECT coalesce(name, '总金额'),name, SUM(money) as money FROM test GROUP BY name WITH ROLLUP;

grant all privileges on *.* to 'dev'@'%' identified by '123456';WITH GRANT OPTION;//让该用户可以授权

#执行存储过程、函数权限

GRANT SELECT , EXECUTE ON `database`.table TO 'query_all'@'%';

#修改definer 安全性 invoker https://blog.csdn.net/qq_36698956/article/details/81503387

update mysql.proc set DEFINER='root@localhost' WHERE NAME='' AND db='mydb';

其中,mysql.proc是固定的,definer即要改为的用户名,name为存储过程名,db为数据库名

ALTER PROCEDURE proc_name SQL SECURITY INVOKER

ALTER PROCEDURE proc_name SQL SECURITY DEFINER

数字相关方法

# [去掉小数后面的0](https://www.cnblogs.com/abinbin/p/cutZero.html)

CONCAT(0 + CAST(10.00 AS CHAR),'%') scale

#MySQL格式化小数点为百分号并保留2为小数

SELECT TRUNCATE(10.00,2)

#colname为字段名字,CONCAT的作用是把小数点转成百分号,TRUNCATE的作用是保留百分号的小数点成几位

SELECT CONCAT(TRUNCATE(colname*100,2),'%') as colname

# cast跟convert的用法

CAST(expr AS type), CONVERT(expr,type) , CONVERT(expr USING transcoding_name)

# 四舍五入

SELECT ROUND(1/3,4)

# 只舍不入

SELECT TRUNCATE(4.56,1)

# 假如我们想保留两位小数,被向上取进位处理:可以把我们的值先乘以100,然后进行ceil函数处理,再缩小到原来的大小即可 三位就是1000

select ceil(value*100)/100

ceil()向上取整 floor() 向下取整

ceil(1.2) = 2 floor(1.2) = 1

-- 生成 3 位的随机数

SELECT CEILING(RAND()*900+100);

-- 生成 4 位的随机数

SELECT CEILING(RAND()*9000+1000);

-- 生成 5 位的随机数

SELECT CEILING(RAND()*90000+10000);

FIND_IN_SET

字符串相关方法

INSTR(str,substr)函数,用于在一个字符串(str)中搜索指定的字符(substr),返回找到指定的字符的第一个位置(index),index是从1开始计算,如果没有找到就直接返回0

#数据转字符串

SELECT CAST(123 AS CHAR),concat(123,'')

CAST(bid.is_increase_rate AS signed )

select MD5("aaa");

SELECT CHAR_LENGTH(''中国");

SELECT LPAD("123",8,"0")

select lower('DDD'); upper

### 数据脱敏

CONCAT(LEFT(IdentityCardNo,3), '****' ,RIGHT(IdentityCardNo,4)) AS 身份证号

INSERT(str,pos,len,newstr):返回字符串 str, 其子字符串起始于 pos 位置和长期被字符串 newstr取代的len 字符

INSERT(IdentityCardNo, 4, 11, '****')

函数 说明

CONCAT(s1,s2,...) 返回连接参数产生的字符串,一个或多个待拼接的内容,任意一个为NULL则返回值为NULL。

CONCAT_WS(x,s1,s2,...) 返回多个字符串拼接之后的字符串,每个字符串之间有一个x。

SUBSTRING(s,n,len)、MID(s,n,len) 两个函数作用相同,从字符串s中返回一个第n个字符开始、长度为len的字符串。

LEFT(s,n)、RIGHT(s,n) 前者返回字符串s从最左边开始的n个字符,后者返回字符串s从最右边开始的n个字符。

INSERT(s1,x,len,s2) 返回字符串s1,其子字符串起始于位置x,被字符串s2取代len个字符。

REPLACE(s,s1,s2) 返回一个字符串,用字符串s2替代字符串s中所有的字符串s1。

LOCATE(str1,str)、POSITION(str1 IN str)、INSTR(str,str1) 三个函数作用相同,返回子字符串str1在字符串str中的开始位置(从第几个字符开始)。

FIELD(s,s1,s2,...) 返回第一个与字符串s匹配的字符串的位置。

日期相关方法

SELECT NOW(),CURDATE(),CURTIME(),

-- datetime 转 date time

NOW(), DATE(NOW()), TIME (NOW()), CONCAT(DATE(NOW()), ' ', TIME (NOW())),

-- str 转 datetime date time

str_to_date('2019-04-25 08:50:00', '%Y-%m-%d %H:%i:%s'),DATE('2019-04-25 08:50:00'),TIME ('2019-04-25 08:50:00'),

str_to_date('2019-04-25 08:50:00', '%Y-%m-%d %T'),

-- 比较

NOW() = CONCAT(DATE(NOW()), ' ', TIME (NOW())),

DATE(NOW()) = '2019-04-25',

NOW() = DATE(NOW()),

NOW() = TIME (NOW());

DATE_FORMAT(date, '%Y-%m-%d')

DATE_FORMAT(date,'%Y-%m-%d %h:%i:%s') %y 两位数字表示的年份

str_to_date(date,’%Y-%m-%d’)

select str_to_date(‘09/01/2009’,’%m/%d/%Y’)

select str_to_date(‘20140422154706’,’%Y%m%d%H%i%s’)

select str_to_date('2014-04-22 15:47:06','%Y-%m-%d %H:%i:%s')

在mysql中,我们可以用DAYOFWEEK 和 WEEKDAY函数获取指定日期的星期。区别在于DAYOFWEEK获取的星期索引是以1开始,而WEEKDAY获取的星期索引是以0开始.

DAYOFWEEK(date)

返回日期date的星期索引(1=星期天,2=星期一, ……7=星期六)

WEEKDAY(date)

返回date的星期索引(0=星期一,1=星期二, ……6= 星期天)。

%w 周的天 (0=星期日, 6=星期六)

select subdate(curdate(),date_format(curdate(),'%w')-1)//获取当前日期在本周的周一

select subdate(curdate(),date_format(curdate(),'%w')-2) //获取当前日期在本周的周二

select date_sub(curdate(),INTERVAL date_format(curdate(),'%w')-2) DAY)

select subdate(curdate(),date_format(curdate(),'%w')-7)//获取当前日期在本周的周日

select date_sub()

%W 星期名字(Sunday……Saturday)

%w 一个星期中的天数(0=Sunday ……6=Saturday )

#将日期转为秒数

select CONCAT('ap',UNIX_TIMESTAMP('2011-05-31 23:59:59'),'000');

select REPLACE(unix_timestamp(current_timestamp(3)),'.','')

# 比较两个日期相关的day

支持的单位有

MICROSECOND

SECOND 秒

MINUTE 分钟

HOUR 小时

DAY 天

WEEK 星期

MONTH 月

QUARTER 季度

YEAR 年

TIMESTAMPDIFF(DAY,'20171226',CURDATE())

MySQL datediff(date1,date2):两个日期相减 date1 - date2,返回天数。

MySQL timediff(time1,time2):两个日期相减 time1 - time2,返回 time 差值。

timediff(time1,time2) 函数的两个参数类型必须相同。

SELECT TO_DAYS('2018-09-10') - TO_DAYS('2017-09-01') AS 相差天数;

SELECT DATEDIFF(NOW(), '2018-09-01') AS 相差天数;

SELECT NOW() 当前日期,DATE_ADD(NOW(), INTERVAL - 400 DAY) 历史日期,TIMESTAMPDIFF( DAY, DATE_ADD(NOW(), INTERVAL - 400 DAY), NOW()) AS 相差日

select date_add(now(), interval 1 day); - 加1天

select date_add(now(), interval 1 hour); -加1小时

select date_add(now(), interval 1 minute); - 加1分钟

select date_add(now(), interval 1 second); -加1秒

select date_add(now(), interval 1 microsecond);-加1毫秒

select date_add(now(), interval 1 week);-加1周

select date_add(now(), interval 1 month);-加1月

select date_add(now(), interval 1 quarter);-加1季

select date_add(now(), interval 1 year);-加1年

MySQL adddate(), addtime()函数,可以用date_add() 来替代。

MySQL 为日期减去一个时间间隔:date_sub()

MySQL 中subdate(),subtime()函数,建议,用date_sub()来替代。

DATE_SUB(start_date,INTERVAL expr unit);

SELECT DATE_SUB(curdate(),INTERVAL 1 DAY)

-- mysql 截取身份证出生日期

select idno as 身份证号, cast(substring(idNo,7,8) as date) as 出生日期, DATE_FORMAT(cast(substring(idNo,7,8) as date), '%m-%d') as 生日 from t_person

查询本周所有的数据(本周第一天是周日)这是欧美的周时间

SELECT * FROM 表名 WHERE YEARWEEK(date_format(时间字段,'%Y-%m-%d')) = YEARWEEK(now());

1

查询本周所有的数据(本周第一天是周一)中国的周时间

SELECT * FROM 表名 WHERE YEARWEEK(date_format(时间字段,'%Y-%m-%d'),1) = YEARWEEK(now(),1);

mysql 批量删除表(表名前缀相同)

SELECT CONCAT('drop table ', group_concat(TABLE_NAME), ';') FROM information_schema.`TABLES`

WHERE table_schema = 'database1' AND TABLE_NAME LIKE 'tab_%'

drop table tab_1,tab_2,tab_3,tab_4,tab_5;

行转列

GROUP_CONCAT(m.step,if(um.is_complete=1,'已完成','未完成') ORDER BY m.step SEPARATOR '/') c1,

SELECT a.type,sum(a.c) from

(

SELECT 1 type,1 c UNION

SELECT 1 type,2 c UNION

SELECT 1 type,3 c UNION

SELECT 1 type,4 c UNION

SELECT 1 type,5 c UNION

SELECT 1 type,6 c UNION

SELECT 1 type,7 c

)a

GROUP BY a.type

---

DROP TABLE IF EXISTS test;

CREATE TABLE test (

aid int(11) NOT NULL,

data varchar(255) DEFAULT NULL,

id int(11) DEFAULT NULL,

sata varchar(255) DEFAULT NULL,

PRIMARY KEY (aid)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO test VALUES ('1', '201801', '10', '1');

INSERT INTO test VALUES ('2', '201801', '11', '2');

INSERT INTO test VALUES ('3', '201802', '10', '3');

INSERT INTO test VALUES ('4', '201802', '11', '3');

INSERT INTO test VALUES ('5', '201803', '10', '1');

INSERT INTO test VALUES ('6', '201803', '11', '1');

SELECT * from test;

SET @sql = NULL;

SELECT

GROUP_CONCAT(DISTINCT

CONCAT(

'MAX(IF(data = ''',

data,

''', sata, 0)) AS ''',

data, ''''

)

) INTO @sql

FROM test;

SET @sql = CONCAT('Select id, ', @sql,' From test group by id');

PREPARE a FROM @sql;

EXECUTE a;

DEALLOCATE PREPARE a;

Select id,MAX(IF(data = '201801', sata, 0)) AS '201801',MAX(IF(data = '201802', sata, 0)) AS '201802',MAX(IF(data = '201803', sata, 0)) AS '201803' From test group by id;

-----------------

CREATE TABLE score(

id int(11) not null AUTO_INCREMENT PRIMARY KEY,

studentName varchar(40) not null DEFAULT '',

className varchar(40) not null DEFAULT '',

score int(11) not NULL DEFAULT 0

);

INSERT score(studentName, className, score)

VALUES

('张三', '语文', 80),

('李四', '语文', 90),

('王五', '语文', 84),

('张三', '数学', 90),

('李四', '数学', 90),

('王五', '数学', 69),

('王五', '英语', 83),

('李四', '英语', 73),

('张三', '英语', 93);

SELECT

studentName,

MAX(CASE className WHEN '语文' THEN score END) 语文,

MAX(CASE className WHEN '数学' THEN score END) 数学,

MAX(CASE className WHEN '英语' THEN score END) 英语

FROM

score

GROUP BY

studentName;

SELECT

a.studentName,

(SELECT b.score FROM score b WHERE a.studentName = b.studentName AND b.className = '语文') 语文,

(SELECT b.score FROM score b WHERE a.studentName = b.studentName AND b.className = '数学') 数学,

(SELECT b.score FROM score b WHERE a.studentName = b.studentName AND b.className = '英语') 英语

FROM

score a

GROUP BY

a.studentName;

### 列转行

~~~

SELECT

group_concat(a.id SEPARATOR ',') AS ids

FROM

(

SELECT

*

FROM

`user`

WHERE

1 = 1

ORDER BY

rand()

LIMIT 10

) a

~~~

select auto_increment from information_schema.tables where table_name='t_red_packages_history' and table_schema = 'sp2p';

-- 修改当前自增值

alter table t_red_packages_history auto_increment=2753915;

show OPEN TABLES where In_use > 0;

SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;

kill 716;

SHOW PROCESSLIST;

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

DROP FUNCTION IF EXISTS func_inc_rownum ;

DELIMITER //

CREATE FUNCTION `func_inc_rownum`(userId LONG,isreset int) RETURNS int

begin

IF isreset = 1 then

SET @rownumber := 0;

set @user_id= 0;

return @rownumber;

ELSE

IF @user_id=userId THEN

SET @rownumber := IFNULL(@rownumber,0) + 1;

ELSE

SET @rownumber := 1;

END IF;

set @user_id=userId;

return @rownumber;

END IF;

end //

DELIMITER ;

函数中DELIMITER // 和 END结尾的 // 是告诉mysql解析器让他执行一整段的sql 语句。(一般sql解析器会遇到分行就执行相应的语句)

SELECT

*

FROM

(

SELECT func_inc_rownum(a.user_id,0) AS line,

a.id,

a.amount,

a.bid_id,

a.red_amount,

a.time,

u.store_id

FROM

t_invests a

INNER JOIN (

SELECT func_inc_rownum(0,1)

) r

INNER JOIN t_users u ON a.user_id = u.id

AND u.store_id IS NOT NULL

WHERE

TRUE

ORDER BY

a.user_id,

a.id ASC

) aa

Caused by: java.sql.SQLException: Error writing file '/tmp/MYksgV6d' (Errcode: 28 - No space left on

ERROR 1030 (HY000): Got error 28 from storage engine

磁盘临时空间不够导致。

解决办法:清空/tmp目录,或者修改my.cnf中的tmpdir参数,指向具有足够空间目录

解决方法:将tmpdir指向一个硬盘空间很大的目录即可

show variables like 'tmpdir';

df -h

-- 科学计数解决

CONCAT("\'",u.id_number)

1.如果只需要导出展示、打印:可使用CONCAT("\t",str)

2.如果需要后续处理,引用,最好使用CONCAT("'",str)或者CONCAT("'",str),并导出为EXCEL文件。

-- 分组

SELECT

@rownumber:=

CASE

WHEN @preScore = c.score THEN (@rownumber + 1)

ELSE 1

END AS line,

@preScore := c.score

NAME,

score

FROM

(SELECT * FROM computer_stu ORDER BY computer_stu.score) c,

(SELECT @rownumber := 0,@preScore:='') r;

@curRank/*'*/:=/*'*/@curRank + 1

,(SELECT @curRank/*'*/:=/*'*/0)

AND t_bids.show_type & ? <> 0

ORDER BY IF (

loan_schedule >= 100,

0,IF (is_only_new_user > 0, 2, 1)

) DESC,id DESC

update t_bids set is_increase_rate = b'1' where id = 112618;

String s = new String((byte[])activityInfo.get("isIncreaseRate")).toString();

-- 将bit 转成 int

CAST(t_bids.is_increase_rate AS signed)

group by a 那留下的是 order by a 后的第一条;

所以 如果想要留下一定的数据,请先 嵌套一层 查询,如

select * from (select * from table_a order by b ) v group by a

select * from (

select * from table_name order by create_time desc

) as t

group by t.id;

DATE_FORMAT(NOW(),'%Y%m%d%H%i%s')

select convert(t/100,decimal(15,2)) as money from test

SELECT TRUNCATE(t/100,2) as g from test

select convert(4545.1366,decimal(10,3));

CONCAT(string1,string2,…)

update user

inner join employ on user.phone=employ.mobile

inner join department on department.name=employ.company

set user.department_id=department.id;

select @@global.sql_mode;

### 重启失效

set @@global.sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

### 永远有效

sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

### 区分大小写

lower_case_table_names=1

json

get_json_object JSON_EXTRACT

json_extract(fieldJsonStr,'$.fieldName')

创建表

CREATE TABLE t_json(id INT PRIMARY KEY, NAME VARCHAR(20) , info JSON);

插入记录

INSERT INTO t_json(id,sname,info) VALUES(1 ,'test','{"time":"2017-01-01 13:00:00","ip":"192.168.1.1","result":"fail"}');

INSERT INTO t_json(id,sname,info) VALUES(2 ,'my',JSON_OBJECT("time",NOW(),'ip','192.168.1.1','result','fail'));

查询IP键

SELECT sname,JSON_EXTRACT(info,'$.ip') FROM t_json;

查询有多少个键

SELECT id,json_keys(info) AS "keys" FROM t_json;

删除键

UPDATE t_json SET info = json_remove(info,'$.ip');

增加键

UPDATE t_json SET info = json_set(info,'$.ip','192.168.1.1');

变更值

UPDATE t_json SET info = json_set(info,'$.ip','192.168.1.2');

---------------------

CREATE FUNCTION `fn_Json_getKeyValue`(

in_JsonArray MEDIUMTEXT,# JSON数组字符串

in_Index TINYINT, # 从json 对象序号,序号从1开始

in_KeyName VARCHAR(512) # 键名

) RETURNS varchar(2048) CHARSET utf8

BEGIN

# 定义参数

DECLARE vs_Return VARCHAR(4096);

DECLARE vs_JsonArray, vs_Json, vs_KeyName VARCHAR(4096);

DECLARE vi_Pos1,vi_Pos2 SMALLINT UNSIGNED;

# 写入监控日志 暂不记录

SET vs_JsonArray = TRIM(in_JsonArray);

SET vs_KeyName = TRIM(in_KeyName);

IF vs_JsonArray = '' OR vs_JsonArray IS NULL

OR vs_KeyName = '' OR vs_KeyName IS NULL

OR in_Index <= 0 OR in_Index IS NULL THEN

SET vs_Return = NULL;

ELSE

SET vs_JsonArray = REPLACE(REPLACE(vs_JsonArray, '[', ''), ']', '');

# 取指定json 对象

SET vs_Json = SUBSTRING_INDEX(SUBSTRING_INDEX(vs_JsonArray,'}', in_index),'}',-1);

IF vs_Json = '' OR vs_json IS NULL THEN

SET vs_Return = NULL;

ELSE

SET vs_KeyName = CONCAT('"',vs_KeyName,'":');

SET vi_Pos1 = INSTR(vs_Json,vs_KeyName);

IF vi_Pos1 > 0 THEN

# 键名不存在

SET vi_Pos1 = vi_Pos1 + CHAR_LENGTH(vs_KeyName);

SET vi_Pos2 = LOCATE(',',vs_Json,vi_Pos1);

IF vi_Pos2 = 0 THEN

SET vi_Pos2 = CHAR_LENGTH(vs_Json) + 1;

END IF;

SET vs_Return = REPLACE(MID(vs_Json,vi_Pos1,vi_Pos2-vi_Pos1),"",'');

END IF;

END IF;

END IF;

RETURN vs_Return;

END

一、SQL模式

SQL的模式匹配允许你使用“_”匹配任何单个字符,而“%”匹配任意数目字符(包括零个字符)。在 MySQL中,SQL的模式缺省是忽略大小写的。下面显示一些例子。注意在你使用SQL模式时,你不能使用=或!=;而使用LIKE或NOT LIKE比较操作符。

SELECT 字段 FROM 表 WHERE 某字段 Like 条件

其中关于条件,SQL提供了四种匹配模式:

1,%:表示任意个或多个字符。可匹配任意类型和长度的字符。

比如 SELECT * FROM [user] WHERE u_name LIKE ‘%三%'

将会把u_name为“张三”,“张猫三”、“三脚猫”,“唐三藏”等等有“三”的记录全找出来。

另外,如果需要找出u_name中既有“三”又有“猫”的记录,请使用and条件

SELECT * FROM [user] WHERE u_name LIKE ‘%三%' AND u_name LIKE ‘%猫%'

若使用 SELECT * FROM [user] WHERE u_name LIKE ‘%三%猫%'

虽然能搜索出“三脚猫”,但不能搜索出符合条件的“张猫三”。

2,_:表示任意单个字符。匹配单个任意字符,它常用来限制表达式的字符长度语句:(可以代表一个中文字符)

比如 SELECT * FROM [user] WHERE u_name LIKE ‘三'

只找出“唐三藏”这样u_name为三个字且中间一个字是“三”的;

再比如 SELECT * FROM [user] WHERE u_name LIKE ‘三__';

只找出“三脚猫”这样name为三个字且第一个字是“三”的;

二、正则模式

由MySQL提供的模式匹配的其他类型是使用扩展正则表达式。当你对这类模式进行匹配测试时,使用REGEXP和NOT REGEXP操作符(或RLIKE和NOT RLIKE,它们是同义词)。

扩展正则表达式的一些字符是:

“.”匹配任何单个的字符。(单字节字符)

一个字符类“[...]”匹配在方括号内的任何字符。例如,“[abc]”匹配“a”、“b”或“c”。为了命名字符的一个范围,使用一个“-”。“[a-z]”匹配任何小写字母,而“[0-9]”匹配任何数字。

“ * ”匹配零个或多个在它前面的东西。例如,“x”匹配任何数量的“x”字符,“[0-9]”匹配的任何数量的数字,而“.*”匹配任何数量的任何东西。

正则表达式是区分大小写的,但是如果你希望,你能使用一个字符类匹配两种写法。例如,“[aA]”匹配小写或大写的“a”而“[a-zA-Z]”匹配两种写法的任何字母。

如果它出现在被测试值的任何地方,模式就匹配(只要他们匹配整个值,SQL模式匹配)。

为了定位一个模式以便它必须匹配被测试值的开始或结尾,在模式开始处使用“^”或在模式的结尾用“$”。

为了说明扩展正则表达式如何工作,上面所示的LIKE查询在下面使用REGEXP重写:

为了找出以“三”开头的名字,使用“^”匹配名字的开始。

FROM [user] WHERE u_name REGEXP ‘^三';

将会把u_name为 “三脚猫”等等以“三”开头的记录全找出来。

为了找出以“三”结尾的名字,使用“$”匹配名字的结尾。

FROM [user] WHERE u_name REGEXP ‘三$';

将会把u_name为“张三”,“张猫三”等等以“三”结尾的记录全找出来。

你也可以使用“{n}”“重复n次”操作符重写先前的查询:

FROM [user] WHERE u_name REGEXP ‘b{2}$';

注意:如果是中文字符,可能在使用时需要注意一下。

Visual_SQL_JOINS_V2.png

你可能感兴趣的:(mysql方法)