mysql 学习笔记

Posted qunxuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 学习笔记相关的知识,希望对你有一定的参考价值。

mysql -uroot -p[admin]  //登录命令mysql> create database test1;  //创建数据库test1

mysql> show databases;  //查看数据库

mysql> use test1;  //选择数据库

mysql> show tables;  //查看数据表

mysql> drop database test1;  //删除test1数据库

mysql> create table emp(ename varchar(10),hiredate date, sal decimal(10,2),deptno int(2));  //创建一张表

mysql> desc emp;  //查看表的定义

mysql> show create table emp \\G;  //查看更全面的表定义信息

mysql> drop table emp;  //删除表

mysql> alter table emp modify ename varchar(20);  //修改表类型

mysql> alter table emp add column age int(3);  //增加表字段

mysql> alter table emp drop column age;  //删除表字段

mysql> alter table emp change age age1 int(4);  //字段改名

mysql> alter table emp add birth date after ename;  //修改字段排列顺序

mysql> alter table emp modify age int(3) first;  //修改字段排列顺序

mysql> alter table emp rename emp1;  //更改表名

mysql> insert into emp (ename,hiredate,sal,deptno) values(\'zzx1\',\'2000-01-01\',\'2000\',1);  //插入一条记录

mysql> insert into emp values(\'lisa\',\'2003-02-01\',\'3000\',2);  //也可以不用指定字段名称,但是values后面的顺序应该和字段的排列顺序一致

mysql> insert into emp (ename,sal) values(\'dony\',1000);  //插入一条记录

mysql> select * from emp;  //查看表中全部记录内容

mysql> select ename,hiredate,sal,deptno from emp;  //等同于上面一句

 

mysql> insert into dept values(1,\'dept1\'),(2,\'dept2\');  //可以一次性插入多条记录

mysql> update emp set sal=4000 where ename=\'lisa\';  //更新表记录

mysql> update emp a,dept b set a.sal=a.sal*b.deptno,b.deptname=a.ename where a.deptno=b.deptno;  //update命令可以同时更新多个表中数据

mysql> delete from emp where ename=\'dony\';  //删除表记录

mysql> delete a,b from emp a,dept b where a.deptno=b.deptno and a.deptno=1;  //删除多个表的数据

注意:不管是单表还是多表,不加where条件将会把表的所有记录删除,所以操作时一定要小心。

 

mysql> select distinct deptno from emp;  //查询不重复的记录

mysql> select * from emp where deptno=1;  //条件查询

mysql> select * from emp where deptno=1 and sal<3000;  //多个条件查询

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

排序和限制

select * from tablename [where condition] [order by field1 [desc|asc], field2 [desc|asc],.....fieldn[desc|asc]]

desc:表示按照字段进行降序排列

asc:表示升序排列,如果不写此关键字默认是升序排列。

mysql> select * from emp order by sal;

mysql> select * from emp order by deptno, sal asc;

对于排序后的记录,如果希望只显示一部分,而不是全部,可以使用limit关键字来实现。

select ...[limit offset_start,row_count]

offset_start表示记录的起始偏移量,row_count表示显示的行数。

mysql> select * from emp order by sal limit 3;

mysql> select * from emp order by sal limit 1,3;  //显示emp表中按照sal排序后从第二条记录开始,显示3条记录

注意:limit属于MySQL扩展SQL92后的语法,在其他数据库上并不能通用。

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

聚合

select [field1,field2,...fieldn] fun_name

from tablename

[where where_contition]

[group by field1, field2,....fieldn

[with rollup]]

[having where_contition]

fun_name:表示要做的聚合操作,也就是聚合函数,常用的有sum(求和)、count(*)(记录数)、max(最大值)、min(最小值)。

group by 关键字表示要进行分类聚合的字段,比如要按照部门分类统计员工数量,部门就应该写在group by 后面。

with rollup是可选语法,表明是否对分类聚合后的结果进行再汇总。

having关键字表示对分类后的结果再进行条件的过滤。

注意:having和where的区别在于having是对聚合后的结果进行条件的过滤,而where是在聚合前就对记录进行过滤,如果逻辑允许,我们尽可能用where先过滤记录,这样因为结果集减小,将对聚合的效率大大提高,最后再根据逻辑看是否用having进行再过滤。

mysql> select count(1) from emp;  //要emp表中统计公司的总人数

mysql> select deptno,count(1) from emp group by deptno;  //在此基础上,要统计各个部门的人数

mysql> select deptno,count(1) from emp group by deptno with rollup;  //更细一些,既要统计各部门人数,又要统计总人数

mysql> select deptno,count(1) from emp group by deptno having count(1)>1;  //统计人数大于1人的部门

mysql> select sum(sal),max(sal),min(sal) from emp;  //最后统计公司所有员工的薪水总额、最高和最低薪水。

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

表连接

当需要同时显示多个表中的字段时,就可以用表连接来实现这样的功能。

从大类上分,表连接分为内连接和外连接,它们之间的最主要区别是内连接仅选出两张表中互相匹配的记录,而外连接会选出其他不匹配的记录。我们最常用的是内连接。

mysql> select ename,deptname from emp,dept where emp.deptno=dept.deptno;

外连接有分为左连接和右连接。

左连接:包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录。

右连接:包含所有的右边表中的记录甚至是左边表中没有和它匹配的记录。

mysql> select ename,deptname from emp left join dept on emp.deptno=dept.deptno;  //查询emp中所有用户名和所在部门名称。

mysql> select ename,deptname from dept right join emp on dept.deptno=emp.deptno;

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

子查询

某些情况下,当进行查询的时候,需要的条件是另外一个select语句的结果,这个时候,就要用到子查询。用于子查询的关键字主要包括in、not in、=、!=、exists、not exists等。

mysql> select * from emp where deptno in(select deptno from dept);

mysql> select * from emp where deptno = (select deptno from dept limit 1);  //如果子查询记录数唯一,还可以用=代替in

mysql> select * from emp where deptno in(select deptno from dept);

mysql> select emp.* from emp ,dept where emp.deptno=dept.deptno;    //转换为表连接

注意:子查询和表连接之间的转换主要应用在两个方面。

MySQL4.1以前的版本不支持子查询,需要用表连接来实现子查询的功能。

表连接在很多情况下用于优化子查询。

 

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

记录联合。

将两个表的数据按照一定的查询条件查询出来后,将结果合并到一起显示出来,需要用union和union all 关键字来实现这样的功能。

select * from t1

union|union all

select * from t2

....

union|union all

select * from tn;

union和union all的主要区别是union all 是把结果集直接合并在一起,而union是将union all 后的结果进行一次distinct,去除重复记录后的结果。

//将emp和dept表中的部门编号的集合显示出来

mysql> select deptno from emp
    -> union all
    -> select deptno from dept;

//如果希望将结果去掉重复记录后显示

mysql> select deptno from emp
    -> union
    -> select deptno from dept;

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

DCL语句

DCL语句主要是DBA用来管理系统中的对象权限时使用,一般的开发人员很少使用。

//创建一个数据库用户z1,具有对sakila数据库中所有表的select/insert权限

mysql> grant select, insert on sakila.* to \'z1\'@\'localhost\' identified by \'123\';

mysql> quit

E:\\>mysql -uz1 -p123

mysql> use sakila

mysql> insert into emp values(\'bzshen\',\'2005-05-01\',3000,\'3\');

mysql> quit

 

//由于权限变更,需要将z1的权限变更,收回insert,只能对数据进行select操作。

E:\\>mysql -uroot -p

mysql> revoke insert on sakila.* from \'z1\'@\'localhost\';

mysql> exit

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

按照层次看帮助

mysql> ? contents  //显示所有可供查询的分类

mysql> ? data types  //对用户感兴趣的内容进一步查看

mysql> ? int

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

快速查阅帮助

mysql> ? show

mysql> ? create table

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

常用的网络资源

http://dev.mysql.com/downloads

http://dev.mysql.com/doc

http://bugs.mysql.com

http://www.mysql.com/news-and-events/newsletter

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

严格数值类型(integer、smallint、decimal和numeric)

近似数值数据类型(float、real和double precision)

扩展后增加了tinyint、mediumint和bigint

整数类型 字节 最小值 最大值
tinyint 1    

有符号-128

无符号0

有符号127

无符号255

smallint 2

有符号-32768

无符号0

有符号32767

无符号65535
mediumint 3

有符号-8388608

无符号0

有符号8388607

无符号1677215
int、integer 4

有符号-2147483648

无符号0

有符号2147483647

无符号4294967295
bigint 8

有符号-9223372036854775808

无符号0

有符号9223372036854775807

无符号18446744073709551615

 

浮点数类型   字节 最小值 最大值
float 4 -1.175494351E-38 +3.402823466E+38
double 8 -2.2250738585072014E-308 +1.7976931348623157E+308

 

定点数类型 字节 描述

dec(m,d),

decimal(m,d)

m+2 最大取值范围与double相同,给定decimal的有效取值范围由m和d决定

 

位类型 字节 最小值 最大值
bit(m) 1~8 bit(1) bit(64)

int(5)表示当数值宽度小于5位的时候在数字前面填满宽度,如果不显示指定宽度则默认为int(11)。

mysql> create table t1 (id1 int, id2 int(5));

mysql> desc t1;

mysql> insert into t1 values(1,1);

mysql> select * from t1;

mysql> alter table t1 modify id1 int zerofill;

mysql> alter table t1 modify id2 int(5) zerofill;

mysql> select * from t1;

如果插入大于宽度限制的值,不会对插入的数据有任何影响,还是按照类型的实际精度进行保存。

mysql> insert into t1 values(1,111111);

整数类型都有一个可选属性unsigned(无符号)

如果一个列指定为zerofill,则MySQL自动为该列添加unsigned属性

另外,整数类型还有一个属性:auto_increment。值一般从1开始,每行增加1。一个表中最多只能有一个auto_increment列。对于任何想要使用auto_increment的列,应该定义为not null,并定义为primary key 或定义为unique键。

例如,可按下列任何一种方式定义auto_increment列:

mysql> create table ai (id int auto_increment not null primary key);

mysql> create table ai (id int auto_increment not null, primary key(id));

mysql> create table ai (id int auto_increment not null, unique(id));

 

小数分为两种方式:浮点数和定点数

浮点数包括float(单精度)和double(双精度),而定点数则只有decimal一种表示。定点数在MySQL内部以字符串形式存放,比浮点数更精确,适合用来表示货币等精度高的数据。

浮点数和定点数都可以用类型名称后加“(m,d)”的方式来进行表示,“(m,d)”表示该值一共显示m位数字(整数位+小数位),其中d位位于小数点后面,m和d又称为精度和标度。

值得注意的是,浮点数后面跟“(m,d)”的用法是非标准用法,如果要用于数据库的迁移,则最好不要这么使用。

decimal在不指定精度时,默认的整数位为10,默认的小数位为0。

mysql> create table t1(
    -> id1 float(5,2) default null,
    -> id2 double(5,2) default null,
    -> id3 decimal(5,2) default null);

mysql> insert into t1 values(1.23,1.23,1.23);

mysql> select * from t1;

mysql> insert into t1 values(1.234,1.234,1.23);

mysql> select * from t1;

mysql> insert into t1 values(1.234,1.234,1.234);

mysql> show warnings;

mysql> select * from t1;

mysql> alter table t1 modify id1 float;

mysql> alter table t1 modify id2 double;

mysql> alter table t1 modify id3 decimal;

mysql> desc t1;

mysql> insert into t1 values(1.234,1.234,1.234);

mysql> show warnings;

mysql> select * from t1;

 

mysql> create table t2(id bit);

mysql> desc t2;

mysql> insert into t2 values(1);

mysql> select * from t2;

mysql> select bin(id),hex(id) from t2;

 

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

日期和时间类型

日期和时间类型   字节 最小值 最大值
date 4 1000-01-01 9999-12-31
datetime 8 1000-01-01 00:00:00 9999-12-31 23:59:59
timestamp 4 19700101080001 2038年的某个时刻
time 3 -838:59:59 838:59:59
year 1 1901 2155

timestamp值返回后显示为“YYYY-MM-DD HH:MM:SS”格式的字符串,显示宽度固定为19个字符。如果想要获得数字值,应在timestamp列添加+0。

year有2位或4位格式的年。默认是4位格式。在4位格式中,允许的值是1901~2155和0000。在2位格式中,允许的值是70~69,表示从1970~2069年。

“00”到“69”范围的值被转换为2000~2069范围的year值。

“70”到“99”范围的值被转换为1970~1999范围的year值。

mysql> create table t (d date, t time, dt datetime);

mysql> desc t;

mysql> insert into t values(now(), now(), now());

mysql> select * from t;

 

mysql> create table t (id1 timestamp);

mysql> desc t;

mysql> insert into t values(null);

mysql> select * from t;

mysql> alter table t add id2 timestamp;

mysql> show create table t \\G;

注意:MySQL只给表中的第一个timestamp字段设置默认值为系统日期,如果有第二个timestamp类型,则默认值设置为0值。因为MySQL规定timestamp类型字段只能有一列的默认值为current_timestamp,如果强制修改,系统会报错误提示。

mysql> alter table t modify id2 timestamp default current_timestamp;

 

mysql> create table t8 (
    -> id1 timestamp not null default current_timestamp,
    -> id2 datetime default null);

mysql> show variables like \'time_zone\';  //查看当前时区

mysql> insert into t8 values(now(),now());

mysql> select * from t8;

mysql> set time_zone=\'+9:00\';  //修改时区为东九区

mysql> select * from t8;

 

mysql> drop table t;

mysql> create table t (id1 timestamp);

mysql> insert into t values(\'2038-01-19 11:14:07\');

 

mysql> drop table t;

mysql> create table t(y year);

mysql> desc t;

mysql> insert into t values(2100);

mysql> select * from t;

 

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

字符串类型

字符串类型 字节 描述及存储需求
char(m) m m为0~255之间的整数
varchar(m)   m为0~65535之间的整数,值的长度+1个字节
tinyblob   允许长度0~255字节,值的长度+1个字节
blob   允许长度0~65535字节,值的长度+2个字节
mediumblob   允许长度0~167772150字节,值的长度+3个字节
longblob   允许长度0~4294967295字节,值的长度+4个字节
tinytext   允许长度0~255字节,值的长度+2个字节
text   允许长度0~65535字节,值的长度+2个字节
mediumtext   允许长度0~167772150字节,值的长度+3个字节
longtext   允许长度0~4294967295字节,值的长度+4个字节
varbinary(m)   允许长度0~m个字节的变长字节字符串,值的长度+1个字节
binary(m) m 允许长度0~m个字节的定长字节字符串

 

mysql> create table vc (v varchar(4), c char(4));

mysql> insert into vc values(\'ab  \',\'ab  \');

mysql> select length(v),length(c) from vc;

mysql> select concat(v,\'+\'), concat(c,\'+\') from vc;

 

mysql> create table t (c binary(3));

mysql> insert into t set c=\'a\';

mysql> select *,hex(c),c=\'a\',c=\'a\\0\',c=\'a\\0\\0\' from t;

 

enum类型(枚举类型)

mysql> create table t (gender enum(\'M\',\'F\'));

mysql> insert into t values(\'M\'),(\'1\'),(\'f\'),(null);

mysql> select * from t;

 

set类型

1~8成员的集合,占1个字节。

9~16成员的集合,占2个字节。

17~24成员的集合,占3个字节。

25~32成员的集合,占4个字节。

33~64成员的集合,占8个字节。

set和enum除了存储之外,最主要的区别在于set类型一次可以选取多个成员,而enum则只能选一个。

mysql> create table t (col set (\'a\',\'b\',\'c\',\'d\'));

mysql> insert into t values(\'a,b\'),(\'a,d,a\'),(\'a,b\'),(\'a,c\'),(\'a\');

mysql> select * from t;

set类型可以从允许值集合中选择任意1个或多个元素进行组合,所以对于输入的值只要是在允许值的组合范围内,都可以正确地注入到set类型的列中。对于超出允许值范围的值例如(‘a,d,f’)将不允许注入到上面例子中设置的set类型列中,而对于(‘a,d,a’)这样包含重复成员的集合将只取一次,写入后的结果为“a,d”,这一点请注意。

 

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

MySQL中的运算符

mysql> select 0.1+0.333, 0.1-0.3333, 0.1*0.3333,1/2,1%2;

mysql> select 1/0, 100%0;

mysql> select 3%2, mod(3,2);

=:等于,如果相等返回值为1,否则为0。注意null不能用于“=”比较。

<>或!=:不等于,注意null不能用于“<>”比较。

<=>:NULL安全的等于(NULL-safe),null可以正确比较。

between:存在与指定范围

in:存在于指定集合

is null:为null

is not null:不为null

like:通配符匹配

regexp或rlike:正则表达式匹配

数字作为浮点数比较,而字符串以不区分大小写的方式进行比较。

 

mysql> select 1=0,1=1,null=null;

mysql> select 1<>0,1<>1,null<>null;

mysql> select 1<=>1,2<=>0,0<=>0,null<=>null;

mysql> select \'a\'<\'b\',\'a\'<\'a\',\'a\'<\'c\',1<2;

mysql> select \'bdf\'<=\'b\',\'b\'<=\'b\',0<1;

mysql> select \'a\'>\'b\',\'abc\'>\'a\',1>0;

mysql> select \'a\'>=\'b\',\'abc\'>=\'a\',1>=0,1>=1;

between运算符的使用格式为“a between min and max”,当a大于等于min并且小于等于max,则返回值为1,否则返回0;当操作数a、min、max类型相同时,此表达式等价于(a>=min and a<=max),当操作数不同时,比较时会遵循类型转换原则进行转换后,再进行比较运算。

mysql> select 10 between 10 and 20, 9 between 10 and 20;

mysql> select 1 in(1,2,3), \'t\' in (\'t\',\'a\',\'b\',\'1\',\'e\'), 0 in (1,2);

mysql> select 0 is null, null is null;

mysql> select 0 is not null, null is not null;

like运算符的使用格式为“a like %123%”,当a中含有字符串“123”时,则返回值为1,否则返回0。

mysql> select 123456 like \'123%\',123456 like \'%123%\', 123456 like \'%321%\';

mysql> select \'abcdef\' regexp \'ab\', \'abcdefg\' regexp \'k\';

 

mysql> select not 0, not 1, not null;

注意:not null的返回值为null。

mysql> select (1 and 1), (0 and 1), (3 and 1), (1 and null);

mysql> select (1 or 0), (0 or 0), (1 or null), (1 or 1), (null or null);

mysql> select 1 xor 1, 0 xor 0, 1 xor 0, 0 xor 1, null xor 1;

 

mysql> select 2&3;

mysql> select 2&3&4;

mysql> select 2|3;

mysql> select 2^3;

mysql> select ~1,~18446744073709551614;

mysql> select bin(18446744073709551614);

mysql> select 100>>3;

mysql> select 100<<3;

 

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

常用字符串函数

cancat(s1,s2,...sn):连接s1,s2,...sn为一个字符串。

insert(str,x,y,instr):将字符串str从第x位置开始,y个字符长的子串替换为字符串instr

lower(str):将字符串str中所有字符变为小写。

upper(str):将字符串str中所有字符变为大写。

left(str,x):返回字符串str最左边的x个字符。

right(str,x):返回字符串str最右边的x个字符。

lpad(str,n,pad):用字符串pad对str最左边进行填充,直到长度为n个字符长度。

rpad(str,n,pad):用字符串pad对str最右边进行填充,直到长度为n个字符长度。

ltrim(str):去掉字符串str左侧的空格。

rtrim(str):去掉字符串str行尾的空格。

repeat(str,x):返回str重复x次的结果。

replace(str,a,b):用字符串b替换字符串str中所有出现的字符串a。

strcmp(s1,s2):比较字符串s1和s2。

trim(str):去掉字符串行尾和行头的空格。

substring(str,x,y):返回从字符串str x位置起y个字符长度的字串。

 

mysql> select concat(\'aaa\',\'bbb\',\'ccc\'),concat(\'aaa\',null);

任何字符串与null进行连接的结果都将是null。

mysql> select insert(\'beijing2008you\',12,3,\'me\');

mysql> select lower(\'BEIJING2008\'),upper(\'beijing2008\');

mysql> select left(\'beijing2008\',7),left(\'beijing\',null),right(\'beijing2008\',4);

如果第二个参数是null,那么将不返回任何字符串。

mysql> select lpad(\'2008\',20,\'beijing\'),rpad(\'beijing\',20,\'2008\');

mysql> select ltrim(\'   |beijing\'),rtrim(\'beijing|    \');

mysql> select repeat(\'mysql \',3);

mysql> select replace(\'beijing_2010\',\'_2010\',\'2008\');

mysql> select strcmp(\'a\',\'b\'),strcmp(\'b\',\'b\'),strcmp(\'c\',\'b\');

mysql> select trim(\'   $  beijing2008  $    \');

mysql> select substring(\'beijing2008\',8,4),substring(\'beijing2008\',1,7);

 

常用数值函数

abs(x):返回x的绝对值

ceil(x):返回大于x的最大整数值。

floor(x):返回小于x的最大整数值。

mod(x,y):返回x/y的模

rand():返回0~1内的随机值。

round(x,y):返回参数x的四舍五入的有y位小数的值。

truncate(x,y):返回数字x截断为y位小数的结果。

 

mysql> select abs(-0.8), abs(0.8);

mysql> select ceil(-0.8),ceil(0.8);

mysql> select floor(-0.8),floor(0.8);

mysql> select mod(15,10), mod(1,11), mod(null,10);

模数和被模数任何一个为null结果都为null。

mysql> select rand(),rand();

mysql> select ceil(100*rand()),ceil(100*rand());  //0~100内的任意随机整数。

mysql> select round(1.1),round(1.1,2),round(1,2);

mysql> select round(1.235,2),truncate(1.235,2);

 

常用日期时间函数

curdate():返回当前日期

curtime():返回当前时间

now():返回当前的日期和时间

unix_timestamp(date):返回日期date的unix时间戳

from_unixtime:返回unix时间戳的日期值

week(date):返回日期date为一年中的第几周

year(date):返回日期date的年份

hour(time):返回time的小时值

minute(time):返回time的分钟值

monthname(date):返回time的月份名

date_format(date,fmt):返回按字符串fmt格式化日期date值。

date_add(date,interval expr type):返回一个日期或时间值加上一个时间间隔的时间值。

datediff(expr,expr2):返回起始时间expr和结束时间expr2之间的天数。

 

mysql> select curdate();

mysql> select curtime();

mysql> select now();

mysql> select unix_timestamp(now());

mysql> select from_unixtime(1472098686);

mysql> select week(now()),year(now());

mysql> select hour(curtime()),minute(curtime());

mysql> select monthname(now());

 

日期时间格式说明

%S,%s:两位数字形式的秒(00,01,...,59)

%i:两位数字形式的分(00,01,...,59)

%H:两位数字形式的小时,24小时(00,01,...,23)

%h,%I:两位数字形式的小时,12小时(01,02,...,12)

%k:数字形式的小时,24小时(0,1,...,23)

%l:数字形式的小时,12小时(1,2,...,12)

%T:24小时的时间形式(hh:mm:ss)

%r:12小时的时间形式(hh:mm:ssAM或hh:mm:ssPM)

%p: AM或PM

%W:一周中每一天的名称(Sunday,Monday,...,Saturday)

%a:一周中每一天名称的缩写(Sun,Mon,...,Sat)

%d:两位数字表示月中的天数(00,01,...,31)

%e:数字形式表示月中的天数(1,2,...,31)

%D:英文后缀表示月中的天数(1st,2nd,3rd,...)

%w:以数字形式表示周中的天数(0=Sunday,1=Monday,...,6=Saturday)

%j:以3位数字表示年中的天数(001,002,...,366)

%U:周(0,1,52),其中Sunday为周中的第一天

%u:周(0,1,52),其中Monday为周的第一天

%M:月名(January,February,...,December)

%b:缩写的月名(January,February,...,December)

%m:两位数字表示的月份(01,02,...,12)

%c:数字表示的月份(1,2,...,12)

%Y:4位数字表示的年份

%y:两位数字表示的年份。

%%:直接值“%”

 

mysql> select date_format(now(),\'%M,%D,%Y\');

mysql> select now() current,date_add(now(),interval 31 day) after31days,date_add(now(),interval \'1_2\' year_month) after_oneyear_twomonth;

mysql> select now() current,date_add(now(),interval -31 day) after31days,date_add(now(),interval \'-1_-2\' year_month) after_oneyear_twomonth;

mysql> select datediff(\'2020-08-08\',now());

 

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

流程函数

if(value,t f):如果value是真,返回t;否则返回f

ifnull(value1,value2):如果value1不为空返回value1,否则返回value2

case when [value1] then[result1]...else [default] end :如果value1是真,返回result1,否则返回default

case [expr] when [value1] then[result1]...else[default] end:如果expr等于value1,返回result1,否则返回default

mysql> create table salary (userid int, salary decimal(9,2));

mysql> insert into salary values(1,1000),(2,2000),(3,3000),(4,4000),(5,5000),(1,null);

mysql> select * from salary;

mysql> select if(salary>2000,\'high\',\'low\') from salary;

mysql> select ifnull(salary,0) from salary;

mysql> select case when salary<=2000 then \'low\' else \'high\' end from salary;

mysql> select case salary when 1000 then \'low\' when 2000 then \'mid\' else \'high\' end from salary;

 

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

其他常用函数

database():返回当前数据库名

version():返回当前数据库版本

user():返回当前登录用户名

inet_aton(ip):返回IP地址的数字表示

inet_ntoa(num):返回数字代表的IP地址

password(str):返回字符串str的加密版本,一个41位长的字符串

md5():返回字符串str的md5值

 

mysql> select database();

mysql> select version();

mysql> select user();

mysql> select inet_aton(\'192.168.1.1\');

mysql> select inet_ntoa(3232235777);

 

mysql> create table ip(ip varchar(20));

mysql> insert into ip values(\'192.168.1.1\'),(\'192.168.1.3\'),(\'192.168.1.6\'),(\'192.168.1.10\'),(\'192.168.1.20\'),(\'192.168.1.30\');

mysql> select * from ip;

mysql> select * from ip where ip>=\'192.168.1.3\' and ip<=\'192.168.1.20\';

mysql> select * from ip where inet_aton(ip)>=inet_aton(\'192.168.1.3\') and inet_aton(ip)<=inet_aton(\'192.168.1.20\');

mysql> select password(\'123456\');

mysql> select md5(\'123456\');

 

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

mysql> show variables like \'table_type\';  //查看当前的默认存储引擎

下面两种方法查询当前数据库支持的存储引擎

mysql> show engines \\G

mysql> show variables like \'have%\';

mysql> create table ai(
    -> i bigint(20) not null auto_increment,
    -> primary key (i)
    -> ) engine=MyISAM default charset=gbk;

mysql> create table country (
    -> country_id smallint unsigned not null auto_increment,
    -> country varchar(50) not null,
    -> last_update timestamp not null default current_timestamp on update curren
t_timestamp,
    -> primary key (country_id)
    -> ) engine=InnoDB default charset=gbk;

 

mysql> alter table ai engine=innodb;  //更改存储引擎

mysql> show create table ai \\G

mysql> show character set;  //查看所有可用的字符集命令

mysql> desc information_schema.character_sets;  //显示所有的字符集和该字符集默认的校对规则

mysql> show collation like \'gbk%\';

mysql> show variables like \'character_set_server\';  //查询当前服务器的字符集和校对规则

mysql> show variables like \'collation_server\';

mysql> show variables like \'character_set_database\';

mysql> show variables like \'collation_database\';

 

mysql> create database databasename default charset gbk;

 

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

索引的设计和使用

mysql> create index cityname on city (city(10));

mysql> explain select * from city where city = \'Fuzhou\' \\G

mysql> drop index cityname on city;  //删除索引

 

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

正则表达式

mysql> select \'abcdefg\' regexp \'^a\';

mysql> select \'abcdefg\' regexp \'g$\';

mysql> select \'abcdefg\' regexp \'.h\', \'abcdefg\' regexp \'.f\';

mysql> select \'abcdefg\' regexp \'[fhk]\';

mysql> select \'efg\' regexp \'[^xyz]\',\'x\' regexp \'[^xyz]\';

 

mysql> create table t(name varchar(20),email varchar(40));

mysql> insert into t values(\'beijing\',\'beijing@163.com\'),(\'beijing126\',\'beijing@126.com\'),(\'beijing188\',\'beijing@188.com\');

mysql> select * from t;

mysql> select name,email from t where email regexp "@163[.,]com$";

 

mysql> select * from salary order by rand();  //可按照随机顺序检索数据行

mysql> select * from salary order by rand() limit 5;  //数据随机排序后再抽取前n条记录

 

mysql> create table sales
    -> (
    ->    year int not null,
    ->    country varchar(20) not null,
    ->    product varchar(32) not null,
    ->    profit int
    -> );

mysql> insert into sales values(2004,\'china\',\'tnt1\',2001),(2004,\'china\',\'tnt2\',2002),(2004,\'china\',\'tnt3\',2003),(2005,\'china\',\'tnt1\',2004),(2005,\'china\',\'tnt2\',2005),(2005,\'china\',\'tnt3\',2006),(2005,\'china\',\'tnt1\',2007),(2005,\'china\',\'tnt2\',2008),(2005,\'china\',\'tnt3\',2009),(2006,\'china\',\'tnt1\',2010),(2006,\'china\',\'tnt2\',2011),(2006,\'china\',\'tnt3\',2012);

mysql> select year,country,product, sum(profit) from sales group by year,country,product;

mysql> select year,country,product, sum(profit) from sales group by year,country,product with rollup;

 

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

show [session|global] status 命令可以提供服务器状态信息

session:显示session级(当前连接)的统计结果。如果不写,默认使用参数是“session”

global:显示global级(自数据库上次启动至今)的统计结果。

mysql> show status like \'Com_%\';

 

以上是关于mysql 学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

MySQL学习笔记六

MySQL数据库学习笔记一

mysql学习笔记

MySQL学习笔记五

1000行MySQL学习笔记

MySQL学习笔记之六:MySQL日志