USE DATABASE -- 使用数据库
CURRENT_DATE --当前日期
CURRENT_TIME --当前时间
SHOW DATABASES --显示数据库
SHOW TABLES --显示表
DESCRIBE 表名 --显示表结构
LOAD DATA LOCAL INFILE 文件路径 INTO TABLE 表 LINES TERMINATED '\r\n' --把本地文件导入table,字段之间用tab分开
AND优先级大于OR
SELECT DISTINCT 字段 FROM 表 -- 查询唯一
SELECT * FROM 表 ORDER BY 字段一 ASC,字段二 DESC --按字段一升序,字段二降序
YEAR() 年份 MONTH DAYOFMONTH HOUR MINUTE SECOND依次 DATE()当前年月日 TIME()当前时分秒 NOW()当前详细时间CURDATE()当前年月日CURTIMR()当前时分秒
RIGHT(字段,N) --返回字段右侧N个字符LEFT依次
返回BOOLEAN型的表达式 true返回1 false返回0(可以进行加减等数学运算)
IS NULL IS NOT NULL--为空非空
DATE_ADD(CURDATE(), INTERVAL 1 MONTH) --在当前日期上加一个月.可用于全部日期函数,可以为负数
MOD(bar,n) --返回bar按n取模
REGEXP -- 正则匹配
COUNT() GROUP BY--1:仅查询总数不需gb 2:select的其他字段必须group by,可复数
联合查询可以同一个表 from table t1,table t2 where t1.id = t2.id
SELECT DATABASE();查询当前使用的数据库名
SHOW INDEX FROM 表 --返回表 的索引(index)
MAX() 最大值 可以GROUP BY; SELECT * FROM 表 B1 WHERE 字段=(SELECT MAX(字段) FROM 表 B2 WEHRE B1=B2)查询最大值所在的列 ,最小值MIN()依次
使用用户变量@A SELECT @A:=MIN(字段) ,@B:=MAX(字段) FROM 表;SELECT * FROM 表 WHERE 字段=@A OR 字段=@B
创建表时数值型字段:AUTO_INCREMENT 自动增长 UNSIGNED 无符号/未签署(非负) ZEROFILL 零填充 前面不足空位用0补足 ,如001
×× SELECT year,month,BIT_COUNT(BIT_OR(1<<day)) AS days FROM t1 GROUP BY year,month; 该查询计算了在表中按年/月组合的不同天数,可以自动去除重复的询问。BIT_COUNT()返回二进制中‘1’出现次数BIT_OR()二进制进行‘或操作’1<<day位移操作。或操作时同一天即同一位上两个一进行‘或’操作,还是1个‘1’,经典算法
LAST_INSERT_ID() 最后插入的id;插入多行时返回插入的第一条的id;ALTER 表 AUTO_INCREMENT = N 把表的自增长基数改成N;复合主键中有一项自增长时,自增长的主键是相对于另一主键增长而不是全局增长
CONCAT(N个参数)连接函数,把多个字段连接起来,如果中间有NULL,返回NULL;中间有BIT返回BIT ;CONCAT(N个参数)+0 返回数字
\转义符 \0 ascii ;\' \" \\ \% \_ \b退格符 \t tab符 \r回车 \n换行
SELECT 0xNNN 十六进制 NNN转换字符串,转换数字CAST(0xNNN,UNSIGNED);HEX(0x)字符串转换16进制数字
true和1,false和0可以自动转换
可以使用b'value'符号写位字段值。value是一个用0和1写成的二进制值。(b BIT(8)查询时 b+0 十进制 | BIN(b+0)二进制 | OCT(b+0)八进制 | HEX(b+0)十六进制
变量定义:SET
系统变量:系统变量分为GLOBAL和SESSION两种。设置方法:SET SESSION[GLOBAL] PARAM='VALUE'或者SET @@SESSION(@@GLOBAL).PARAM='VALUE'如果不指定默认为session;查询:SELECT @@session.PARAM;SHOW SESSION VARIABLES like 'PARAM';对于SHOW VARIABLES,SELECT @@session MySQL返回SESSION值(如果存在),否则返回GLOBAL值。SHOW SESSION VARIABLES如果不指定GLOBAL、SESSION或者LOCAL,MySQL返回SESSION值。
GREATEST()最大值 RAND()随机数 LEAST()最小值
a XOR b -- a或b只有一项成立为true
CASE 值/表达式 WHEN 结果1 THEN 执行1 WHEN 结果2 THEN 执行2 ELSE 执行3 END 类似switch case
CASE WHEN 表达式1 THEN 结果1 WHEN 表达式2 THEN 执行2 ELSE 执行3 END
IF(表达式,结果A,结果B)表达式成立么?成立为结果A,不成立为B
STRCMP(STR1,STR2)比较字符串,忽略大小写
IFNULL(expr1,expr2) expr1是否为NULL,为NLL返回expr2,不是返回EXPR1
1/0 一除以零的结果为NULL
NULLIF(EXPR1,EXPR2)-- EXPR2和EXPR1是否相等,相等返回NULL,否则返回EXPR1
ASCII() --返回字符ascii,如果为字符串,返回第一个字符的,空字符串为0,NULL 返回NULL
BIT_LENGTH() -- bit的长度
CHAR(N1,N2……) -- 按ASCII把数字转换成字符,N为整数,超过255被认为是两个字符
LENGTH(),CHAR_LENGTH() -- length为字节长度,CHAR_LENGTH为字符长度
CONCAT_WS(分隔符,STR1,STR2……)链接字符串,并用分隔符分开,会略null
ELT(M,S1,S2,……SN)-- 返回S数组中的第M个值,如果超出范围返回NULL
FIELD(R,S1,S2,……SN)-- 返回R在S数组中的位置,从1开始,重复则返回第一个位置
FIND_IN_SET(STR,STRLIST) -- 返回str在strlist中的位置,重复则返回第一个位置
INSTR(STR,SUSTR) --返回str在sustr中第一次出现的位置
INSRTY(被插入的字符串,开始位置,长度,插入的字符串) -- 向字符串中插入另一字符串
LOWER()-- 转小写 -- UPPER()转大写
LOAD_FILE()-- 读取文件
LOCATE(STR,SUBSTR)返回str在substr中第一次出现的位置
LOCATE(STR,SUBSTR,BEGIN)从begin的位置开始,返回str在SUBSTR中第一次出现的位置,返回值是相对整个substr来说的
LPAD(STR,len,SUB) 把SUB不断添加到str左边,到str的长度等于len,如果str的开始长度小于len,则从str的左边除去差值 RPAD为右侧添加,其余全一样
LTRIM(),RTRIM(),TRIM()-- 分别去左边,右边,前后空格
SUBSTRING(str,begin,len)/MID(str,begin,len) -- 截取字符串SUBSTRING(str,pos) , SUBSTRING(str FROM pos) SUBSTRING(str,pos,len) , SUBSTRING(str FROM pos FOR len)
REPEAT(str, n); -- 返回str反复叠加N次,n<1时返回 ''
REPLACE(str,from_str,to_str) -- 把str中的每一个from_str都替换为to_str
REVERSE(STR) str反向排列 ‘abc’-> 'cba'
×××SUBSTRING_INDEX(str,delim,count) -- 返回delim第count次出现之后的字符串,如果为负数则从右边开始算
×××TRIM除了去除空格还可以去除字符,格式为TRIM(LEADING/TRAILING/BOTH 要去除的字符 FROM 字符串)leading位置默认为both
CRC32(STR)-- 返回crc32
××××若要在i ≤ R ≤ j 这个范围得到一个随机整数R ,需要用到表达式 FLOOR(i + RAND() * (j – i + 1))。
×××××???select * from table where DATE_SUB(CURDATE(), INTERVAL INTERVAL 1 MONTH) <= date(column_time);查询近一个月内的字段
DAYNAME(DATETIME) 返回星期几
DAYOFWEEK() 周的序列 周日 =1 !!!!DAYOFYEAR(date)
FROM_DAYS(N) 给定一个天数 N, 返回一个DATE值。365以下都是0000-00-00 你运算TO_DAYS(date)
LAST_DAY() 返回这个月的最后一天的日期
MAKEDATE(year,dayofyear) 给出年份值和一年中的天数值,返回一个日期。dayofyear 必须大于 0 ,否则结果为 NULL
MAKETIME(hour,minute,second)
MONTHNAME(date) 返回date 对应月份的全名。
mysql的“周期” --YYYYMM or YYMM PERIOD_ADD(p,n)周期p增加n个月 PERIOD_DIFF(P1,P2)P1,P2相差的月份
QUARTER(date) 返回季度:春夏秋冬1234
SEC_TO_TIME(seconds) 把秒数转换成时间
WEEK(date,model)第几周,model可不写,但是出现跨年周时处理……记参数麻烦--0本年度中有一个周日 1本年度中有3天以上2本年度中有一个周日3 本年度中有3天以上 4本年度中有3天以上5 本年度中有一个周一 6本年度中有3天以上7本年度中有一个周一
------------全文检索-------------------
--表必须是MyISAM的(ENGINE=MyISAM)
--创建索引FULLTEXT( FULLTEXT KEY `title` (`title`,`body`))
--SELECT * FROM 表 WEHRE MATCH(title,body) AGAINST('关键字') MATCH的参数必须对应全部的索引字段
--如果查询MANTH(),返回结果是相关度,按这个结果排列就是按相似性排列
--SELECT id, body, MATCH (title,body)
AGAINST('Security implications of running MySQL as root') AS score
FROM articles WHERE MATCH (title,body) AGAINST
('Security implications of running MySQL as root') order by score desc;
注意:不能 where score!=0
-- 关键字不能小于4个字符(默认,可更改)
-- 默认停止字不能被搜索(默认,可更改)
-- 出现频率过高的会被认为成停止字,查询结果为0(50%)
-------boolean全文检索---------
-- 列子 :SELECT * FROM articles MATCH(title,body) AGAINST('+MYSQL -YOURSQL' IN BOOLEAN MODE)
-- 不使用50%的限制
-- 相关性强弱不使用,相关就是1,无关就是0
-- 仍然有关键字长度和默认停止字限制
-- ‘+’必须出现的关键字
‘-’一定不出现的关键字
‘’无符号表示可有可无,但是出现的话优先级就高,类似普通检索的相似度。连个无符号同时出现表示至少出现一个
‘>’‘<’优先级高低 如' +(>aaaaa <bbbbb)'。查询有aaaaa或bbbbb的字段,但是有aaaa的优先级高
‘~’含有则优先级低,相当于弱一级的‘-’
‘*’通配符
‘""’短语
-- AGAINST( ‘’WITH QUERY EXPANSION)扩展查询,例如:查database还会查出mysql oracle等
-----------------结束结束--------------------------
BENCHMARK(count,expr) 重复count 次执行表达式 expr
CHARSET(str) 返回字符串自变量的字符集。
ROW_COUNT() -- 操作影响的行数
GET_LOCK(NAME,TIME) 创建锁;IS_FREE_LOCK (NAME)是否存在锁;RELEASE(NAME)解除锁
IS_USED_LOCK(str) 检查名为str的锁是否正在被使用(换言之,被封锁)。若被封锁,则返回使用该锁的客户端的连接标识符。否则返回 NULL。
UUID()独一无二的ID是一个由5位十六进制数的字符串表示的128比特数字 ,其格式为 aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee :
SELECT A,GROUP_CONCAT(B) FROM T GROUP BY A;把查询出来的字段连接
group by时,后面加WITH ROLLUP表示最后有汇总项。和ORDER BY不能同时使用
----------触发器--------------
DELIMITER | -- 定义结束符|
CREATE TRIGGER 触发器名称 BEFORE/AFTER INSERT/DELETE/UPDATE ON 表
FOR EACH ROW
BEGIN
SQL语句 -- OLD和NEW:INSERT中只有NEW,DELETE 只有OLD,UPDATE都有
END
| -- 结束
DELIMITER ; -- 把结束符改回来
-----------视图--------------
CREATE VIEW SELECT * FROM TABLE
------------存储过程----------------
创建存储过程要有proc表
创建:
DELIMITER | -- 定义结束符|
CREATE PROCEDUCE my_proc( OUT param1 INT) -- IN表示传入,OUT表示回传,就是返回值,INOUT就是都是
beginLabel:BEGIN -- 块,beginLabel是别名,可用可不用
DECLARE a VARCHAR(5) DEFAULT 'bob'; -- 定义参数
DECLARE b INT;
DECLARE c DATETIME;
SELECT t.cola,t.colb,t.colc INTO a,b,c FROM table t;
IF DATE = NOW() THEN -- 条件
ELSEIF 2>0 THEN
ELSE
END IF
WHILE 2<2 DO -- 循环
END WHILE
END beginLabel
执行:
CALL my_proc(@a);
SELECT @a;
| -- 结束存储过程
DELIMITER ; -- 把结束符改回来