首页 > 代码库 > mysql 学习笔记

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

整数类型字节最小值最大值
tinyint1    

有符号-128

无符号0

有符号127

无符号255

smallint2

有符号-32768

无符号0

有符号32767

无符号65535
mediumint3

有符号-8388608

无符号0

有符号8388607

无符号1677215
int、integer4

有符号-2147483648

无符号0

有符号2147483647

无符号4294967295
bigint8

有符号-9223372036854775808

无符号0

有符号9223372036854775807

无符号18446744073709551615

 

浮点数类型  字节最小值最大值
float4-1.175494351E-38+3.402823466E+38
double8-2.2250738585072014E-308+1.7976931348623157E+308

 

定点数类型字节描述

dec(m,d),

decimal(m,d)

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

 

位类型字节最小值最大值
bit(m)1~8bit(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;

 

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

日期和时间类型

日期和时间类型  字节最小值最大值
date41000-01-019999-12-31
datetime81000-01-01 00:00:009999-12-31 23:59:59
timestamp4197001010800012038年的某个时刻
time3-838:59:59838:59:59
year119012155

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)mm为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 学习笔记