• 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 #导出一张表的全部内容
  • 相关阅读:
    XML-Signature 语法和签名
    ZooKeeper相关资料集锦
    分布式锁
    spring-boot 知识集锦
    Spring boot druid 多数据源配置
    常见 SQL 语句的加锁分析
    fastjson反序列化多层嵌套泛型类与java中的Type类型
    Clean ThreadLocals
    java AOP Before, After, AfterReturning, AfterThrowing, or Around 注解
    java 线程间的通信 (wait / notify / notifyAll)
  • 原文地址:https://www.cnblogs.com/sxhlinux/p/6246508.html
Copyright © 2020-2023  润新知