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 学习笔记的主要内容,如果未能解决你的问题,请参考以下文章