Mysql杂记

╄→гoц情女王★ 提交于 2020-01-10 00:56:03

-- SELECT * FROM tb_dept t,time tt WHERE tt.id=3 ;
1、SELECT id FROM tb_dept  WHERE id =3 UNION ALL SELECT id FROM time WHERE id=3;

CREATE TABLE `employee_tbl` (
  `id` int(11) NOT NULL,
  `name` char(10) NOT NULL DEFAULT '',
  `date` datetime NOT NULL,
  `singin` tinyint(4) NOT NULL DEFAULT '0' COMMENT '登录次数',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--2、 插入多条数据 INSERT INTO alter_test(name,created,updated) VALUES('Tina',SYSDATE(),SYSDATE()),('Jame',SYSDATE(),SYSDATE());

SELECT  * FROM employee_tbl;
3、-- 查询分组并统计总数用 with ROLLUP
SELECT name, SUM(singin) as singin_count FROM  employee_tbl GROUP BY name WITH ROLLUP;
--4、 mysql正则
-- 查找name字段中以'ok'为结尾的所有数据匹配是REGEXP 不匹配前面加上not

SELECT dept FROM tb_dept WHERE dept REGEXP 'R$';

-- 5、事务:
-- 原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)


CREATE TABLE `aa` (
`id`  int NOT NULL AUTO_INCREMENT ,
`column_name`  varchar(20) NULL ,
PRIMARY KEY (`id`)
);
-- 6、alter
-- 重命名
ALTER TABLE aa RENAME TO alter_test;
-- 修改列名
ALTER TABLE alter_test CHANGE column_name name VARCHAR(10);
-- 显示表的状态
SHOW TABLE   STATUS LIKE 'alter_test';
-- 修改字段类型
ALTER TABLE alter_test MODIFY name datetime;

-- --7、 索引
-- 创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。
-- 
-- 实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
-- 
-- 上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
-- 
-- 建立索引会占用磁盘空间的索引文件。
-- 删除索引是drop
-- 索引失效:     1、.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因);要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引
--                          2、对于多列索引,不是使用的第一部分(第一个),则不会使用索引;
--                          3、like查询是以%开头;
--                          4、如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引;
--                          5、查询条件使用函数在索引列上,或者对索引列进行运算;
--                          6、not in ,not exist
--                        全值匹配我最爱,最左前缀要遵守;
--                        带头大哥不能死,中间兄弟不能断;
--                        索引列上少计算,范围之后全失效;
--                        LIKE百分写最右,覆盖索引不写星;
--                        不等空值还有or,索引失效要少用。
--                     left join(左连接):右表创建索引。
--                     right join(右连接):左表创建索引。
--                     简记:左右外连接,索引相反建(left:右表建,right:左表建)。
-- 8、复制表
CREATE TABLE test SELECT * FROM alter_test where 1=2; /*复制表结构*/

CREATE TABLE test1 SELECT * FROM alter_test /*复制表结构和数据*/
-- 9、获取服务器元数据
--             SELECT VERSION( )    服务器版本信息
--             SELECT DATABASE( )    当前数据库名 (或者返回空)
--             SELECT USER( )    当前用户名
--             SHOW STATUS    服务器状态
--             SHOW VARIABLES    服务器配置变量
-- 10、统计重复数据
SELECT * FROM test1 GROUP BY NAME HAVING COUNT(*) >1;

-- 如果你需要读取不重复的数据可以在 SELECT 语句中使用 DISTINCT 关键字来过滤重复数据。

-- 删除重复数据 复制表(结构和数据),然后删除原表,再修改临时表名称

CREATE TABLE temp SELECT *FROM test1 GROUP BY name;
 
DROP TABLE test1;

ALTER TABLE temp RENAME TO test1;
-- 11、导出数据 导出路径在mysql安装盘的data/数据库名/文件名
SELECT * FROM test1 INTO OUTFILE 'test.txt';
-- 12、 导入数据
--      mysql 命令导入;mysql -uroot -p123456 < sql的文件位置;
--      source命令导入:mysql> create database abc;      # 创建数据库
--                                           mysql> use abc;                  # 使用已创建的数据库 
--                                             mysql> set names utf8;           # 设置编码
--                                             mysql> source sql文件的位置  # 导入备份数据库
--             LOAD DATA 导入数据:LOAD DATA LOCAL INFILE 'D:/mysql/data/xiaojie/test.txt' INTO TABLE test;、
--      mysqlimport 导入数据
-- 13、sql函数
ASCII(str):返回字符串 s 的第一个字符的 ASCII 码。eg: SELECT ASCII(name) FROM test;
CHAR_LENGTH(str):返回字符数。eg :SELECT CHAR_LENGTH(name) FROM test;
CHARACTER_LENGTH(str):返回字符数. eg:SELECT CHARACTER_LENGTH(name) FROM test;
CONCAT(str1,str2,...) :字符串 s1,s2 等多个字符串合并为一个字符串。eg: SELECT CONCAT('xiaoming','xiaoli','xiaohua') as NAME;
CONCAT_WS(separator,str1,str2,...):字符串连接 但是中间有个分隔符 eg:SELECT CONCAT_WS('-','xiaoming','xiaoli','xiaohua') as NAME;
FIELD(str,str1,str2,str3,...) 返回第一个字符串 str 在字符串列表(str1,str2...)中的位置; SELECT FIELD('miss','miss','start','skssed','miss','miss');
FIND_IN_SET(s1,s2) 返回在字符串s2中与s1匹配到第一个字符串的位置;SELECT FIND_IN_SET('b','a,b,c,d,e,f,b');
FORMAT(X,D):函数将数字x格式化保留小数后d位,最后一位四舍五入;SELECT FORMAT('2541231.23549',2); 输出结果--------2,541,231.24;
INSERT(str,pos,len,newstr):用newstr替换字符串str从pos开始长度为len的字符串; SELECT INSERT("www.baidu.com",2,6,"sina");----------wsinadu.com;
LOCATE(s1,s):从s中获取s1第一次出现的位置: SELECT LOCATE('china','ilovechina');-----------6
LCASE(s)/LOWER(s):将 s转小写字母: SELECT LCASE('ILOVEYOU');
LEFT(str,len):选取字符串左侧的len个字符; SELECT LEFT('china','3');
LPAD(str,len,padstr):用padstr添加到字符串(前面添加)str是字符长度到len: SELECT LPAD('aa',5,'bb');-----bbbaa;
LTRIM(str):去掉字符串str开始处的空格;SELECT LTRIM('  study day day up');----------study day day up
MID(s,n,len)/SUBSTR(s, start, length)/SUBSTRING(s,n,len):从字符串 s 的 n 位置截取长度为 len 的子字符串,同 SUBSTRING(s,n,len);SELECT MID('ilove',2,4);-----------love;
POSITION(s1 IN s):从字符串 s 中获取 s1 的开始位置:SELECT POSITION('s' IN 'sabcdsdyu');
REPEAT(str,count): 将字符串str重复几次: SELECT REPEAT ('a',5);
REPLACE(s,s1,s2):将字符串 s2 替代字符串 s 中的字符串 s1: SELECT REPLACE('goodgoodstudy','o','a');--------gaadgaadstudy;
REVERSE(s):倒置字符串顺序; SELECT REVERSE('abcd');
`RIGHT`(str,len):返回字符串右边的len长度字符: SELECT RIGHT('good',1);
TRIM(s):去掉两端的空格: SELECT TRIM('   ssss   ');
UCASE(str)/UPPER(str):转字符为大写; SELECT UPPER('xioaming');
/*************************数字函数***********************************/
ABS(X):绝对值
ACOS(X)等三角函数:求反余弦值; SELECT ACOS(1);
CEIL(X)/CEILING(X):向上取整 SELECT CEIL(-1.5);
DEGREES(X):将弧度数转为角度:SELECT DEGREES(3.14159365358979);
n DIV m :SELECT 10 DIV 2;----5;
EXP(X):求自然数e的x次幂的值;
FLOOR(X):向下取整; SELECT FLOOR(-1.5);
GREATEST(value1,value2,...): 返回最大值;
LEAST(value1,value2,...):返回最小值;
POW(X,Y)/POWER(X,Y):返回x的y次幂;
RAND():返回0-1的随机数; SELECT RAND();
ROUND(X):返回距离x最近的整数: SELECT ROUND(-2.89);
SQRT(X):返回x的平发根: SELECT SQRT(4);
TRUNCATE(X,D) 对x保留小数 不会四舍五入 SELECT TRUNCATE(2.654523654,1);
/*************************日期函数***************************************************/
ADDDATE(d,n): 在当前日期增加几天 SELECT ADDDATE('2020-01-04',3);
ADDTIME(d,n):在当期时间加上几秒 SELECT ADDTIME('2020-01-07 16:04:25',35);
CURRENT_DATE()/CURDATE():返回当前日期 SELECT CURDATE();------2020-01-07;
`CURRENT_TIME`()/CURDATE();当前时间 SELECT CURRENT_TIME();
`CURRENT_TIMESTAMP`();当前日期和时间 SELECT CURRENT_TIMESTAMP();
DATEDIFF(d1,d2):返回时间差天数d1-d2; SELECT DATEDIFF('2019-01-01','2020-01-01'); 
DATE_FORMAT(d,f);格式化时间;
DATE_SUB(date,INTERVAL expr type) 当前日期减去: SELECT DATE_SUB(NOW(),INTERVAL 2 DAY);
DAYNAME(date): 返回周几 ;
DAYOFMONTH(date): 计算是本月的第几天; SELECT DAYOFMONTH(NOW());
`DAY`(date): 返回天数;
PERIOD_DIFF(P1,P2) 返回月份差: SELECT PERIOD_DIFF('2020-01-01','2020-01-02');
SEC_TO_TIME(seconds)将秒数改成时分秒: SELECT SEC_TO_TIME(120);
STR_TO_DATE(str,format):将字符串转为时间格式: SELECT STR_TO_DATE("August 10 2017", "%M %d %Y");
/*****************************高级函数***********************************/
BIN(N):放回二进制编码 : SELECT BIN(3);
CONNECTION_ID():服务器的连接数: SELECT CONNECTION_ID();
IF(expr,v1,v2):如果满足表达式值为v1 不然值为v2 SELECT IF(1>2,1,2); ------2
IFNULL(v1,v2);如果为null v1不然v2 ;
NULLIF(v1,v2):比较两个字符串相等返回null 不然返回v1: SELECT NULLIF('a','b');
SESSION_USER();当前用户: SELECT SESSION_USER(); --------root@localhost;

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!