深入浅出mysql全文随笔

进入mysql :mysql -uroot -p

1.DDL(Data Definition Languages)语句:数据定义语言

2.DML(Data Manipulation Language)语句:数据操纵语句

3.DCL(Data Control Language)语句:数据控制语句

1。DDL语句

(1)创建数据库

create database test1;

show databases;

information_schema:主要存储了系统中的一些数据库对象信息。比如用户表信息 列信息 权限信息  字符集信息 分区信息等.

cluster: 存储了系统的集群信息

mysql:存储了系统的用户权限信息

test:系统自动创建的测试数据库,任何用户都可以使用

use dbname;

show tables;

(2)删除数据库

drop database test1;

Query OK,0 rows affected(0.00 sec)

在mysql 里面,drop语句操作的结果显示都是“0 rows affected”

(3)创建表

CREATE TABLE tablename()

创建完成后,如果需要查看以下表的定义,可以使用:

desc emp;

虽然desc命令可以查看表的定义,但是其输出的信息还不够全面,为了查看更全面地表的定义信息,有时需要通过看看创建表的sql语句来的到

show create table emp G;

除了可以看到表定义以外,还可以看到表的engine(存储引擎)和charset(字符集)等信息."G"选项的含义是使得记录能够按照字段竖着排序,对于内容比较长的记录更易于

显示。

(4)删除表

drop table tablename;

drop table emp;

(5)修改表

为了不做额外的工作

alter  table  

alter  table  emp  modify ename  varchar(20);

增加表字段,愈发

alter table emp add column age int(3)

删除表字段

alter table emp drop column age;

字段改名

alter table emp change age age1 int(4);

注意:change 和modify 都可以修改表的定义,不同的是change后面需要写两次列名,不方便。但是change的优点是可以修改列明成,modify  则不能.

修改字段排列顺序

前面介绍的字段增加和修改语法(ADD/CHANGE/MODIFY)中,都有一个可选项first|after column_name ,这个字段可以用来修改字段在表中的位置,默认ADD增加

的新字段是加在表的最后位置,而CHANGE/MODIFY默认都不会改变字段的位置

alter table emp add birth date after ename;

修改字段age,将他放到最前面

alter table emp modify age int(3) first;

注意:change/first|after column 这些关键字都属于mysql在标准SQL上的扩展,在其他数据库上不一定适用

(6)表改名

alter table emp rename emp1;

2.2.3DML语句

主要包括表记录的插入(insert) 更新(update) 删除(delete) 和查询(select)

1.插入记录

insert into  tablename(field1,field2,...fieldn)values(value1,value2,..valuesn);

select * from emp;

insert 可以一次插入多条记录

insert into dept values(,,),(,,)

2,更新记录

update tablename set field1=value1,field2=value2,...fieldn=valuen[where condition]

update  emp set sal=4000 where ename='lisa';

3.删除记录

delete from tablename[where condition]

delete from emp where ename='dony';

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

4,查询记录

select *from tablename [where condition]

select *from emp;

select ename ,hiredate,sal,deptno from emp;

这两个等价

(1)查询不重复的记录

select ename,hiredate,sal,deptno from emp;

select distinct deptno from emp;

(2)条件查询

select * from emp where deptno=1 and sal<3000;

(3)排序和限制

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

desc和asc是排序的关键字,desc表示按照字段进行降序,asc升序。如果不写默认升序排列。order by 后面可以跟多个不同的排序字段并且每个排序字段都可以有不同的排序顺序

select  * from emp order by deptno,sal desc;

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

limit ...[limit offset_start,row_count]

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

在默认情况下,起始偏移量为0,只需要些记录行数就可以,这时候实际上就是前n条记录,

select *from emp order by sal limit 3;

select * from emp order by sal limit 1,3

limit 经常和order by 一起配合使用来进行记录的分页显示。

(4)聚合

很多情况下,我们需要进行一些汇总操作,比如统计整个公司的人或者每个部门的人数,这个时候就要用到sql的聚合操作

聚合操作的语法如下:

select [field1,field2,...fieldn]fun_name//表示要做的聚合操作,常用的有sum(求和) count(*)(记录数) max(最大值)min(最小值)

from tablename

[where where_conditon]

[group by  field1,field2,...fieldn]//关键字表示要进行分类聚合的字段

[with rollup]//表示是否对聚合后的结果进行再次汇总

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

having 和where的区别在于having是对聚合后的结果进行条件的过滤,而where是在聚合前就对记录进行过滤,如果逻辑允许,我们尽可能用where 先过滤记录,这样因为结果集

减少,就将聚合的效率大大提高,最后再根据逻辑看是否用having进行再过滤

select count(1) from emp;

select deptno,count(1) from emp;

select deptno,count(1) from emp group by deptno;

select deptno,count(1) from emp group by deptno with rollup;

select deptno,count(1) from emp group by deptno with rollup having count(1)>1;

select sum(sal),max(sal),min(sal) from emp;

(5)表连接

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

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

select ename,deptname from emp,dept where emp.deptno=dept.deptno

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

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

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

select dird from dept left join emp on 

左连接和右连接之间可以互相转化

(6)子查询

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

,exists ,not exists等

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

如果子查询的记录数唯一,还可以用=代替in:

select * from emp where deptno = (select deptno from dept);

在某些情况下,子查询可以转化位表连接

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

select  emp.* from emp,dept where emp.deptno=dept.deptno;

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

mysql 4.1以前的版本不支持子查询,需要用表连接来实现子查询的功能

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

(7)记录联合

将两个表的数据按照一定的查询条件查询出来后,将结果合并在一起显示出来,这个时候,就需要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,去除重复记录后的结果

select * from emp

union all

select * from dept;

2.2.4DCL语句

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

grant select ,insert on sakila.* to  'zl'@'localhost'  identified by '123';

由于需要变更权限收回zl用户对sakila数据的的insert权限:

revoke insert  on sakila.* from 'zl'@'localhost';

2.3.1 按照层次看帮助

? contents

?  类别名称(?  data types)

2.3.2 快速查阅帮助

如果需要快速查阅某项语法时,可以使用关键字进行快速查询

? show

例如  如果向参看 Create Table的语法,可以使用一下命令

? create table

dev.mysql.com/download  是mysql 的官方网站,可以下载各个版本的mysql以及相关客户客户端开发工具等

dev.mysql.com/doc  提供目前最权威的mysql数据库及工具的在线手册

bugs.mysql.com 可以查看到mysql已经发布的bug列表,或者向mysql提交bug报告

www.mysql.com/news-and-events/newsletter 通常会发布各种关于mysql的最新消息

第三章  mysql支持的数据类型

3.1数值类型

可以用? data types查询到所有的数据类型

(1)create table t1 (id1 int, id2 int(5));  5代表宽度,默认是11位

zerofill前面不足的补零

如果一个列指定为zerofill  mysql 自动为该列添加unsigned属性(无符号性)

整数烈性有一个属性:AUTO_INCREMENT 在需要产生唯一标识符或顺序值时,可利用此属性,这个属性只用于整数烈性.AUTO_INCREMENT 值一般从1开始,每行增加1

一个表中最多只能有一个AUTO_INCREMENT列,对于任何想使用AUTO_INCREMENT的列应该定义为NOT NULL,并定义为PRIMARY KEY 或UNIQUE键,例如

CREATE TABLE AI (ID INT AUTO_INCREMENT NOT NULL PRIMARY KEY)

CREATE TABLE AI(ID INT AUTO_INCREMENT NOT NULL,PRIMARY KEY(ID))

CREATE TABLE AI (ID INT AUTO_INCREMENT NOT NULL,UNIQUE(ID))

对于小数的表示,mysql分为两种方式:浮点数和定点数,浮点数包括float(单精度)和double双精度,而定点数则只有decimal一种表示,定点数在mysql内部以字符串形式存放,比浮点数更精确,适合用来表示货比等精度搞的数据

浮点数和定点数都可以用类型名称后加(M,D)表示一共M位数字(整数位+小数位),其中D位位于小数点后面,M和D又称为精度和标度

注意:浮点数后面跟(M,D)的用法是非标准用法,如果要用于数据库的迁移,最好不要使用,float和double在不指定精度的时候,默认会按照实际的精度来显示

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

对于bit(位)类型,用于存放位字段值,BIT(M)可以用来存放多为二进制数,M范围从1~64,如果不写则默认为1位,对于位字段,直接使用select 命令将不会看到结果

可以用bin()显示二进制格式,或者hex()显示16进制格式 函数进行读取

bit(1)的时候十进制2不能插入

3.2日期时间类型

表示年月日 通常用DATE

如果表示年月日时分秒,通常用DATETIME表示

如果只用来表示时分秒,通常用TIME来表示

如果需要经常插入或者更新日期位当前系统时间,则通常用TIMESTAMP表示,其返回YYY--MM-DD HH:MM:SS格式的字符串,显示宽度位19个字符,如果想获得数字值,应在TIMESTAMP 列添加+0

如果知识表示年份,可以用YEAR来表示,它毕DATE表示占用更少的空间,YEAR有2位或4位格式的年,默认是4威格士,在4位格式中,允许的值是1901-2155,在2位格式

中,允许的值是70-69,表示从1970~2069

 datetime 是date和time的组合

timestamp  如果有第一个则为当前系统时间,如果有第二个则默认为0

mysql规定TIMESTAMP类型字段只能有一列为默认值current_timestamp;如果强制修改那么系统就会报错

查看当前时区

show variables like 'time_zone';

可以发现,时区的值为“system”,这个值默认是和主机的时区值一致的,因为我们在中国

(3)now ()函数插入当前日期;

(4)修改时区为东九区,再次查看表中日期;

timestamp一个重要特点,就是和时区有关,当插入日期时,会先转换为本地时区后存放;而从数据库里面取出时,也同样需要将日期转换为本地区后显示

,这样,两个不同时区的用户看到的同一日期可能是不一样的

例如:timestamp和datetime通过设置时区可能不同

timestamp的取值范围iwei19700101080001到2038的某一天,因此它不适合存放比较久远的日期

timestamp和datetime的区别

timestamp支持的时间范围小,其取值范围从19700101080001到2038年的某个时间,而datetime是从1000-01-01 0:0:0到9999-12-31 23:59:59

范围更大

表中第一个timestamp列会自动设置为系统时间。如果在一个timestamp列中插入NULL,则该列值会自动设置为当前的日期和时间,在插入或更新一行但不明确

给timestamp列赋值时,也会自动设置该列的值为当前的日期和时间,当插入的值超出范围,mysql会认为该值溢出,使用000000填补

timestamp的插入和查询都受当地时区的影响,更能反映出十几的日期,而datetime则只能反映出插入当地的时区

timestamp的属性受mysql版本和服务器sqlmode的影响很大

year 范围1902-2155当使用两位字符串表示年份时,其范围为00到99

00-69转换为2000-2069

70-99范围转换为1970-1999

3.3字符串类型

3.3.1 CHAR和VARCHAR

char 和varchar很类似,char列的长度为创建表时声明的长度0-255

varchar  0-65535

显然,char列最后的空格在做操作时都已经被删除,而varchar依然保留空格

3.3.2 binary和varbinary

类似于char和varchar不同的是,它们包含二进制字符串而不包含非二进制字符串

当保存binary值时,在值得最后通过填充‘0x00’(零字节) 以达到指定的字段定义长度,对于一个binary(3)列,当插入时'a'变为'a'

3.3.3 enum 类型

 enum 中文名称叫枚举类型,它的值范围需要在创建表时通过枚举方式显式指定,对1~255个成员的枚举需要1个字节来存储:对于255-65535个成员,需要两个

字节,最多允许有65535个成员

enum类型是忽略大小写的,在对M f存储的时候都将它们转换成了大写,还可以看出对于插入不再enum指定范围内的值时,并没有返回警告,而是插入了

enum('M','F')的第一值M,这点需要特别注意;

3.3.4set类型

set和enum类型非常类似,也是一个字符串对象,里面可以包含0-64个成员,根据成员的不同

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

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

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

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

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

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

set 类型可以从允许值集合中选择任意1个或多个元素进行组合,所以对于输入的值,只要是在允许的组合范围内,都可以正确地注入到set类型的

的列中,对于超出允许值范围的值,如(‘a,d,f’)将不允许注入到上面的例子,而对于('a,d,a')这样包含重复成员的集合将

只取一次,写入后的结果为'a,d'

第四章 mysql中的运算符

4.1 算数运算符

+ - * / mod(a,b) 

4.2比较运算符

=运算符,用于比较运算符两侧的操作数是否相等,如果两侧操作数相等则返回为1,否则为0,注意NULL不能用于=比较

<>运算符,和=相反,如果两侧操作数不等,则值为1,否则为0,NULL不能用于<>比较

<=>安全的等于运算符,和=类似,在操作数相等时值为1,不同之处在于即使操作的值为NULL也可以正确比较

<运算符,当左侧操作数小于右侧操作数时,其返回值为1,否则为0

>

>=

between 运算符的使用格式 为 a between min and max 当a大于等于min并小于等于max,返回1,否则返回0

当操作数a。min。max类型相同时,此表达式等价于(a>=min and a<=max)当操作数类型不同时,比较会遵循转换原则进行转换后,

再进行比较运算.

in 运算符的使用格式为“a in(value1,value2..)”,当a的值存在于列表中时,则返回值为1,否则为0

is null  运算符的使用格式为a is null,当a的值为NULL,则返回值wei1,否则为0

is not null

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

regexp运算符的使用格式为str regexp str_pat ,当str字符串中含有str_pat相匹配的字符串时,返回1,否则返回0

4.3 逻辑运算符

not 或 ! 表示逻辑非,返回和操作数相反的结果:当操作数为0(假),则返回1,否则值为0,not null的返回值为null

and huo &&表示逻辑与运算,当所有操作数均为非零值并且不为null时,计算所得结果为1,当一个或多个

or或 ||表示逻辑或运算,当两个操作数均为非null值时,如果两个操作数均为null,则所得结果为null

xor 表示逻辑异或,当任意一个操作数为null时,返回值为null,对于非null操作数,如果两个逻辑真假值相异,则返回结果为1,否则返回为0

4.4 位运算符

位于  &

位或  |

位异或  对操作数的二进制位做异或操作^

位取反 对操作数的二进制位作not 操作

 位右移  >>左边补0

位左移  右边补0

4.5 运算符的优先级

第五章 常用函数

5.1 字符串函数

concat(s1,s2,..sn)函数:将传入的参数连接成为一个字符串

 另外,任何字符串与NULL进行连接的结果都将是NULL

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

lower(str)和upper(str)函数,将字符产转换为小写或大写

left(str,x)和right(str,x)函数:分别返回字符串最左边的x歌字符和最右边的x个字符

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

ltrim(str)和rtrim(str)函数:去掉字符串str左侧和右侧空格

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

replace(str,a,b)函数:用字符串b替代字符串str中所有出现的字符串a

strcmp(s1,s2)函数:比较字符串s1和s2的ASCII码值的大小,如果s1比s2小,那么返回-1,如果s1和s2相等,那么返回0;如果s1比s2大,那么返回1

trim(str)函数:去掉目标字符串的开头和结尾的空格

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

5.2数值函数

abs(x)函数,返回x的绝对值

floor(x)函数:返回小于x的最大整数,和ceil的用法刚好相反

mod(x,y)函数:返回x/y的模和x%y结果相等,模数和被模数有一个为null结果都为null

rand()函数:返回0-1内的随机值,可以利用此函数取任意指定范围内的随机数,比如需要产生0~200内的任意随机

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

如果是整数,将会保留y位数量的0,如果不写y,则默认y为0,即将x四舍五入后取整,适合于将所有数字保留同样小数位的情况

truncate(x,y)函数:返回数字x截断为y位小数的结果,注意truncate和round的区别在于trunate仅仅是截断,而不进行四舍五入

5.3 日期和时间函数

 curdate()函数:返回当前日期,只包含年月日

curtime()函数:返回当前时间,只包含时分秒

now()函数:返回当前的日期和时间,年月日时分秒都包含

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

from_unixtime函数:返回unixtime时间戳的日期值,和unix_timestamp(date)互为逆操作

week(date)和year(date)函数:前者返回所给日期是一年后的第几周,后者返回所给的日期是那一年

hour(time)和minute(time)函数:前者返回所给时间的小时,后者返回所给时间的分钟,

monthname(date)函数:返回date的英文月份名称

date_fomat(date,fmt)函数:按字符串fmt格式化日期date值,此函数能够按指定的格式显示日期,

date_add(date,interval expr type)函数:返回与所给日期date相差interval时间段的日期,其中interval是间隔类型关键字,expr是一个表达式,这个表达式对应后面的类型

type 

例子:

<select now() current,date_add(now(),interval 31 day) after 31days,

date_add(now(),interval '1_2' year_month)after_oneyera_twomonth;>

datediff(date1,date2)函数:用来计算两个日期之间相差的天数

5.4流程函数

if(value,t,f);

ifNULL(value1,value2)函数:这个函数一般用来替代null值得,我们不知道null值是不是能参与数值运算的,下面这个语句就是把null值用0来替换

case when [value1] THEN[result1]..ELSE[default]END函数,我们也可以用case when...when函数实现上面例子中高薪低薪问题

case [expr] when [value1] then [result1]...else[default]end函数:

5.5其他常用函数

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

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

user()函数,返回当前登录用户名

inet_aton(ip)函数:返回ip地址的网络字节序表示

inet_ntoa(num)函数:返回网络字节序代表的ip地址

password(str)函数:返回字符串str的加密版本,一个41位长的字符串,此函数只能用来设置系统用户的密码,但是不能用来对应用的数据加密,如果应用方面有加密

的需求,可以使用MD5等加密函数来实现

MD5(str)函数:返回字符串str的MD5值,常用来对应用中的数据进行加密

第二篇 开发篇 

7 表类型(存储引擎)的选择

7.1MYSQL 存储引擎概述

可以通过下面两种方法查询当前数据库支持的存储引擎,第一种方法是

show engines G;

第二种方法是

show variables like 'have%';

这两种方法都可以用来查看当前支持哪些存储引擎,其中value显示为‘disabled’的记录表示支持该存储引擎,但是数据库启动的时候被禁用.

原文地址:https://www.cnblogs.com/thefirstfeeling/p/5910541.html