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_%‘;
原文:http://www.cnblogs.com/qunxuan/p/5809000.html