首页 > 代码库 > mysql 学习总结

mysql 学习总结

MYSQL的增、删、查、改
 
注册、授权
#创建一个对数据库中的表有一些操作权限的用户,其中OPERATION可以用all privileges替换,DBNAME、TABLENAME可以用*替换,表示全部
mysql> grant OPERATION on DBNAME.TABLENAME to ‘USERNAME‘@‘IP_ADDR‘ [identified by ‘PASSWD‘];
mysql> create user ‘USERNAME‘@‘IP_ADDR‘ identified by ‘PASSWD‘;
mysql> revoke OPERATION on DBNAME.TABLENAME from USERNAME;     #收回用户的某些权限
mysql> show grants for ‘USERNAME‘[@‘IP_ADDR‘];     #查询用户权限
$ mysqladmin -u USERNAME -p [OLD_PWD] password NEW_PWD     #更新密码(注:如果原来没有密码OLD_PWD就不要写)
 
mysql字段的数据类型
int[(M)]      #整型
double[(M,D)]     #双精度浮点型
date     #日期类型 格式YYYY-MM-DD 范围1000-01-01——》9999-12-31
char(M)     #字符类型
blob text    #定长字符串(会用空格填满)
varchar     #变长字符串类型
timestamp     #时间戳
 
mysql数据类型相关函数
INET_ATON(expr)     #将一个表示ip地址的字符串转换为整数
INET_NTOA(expr)     #将一个整数转换为表示ip地址的字符串
NOW()     #获取当前时间戳
TO_DAYS(timestamp)     #一年中的哪一天
DAYOFWEEK(expr)     #一周中的哪一天,周日开始,从1计数
WEEKDAY(expr)     #一周中的哪一天,周一开始,从0计数
DAYOFMONTH(expr)     #一月中的哪一天,从1计数
DAYOFYEAR(expr)     #一年中的哪一天,从1计数
MONTH(expr)          #月份1-12
DAYNAME(expr)          #星期的名字
MONTHNAME(expr)       #月份的名字
QUARTER(expr)     #一年中季度1-4
WEEK(expr)          #一年中的周数0-52
YEAR(expr)     #年份
HOUR(expr)     #小时0-23
MINUTE(expr)     #分钟0-59
SECOND(expr)          #秒0-59
PERIOD_ADD(expr1, expr2)     #增加N个月,expr1为日期字符串,expr2为增加的时间(与expr1最小单位一样)
PERIOD_DIFF(expr1, expr2)     #两个最小单位相同的日期字符串比较
DATE_ADD(expr1, INTERVAL expr2 date_type)     #增加以date_type为单位的expr2个时间间隔
DATE_SUB(expr1, INTERVAL expr2 date_type)     #减少以date_type为单位的expr2个时间间隔
 
DATA_FROMAT(expr1, format)     #将expr1表示的时间以format格式输出,其中format的相关字符含义如下:
%W 星期名字(Sunday……Saturday)
%D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。)
%Y 年, 数字, 4 位
%y 年, 数字, 2 位
%a 缩写的星期名字(Sun……Sat)
%d 月份中的天数, 数字(00……31)
%e 月份中的天数, 数字(0……31)
%m 月, 数字(01……12)
%c 月, 数字(1……12)
%b 缩写的月份名字(Jan……Dec)
%j 一年中的天数(001……366)
%H 小时(00……23)
%k 小时(0……23)
%h 小时(01……12)
%I 小时(01……12)
%l 小时(1……12)
%i 分钟, 数字(00……59)
%r 时间,12 小时(hh:mm:ss [AP]M)
%T 时间,24 小时(hh:mm:ss)
%S 秒(00……59)
%s 秒(00……59)
%p AM或PM
%w 一个星期中的天数(0=Sunday ……6=Saturday )
%U 星期(0……52), 这里星期天是星期的第一天
%u 星期(0……52), 这里星期一是星期的第一天
%% 一个文字“%”。
 
数据库的增、删、查
mysql> create database DBNAME;     #创建数据库
mysql> use DBNAME;     #连接数据库
mysql> select database();     #查看当前连接的数据库
mysql> show databases;     #查看所有的数据库
mysql> drop database DBNAME;     #删除数据库
 
表的增、删、查、改
mysql> drop table if exists TABLENAME; create table if not exists TABLENAME (KEY1 varchar(128) TYPENAME1, KEY2 TYPENAME2, ....); #建表
mysql> show tables;     #查看当前连接数据库中所有的表名
mysql> desc TABLENAME;     #查看表结构
mysql> rename table TABLENAME_OLD to TABLENAME_NEW;     #表的重命名
mysql> drop table TABLENAME;     #删除表
mysql> alter table TABLENAME add KEY TYPENAME;     #表中增加一列
mysql> alter table TABLENAME modify column KEY1 TYPENAME1 [(befor | after) KEY2] ;     #修改字段类型
mysql> alter table TABLENAME drop KEY;     #删除表的一个字段
mysql> insert into TABLENAME [(KEY1, KEY2, ....)] values(VALUE1, VALUE2, ....);     #表中插入数据
mysql> select KEY1, KEY2, ... from TABLENAME where EXPRESSION;     #查询表中数据
mysql> delete from TABLENAME where EXPRESSION;     #删除表中数据
mysql> update TABLENAME set KEY1=VALUE1, KEY2=VALUE2, .... where EXPRESSION;     #更新表中数据
注:由于mysql中不支持datetime字段设置默认值,所以只能采用timestamp,但是timestamp只能到2038年
 
表查询的高级用法
谓词:ALL(符合条件的全部)、DISTINCT(相同字段数据只返回一条)、DISTINCTROW(相同记录只返回一条)、TOP(头尾的若干记录,当使用百分比的时候,为TOP N PERCENT,N为数字)、AS(为结果字段取别名,AS前面是原名、后面为别名)
 
比较符:
= #等于      > #大于      < #小于      >= #大于等于
<= #小于等于     <> #不等于      !> #不大于      !< #不小于     NOT #用于比较表达式前表示相反
 
模式匹配(必须在LIKE之后):
%     #替代一个或者多个字符
-     #仅替代一个字符
[charlist]     #字符列中任何单一字符
[^charlist]     #不在字符列中的任何单一字符
 
[NOT] BETWEEN ... AND .. #指定要搜索的闭区间[之外]的范围
[NOT] IN     #用于[不]匹配列表中的任何一个值
ORDER BY KEY1 (ASC|DESC), KEY2 (ASC|DESC) ...    #将结果以KEY的(升/降)序排列,默认是ASC
... AND ...     #同时满足两个条件
GROUP BY KEY1, KEY2... [HAVING CONDITION]     #以KEY1、KEY2等进行分组,HAVING 调用一些聚集函数来过滤分组的查询结果
 
聚集函数:
SUM(KEY)     #求和
AVG(KEY)     #求均值
COUNT(KEY)     #计数
COUNT(*)     #所有记录计数
MAX(KEY)          #最大值
MIN(KEY)          #最小值
VAR(KEY)          #方差
STDEV(KEY)     #标准差
FIRST(KEY)     #第一个
LAST(KEY)     #最后一个
CONCAT(KEY1, KEY2, ...)     #将keys连接起来成为字符串
 
#将查询结果写入到另一个表TABLENAME1中
mysql> select KEY1, KEY2, ... into TABLENAME1 from TABLENAME2 where EXPRESSION;
 
#将从TABLENAME1、TABLENAME2两个表中的查询数据合并展示
mysql> select KEY1, KEY2, ... from TABLENAME1 where EXPRESSION1 union select KEY3, KEY4, .. from TABLENAME2 where EXPRESSION2;
 
#TABLENAME1表中key3大于子查询结果的记录
mysql> select KEY1, KEY2, ... from TABLENAME1 where KEY3 (>|=|<|<>) (ANY|ALL|SOME) (select KEY3 from TABLENAME2 where EXPRESSION);
 
#TABLENAME1表中key3[不]属于子查询结果列表中的记录
mysql> select KEY1, KEY2, ... from TABLENAME1 where KEY3 [NOT] IN (select KEY3 from TABLENAME2 where EXPRESSION);
 
#根据子查询的结果来决定是否执行从TABLENAME1表中进行查询
mysql> select KEY1, KEY2, ... from TABLENAME1 where exists (select KEY3 from TABLENAME2 where EXPRESSION);
 
 
查询(删除)5min之前的内容
select * from email_info where minute(now() - c_time) > 5;  该方法如果跨整点就会有问题
select * from email_info where timestampdiff(minute, c_time, now()) > 5;
delete from email_info where  timestampdiff(minute, c_time, now()) > 5;
注:minute是将时间转换成分钟的函数,类似的还有year、dayofyear、month、monthname、dayofmonth、week、weekday、dayname、hour、minute、second等
 

索引、视图、触发器、存储过程、游标、事务
 
视图是虚拟表,相当于一个sql语句的别名,特定情况下可以对视图进行增、删、改操作,前提是:没有group by分组、没有union连接、没有子查询、没有并、没有聚集函数、没有DISTINCT、导出(计算)列
索引、视图的增、删、改
mysql> create index INDEX_NAME on TABLENAME(KEY);     #创建索引
mysql> show index from TABLENAME;     #查询索引
mysql> drop index INDEX_NAME;     #删除索引
 
mysql> create view VIEW_NAME(KEY1, KEY2, ...) as select KEY3, KEY4 from TABLENAME;     #创建视图
mysql> drop view VIEW_NAME;     #删除视图
 
存储过程简单来说,就是为以后的使用而保存的一条或多条MySQL语句的集合。可将其视为批文件,虽然它们的作用不仅限于批处理。存储过程3个主要的好处:简单、安全、高性能。
存储过程的创建、删除、调用
#创建一个存储过程PROC_NAME, 其中DELIMITER//告诉命令行实用程序使用//作为新的语句结束符,可以看到表示存储过程结束的END定义END//而不是END;作为语句结束。最后使用DELIMITER; 恢复原来的语句结束符,因为mysql中;默认为结束符,为了存储过程正常使用,所以需要替换procedure中的存储过程。
#参数中的IN/OUT表示参数是传入的还是输出的,参数是无类型的,可以是一个简单变量,也可以是一个表名(此时可以直接select @arg来查询结果),通常存储过程使用select ... into ... 语句将结果保存到输出变量中
 
delimiter //
create procedure PROC_NAME([IN/OUT] ARG1 TYPENAME, [IN/OUT]ARG2 TYPENAME, ...)
BEGIN
     SQL_SENTENCES;
END//
delimiter ;
 
mysql> call PROC_NAME(@arg1, @arg2, ...);     #调用存储过程,mysql中变量前面需要加@
mysql> drop procedure PROC_NAME if exists;     #删除存储过程
mysql> show create procedure PROC_NAME;          #查看创建存储过程的sql语句
mysql> show procedure status like ‘EXP‘;     #查看存储过程的相关信息
 
游标是一个存储在MySQL服务器上的数据库查询,它不是一条SELECT语句,而是被该语句检索出来的结构集。在存储了游标之后,应用程序可以根据需要滚动或浏览或更改其中的数据。
游标使用步骤:
  1. 使用前需要先声明
  2. 使用时必须打开游标(执行相关的sql查询语句),游标打开后使用FETCH语句分别访问每一行、FETCH指定检索什么数据、存储在何地,同时会将游标指向下一行(即下一条FETCH就会检索下一行)
  3. 根据需要行数据,使用完毕后必须关闭
declare CURSOR_NAME cursor for select KEY1, KEY2, ... from TABLENAME;     #声明一个游标
open CURSOR_NAME;     #打开游标
FETCH CURSOR_NAME into TABLENAME2;     #将游标获取的一行记录存到数据表中。
close CURSOR_NAME;      #关闭游标
 
触发器是MySQL响应INSERT、UPDATE、DELETE三个中的任意一个语句而自动执行的一条sql语句。触发器创建条件:名称唯一、有具体表关联(视图、临时表不行)、与相关的操作(INSERT/UPDATE/DELETE)关联响应、在关联语句执行前/后执行。
触发器的创建、删除
mysql> create trigger TRI_NAME (before/after) (INSERT/UPDATE/DELETE) on TABLENAME for each row BEGIN SQL_SENTENSE END;
mysql> drop trigger TRI_NAME;
 
事务处理可以用来维护数据库的完整性,它保证成批的mysql操作要么完全执行,要么完全不执行。管理事务处理的关键在于将sql语句组分解成逻辑快,并明确规定数据何时应该回退、何时不回退。 start transaction 表示事务的开始。
事务的创建
start transaction;     #事务开始
SQL_SENTENCE1;
SQL_SENTENCE2;
...
(commit/rollback);     #事务提交/回滚
#注:通常情况下是判断上一条sql语句的执行结果,如果执行失败,则执行rollback进行回滚操作,若事务中所有的sql语句成功执行,则执行commit将更改实际写到数据库中。
 

数据导入、导出
 
导入txt格式的数据
mysql> load data local infile ‘FILENAME.txt‘ into table TABLENAME; #注:txt中各字段用tab分隔
 
导入sql格式的数据库 (注:这里的sql文件是包含建表语句和表中数据)
mysql> use DBNAME; source FILENAME.sql     #方法一
$ mysqldump -u USERNAME -p DBNAME <FILENAME.sql  #方法二
$ mysql -u USERNAME -p -D DBNAME <FILENAME.sql     #方法三
 
导出整个数据库中所有的表结构
$ mysqldump -uUSERNAME -p [-hIP_ADDR] DBNAME>FILENAME.sql #包含建表语句以及插入数据的insert语句
$ mysqldump -uUSERNAME -p -d [-hIP_ADDR] DBNAME >FILENAME.sql #仅包含建表语句
$ mysqldump -uUSERNAME -p [-hIP_ADDR] --no-create-info DBNAME>FILENAME.sql #仅包含插入数据的insert
$ mysqldump -uUSERNAME -p [-hIP_ADDR] DBNAME TABLENAME >FILENAME.sql #导出一张表的全部内容

mysql 学习总结