1,数据库的基本语句.
1.1>数据库的增删改查.
查看所有的库:
show databases;
就是已经创建好的库,通过这个命令去查看;
information_schema:虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息,列信息,权限信息,字符信息等.
performance_schema:mysql5.5开始新增一个数据库:主要用于收集数据库服务器的性能参数,记录处理查询请求时发生的各种事件,锁等现象.
mysql:授权库,主要用于存储系统用户的权限信息
text:mysql数据库系统自动创建的测试数据库
1.2>创建数据库
1.2.1>求救语法:(在mysql语句中没写完一句话就要用;隔开)
help create databases;
1.2.2>创建数据库语法
CREATE DATABASES 数据库 charset utf-8
因为在之前设置好了编码格式,所以不用每次都编码了.
1.2.3>数据库的命名规则:
可以由字母,数字,下划线,@,#,$组成. 区分大小写 唯一性 不能使用关键字如:create select 不能单独使用数字 最长128位 #和python和js命名规则一样
1.3>数据库的相关操作.
#查看数据库 show database; #查看当前库 show create databases db1; #查看当前新创建的数据库 #查看所在的库 select databases(); #选择数据库 use 数据库名 #删除数据库 DROP DATABASES 数据库名; #修改数据库 alert databases db1 charset utf-8
###以上这些操作不区分大小写,对于已经建好的数据库mysql没有重命名的指令,只能1>通过删除就得数据库,并把数据迁移到新创建的数据库中,2>取文件夹中找到那个数据库名右键重命名###
2,表的操作
数据库中的表有不同的类型,标的类型不同,会对应mysql不同的存储机制,表类型又称为存储引擎.
SQL解析器,SQL优化器,缓存池,储存引擎等组件在每个数据库中都存在,但不是每个数据库都有这么多引擎,MySQL的插件式储存可以让存储引擎层的开发人员涉及他们需要的存储层.
2.1>mysql支持的储存引擎
show enginesG; #查看所有支持的引擎 show variables like "storage_engine$"; #查看正在使用的存储引擎
2.1>InnoDB存储引擎
支持事物,其设计目标主要向联机事物处理的应用,其特点是行锁设计,支持外键,并支持类似Oracle的非锁定读,即默认读取操作不会产生锁,从MySQL5.5.8版本开始是默认的存储引擎
InnoDB存储引擎将数据放在一个逻辑表空间中,这个表空间黑盒 一样由InnoDB存储引擎的,表单独放到一个独立的ibd文件中,此外,InnoDB存储引擎支持将将裸设备(row disk)用于建立其表空间
InnoDB通过使用多版本并发控制(MVCC)来获得高并发性,并且实现了SQL标准的4中隔离级别,默认为REPEATABLE级别,同时使用一种称为netx-key locking的策略来避免幻读现象的产生除此之外,InnoDB 存储引擎还提供了插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead) 等高性能和高可用的功能。
对于表中数据的存储,InnoDB 存储引擎采用了聚集(clustered)的方式,每张表都是按 主键的顺序进行存储的,如果没有显式地在表定义时指定主键,InnoDB 存储引擎会为每一 行生成一个 6 字节的 ROWID,并以此作为主键。
InnoDB 存储引擎是 MySQL 数据库最为常用的一种引擎,Facebook、Google、Yahoo 等 公司的成功应用已经证明了 InnoDB 存储引擎具备高可用性、高性能以及高可扩展性。对其 底层实现的掌握和理解也需要时间和技术的积累。如果想深入了解 InnoDB 存储引擎的工作 原理、实现和应用,可以参考《MySQL 技术内幕:InnoDB 存储引擎》一书。
2.2>MyISAM 存储引擎
不支持事务、表锁设计、支持全文索引,主要面向一些 OLAP 数 据库应用,在 MySQL 5.5.8 版本之前是默认的存储引擎(除 Windows 版本外)。数据库系统 与文件系统一个很大的不同在于对事务的支持,MyISAM 存储引擎是不支持事务的。究其根 本,这也并不难理解。用户在所有的应用中是否都需要事务呢?在数据仓库中,如果没有 ETL 这些操作,只是简单地通过报表查询还需要事务的支持吗?此外,MyISAM 存储引擎的 另一个与众不同的地方是,它的缓冲池只缓存(cache)索引文件,而不缓存数据文件,这与 大多数的数据库都不相同.
2.3>NDB 存储引擎
年,MySQL AB 公司从 Sony Ericsson 公司收购了 NDB 存储引擎。 NDB 存储引擎是一个集群存储引擎,类似于 Oracle 的 RAC 集群,不过与 Oracle RAC 的 share everything 结构不同的是,其结构是 share nothing 的集群架构,因此能提供更高级别的 高可用性。NDB 存储引擎的特点是数据全部放在内存中(从 5.1 版本开始,可以将非索引数 据放在磁盘上),因此主键查找(primary key lookups)的速度极快,并且能够在线添加 NDB 数据存储节点(data node)以便线性地提高数据库性能。由此可见,NDB 存储引擎是高可用、 高性能、高可扩展性的数据库集群系统,其面向的也是 OLTP 的数据库应用类型。
2.4>Memory 存储引擎
正如其名,Memory 存储引擎中的数据都存放在内存中,数据库重 启或发生崩溃,表中的数据都将消失。它非常适合于存储 OLTP 数据库应用中临时数据的临时表,也可以作为 OLAP 数据库应用中数据仓库的维度表。Memory 存储引擎默认使用哈希 索引,而不是通常熟悉的 B+ 树索引。
2.5>Infobright 存储引擎
第三方的存储引擎。其特点是存储是按照列而非行的,因此非常 适合 OLAP 的数据库应用。其官方网站是 http://www.infobright.org/,上面有不少成功的数据 仓库案例可供分析
2.6>NTSE 存储引擎
网易公司开发的面向其内部使用的存储引擎。目前的版本不支持事务, 但提供压缩、行级缓存等特性,不久的将来会实现面向内存的事务支持。
2.7>BLACKHOLE
黑洞存储引擎,可以应用于主备复制中的分发主库。
MySQL 数据库还有很多其他存储引擎,上述只是列举了最为常用的一些引擎。如果 你喜欢,完全可以编写专属于自己的引擎,这就是开源赋予我们的能力,也是开源的魅 力所在.
2.8>指定表类型/存储引擎
create table t1(id int)engine = innoDB; #默认不写是innoDB
2.9>查看data文件下数据库的文件:
#frm是存储数据表的框架结构 #.1bd是mysql数据文件 #MYD是MyISAM表的数据文件的拓展名 #.MYI是MyISAM表的索引的扩展名 #发现后两种存储引擎只有表结构,无数据 #memory,在重启mysql或者重启机器后,表内数据清空 #blackhole,往表内插入任何数据,都相当于丢入黑洞,表内用原不存记录
2.10>表介绍:
表想相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称为标的字段.
2.9>创建表
语法:
create table 表名( 字段名1 类型[(宽度) 约束条件], 字段名2 类型[(宽度) 约束条件], 字段名3 类型[(宽度) 约束条件] ); #注意 1,在同一张表中,字段名不能相同 2,宽度和约束条件可选 3,字段名和类型是必须的
2.9.1>创建数据库
create databases db2;
2.9.3>使用数据库
use db2;
2.9.4>创建表
create table a1 ( id int, name varchar(50), age int(3) );
2.9.5>插入表的记录
insert into a1 values (1,"雪雪",29), (2,"小雪",25), (3,"雪儿",23);
以;作为mysql的结束语
2.9.6>查询数据表的数据和结构
1)查询a1表中的存存储数据:
2)查看a1表的结构
3)查看表的详细结构
2.9.7>复制表
1)创建一个新的数据库db4
2)使用db4
mysql> use db4; Database changed
当进入到db4数据库事物,如果想要查看数据库db1中的t5表,则需如下操作.(和导入模块一样)
3)复制db1.t5的表的结构和记录
mysql> create table b1 select * from db1.t5; Query OK, 3 rows affected (2.10 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql>
#这是复制标的操作(即复制了表的结构,又复制了表的数据)
4)查看db4.b1中的数据和表结构
ps1:如果只要表结构,不要表中的数据
#在db2数据库下新创建一个b2表,给一个where条件,条件要求不成立,条件为false,只拷贝表结构
查看表结构:
查看表中的数据,会发现是空数据
ps2:使用like(只拷贝表结构,不拷贝记录)
命令操作如下:
查看数据结构;
查看b3表的数据;
3,表的数据结构
储存引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但狂赌是可选的,详细参考:http://www.runoob.com/mysql/mysql-data-types.html
mysql常用数据类型概括:
#1,数字 类型:tinyint int bigint 小数: float:在位数比较短的情况下不精确 double:在位数比较长的情况下比较不精确 decimal:(如果用小数,则用推荐使用decimal) 精准, 内部原理是以字符串的形式去存 #2,字符串: char(10):简单粗暴,浪费空间,存取速度快 root存成root000000 varchar:精准,节省空间,存取速度慢 sql优化:创建表时,当场的类型往前放,边长的往后放 比如性别 比如地址或者描述信息(为以后表与表之间的管联做准备) >255个字符,超了就把文件路径存放到数据库中. 比如图片,视频找到一个文件服务器,数据库中只存放路径或url #3,时间类型: 最常用:datetime #4,枚举类型与几何类型 enum和set
3.1>数值类型
类型:tinyint,smallint,mediumint int bigint
作用:存储年龄,等级,id各种和数字有关联的数据.
1,tinyint[(m)] [unsigned] [zerofill] 小整型,数据类型用于保存一些范围的整数数值范围; 有符号: -128 ~127 无符号: 0~255 ps:MySQL中无布尔值,使用tinyint(1)表示true,用tinyint(0)表示true. 2,int[(m)] [unsigned] [zerofill] 整数,数据类型用于保存一些范围的整数数值范围: 有负号:-2147483648 ~ 2147483647 无负号: 0 ~ 4294967295 3,bigint [(m)] [unsigned] [zerofill] 大整数,数据类型用于保存一些范围的整数数值范围: 有负号:-9223372036854775808 ~ 9223372036854775807 无负号: 0 ~ 18446744073709551615
有负号和 无负号tinyint
#创建s1表,并规定x字段为tinyint数据类型(默认是有负号的)
#验证插入-1这个数
#查询表(默认是有负号的)
#插入的反为的边界是可以插入的
证明后面的类型是显示宽度,而不是存储宽度
###小结:一般在数字不用在int后边加类型,使用默认值就够了,当指定了宽度即使超过了宽度也能全部显示出来,但是不够指定的宽度,也是可以显示出来的,只不过前边几位没有用数字填充,用0填充也是可以的###
3.2>浮点型:
定点数类型:DEC等同于DECIMAL
浮点类型:FLOAT DOUBLE
作用:存储薪资,身高,体重,体质参数等.
1,float[(M,D)] [unsigned] [zerofill] #参数解释:单精度浮点数(非准确小数值),M是全长,D是小数点后个数.M最大值为255,D最大值为30. #有负号: -3.402823466E+38 to -1.175494351E-38, 1.175494351E-38 to 3.402823466E+38 有负号: 1.175494351E-38 to 3.402823466E+38 精确度: **** 随着小数的增多,精度变得不准确 **** 2,double double[(M,D)] [unsigned] [zerofill] #参数解释:双精度浮点数(费准确小数值), M是全长,D是小数点后个数,M最大值是255,D最大值为30 有负号: -1.7976931348623157E+308 to -2.2250738585072014E-308 2.2250738585072014E-308 to 1.7976931348623157E+308 #无负号: 2.2250738585072014E-308 to 1.7976931348623157E+308 #精确度: ****随着小数的增多,精度比float要高,但也会变得不准确 **** 3,decimal decimal[((m,d)] [unsigned] [zerofill] #参数解释:经过却的小数值,m是整数部分总个数(负号不算),d是畅销书点后个数,m最大值为65,d最大值为30. #精确度: **** 随着小数的增多,精度始终准确 **** 对于精确数值计算时需要用此类型 decaimal能够存储精确值的原因在于其内部按照字符串存储。
由此可以看出随着小数的增多,精度同样都变得不精确,但是decimal的精度最高.
3.3>日期类型:
date time datetime timestamp year
作用:存储用户注册时间,文章发布时间,员工入职时间,过期时间等.
语法: year: YYYY(1901/2155) date: YYYY-MM-DD(1000-01-01/9999-12-31) time: HH:MM:SS("-838:59:59"/"838:59:59") datetime: YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59 Y) timestamp YYYYMMDD HHMMSS(1970-01-01 00:00:00/获取到的是年某时)
3.3.1>:
在year中无论指定何种宽度都是4位,年份的范围是(1901/2155)这两个临界点也包括,在这个范围插入数据才生效.
3.3.2>date year datetime
在mysql中有一个自带的now()函数,获取的是当前类型的时间(时间戳时间)
3.3.3>timestamp(时间戳)
###当插入timestamp的值为空或者为null,或者到用内置函数now()时都是获得当前时间
4,字符类型
官网:https://dev.mysql.com/doc/refman/5.7/en/char.html
注意:char和varchar括号内的参数指的都是字符的长度.
char类型:定长,简单粗暴,浪费空间,存储速度快
字符长度范围:0-255(一个中文是一个字符,是utf8编码的3个字节)
存储:
存储char类型的值时,会往右填充空格来满足长度
例如:指定长度为10,存>10个字符则报错,存<10个字符则用空格填充直到凑够10个字符存储
检索:在检索或者说查询时,查出的结果会自动删除尾部的空格,除非我们打开pad_char_to_full_length SQL模式(设置SQL模式:SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';
查询sql的默认模式:select @@sql_mode;)
varchar类型:变长,精准,节省空间,存取速度慢
字符长度范围:0-65535(如果大于21845会提示用其他类型 。mysql行最大限制为65535字节,字符编码为utf-8:https://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html)
存储:
varchar类型存储数据的真实内容,不会用空格填充,如果'ab ',尾部的空格也会被存起来
强调:varchar类型会在真实数据前加1-2Bytes的前缀,该前缀用来表示真实数据的bytes字节数(1-2Bytes最大表示65535个数字,正好符合mysql对row的最大字节限制,即已经足够使用)
如果真实的数据<255bytes则需要1Bytes的前缀(1Bytes=8bit 2**8最大表示的数字为255)
如果真实的数据>255bytes则需要2Bytes的前缀(2Bytes=16bit 2**16最大表示的数字为65535)
检索:
尾部有空格会保存下来,在检索或者说查询时,也会正常显示包含空格在内的内容
官网:
查看:length();查看字节数; char_length();查看字符数;
当我们创建好表和数据的时候,查看char字符数的时候,系统会自动的将多余的空格删掉,因此像图一显示查到的字符数是汉子的数目,而varchar不会出现这样的情况.
如果想查看char的实际字符数,需要修改一下mode:set sql_mode = "pad_char_full_length";
查看字节数:
###char类型:3个中文字符+2个空格 = bytes
###varchar类型:3个中文字符+1个空格=10bytes.
5,没举型和集合型;
字段的值只能在给定范围中选择,如单选框,复选框
enum单选 ,只能在给定的范围内选一个值,如性别sex男male/女female
set多选在给定的范围内 可以选择一个或一个以上的值
enum:
create table consumer(
id int unsigend,
name char(20),
sex enum("male","female")not null default "male",
fav set("抽烟","喝酒","烫头")
);
insert into consumer(id,name,sex,fav) values(1,"alex","female","抽烟","烫头");
insert into consumer(id,name,sex) values(2,"alex2","female");
6,表的约束:
约束是在创建表的时候对表以后插入的数据进行约束,从而来保证数据的一致性与完整性.
1>not null不为空
2>default设置默认值
3>unique唯一性
4>primary key,表示:唯一且不为空,主键在sql中只允许表中有一个主键,通常主键是id
5>auto-increment表示自增长
6>foreign key:是建立多个表中的映射关系的.
7>undigned:表示无符号
8>zerofill:表示使用0填充
1,2.1>not null表示不为空,null表示为空,非字符串
create table tb1( nid int not null default 2, #表示插入的这个数字不为空,且不给值的情况下默认值为2. num int not null #表示插入的第二个数字不能为空 ); insert into tb1(num) values(3);
1,)当有默认值字段的时候在插入数据表后面当不指明数据变量的时候,必须插入相应的数据,默认数据对应的数据类型不可空缺,当指明表姐够的数据变量的时候就好了指谁就插入谁.
3.1>unique:不同的唯一的
#单列唯一(给某一行设置它的唯一性) create table department( id int, name char(10) unique )
insert into department values(1,"雪雪"),(2,"小雪");
当插入的name字段的值相同的时候会包错:
3.2>多列唯一:每个字段都设置unique
#每个字段都设置unique create table department2( in int unique, name char(10) unique ); #或者 create table department2( id int, name char(10), unique(id), unique(name) ); #在最后设置字段的约束条件.必须每个都满足条件才可以插入数据 insert into department2 values(1,"it1"),(2"it2");
3.3>组合唯一:
create table department3( id int, name char(10), unique(id,name) ); insert into department3 values(1."it"),(2,"it"); #只要有一个字段不一样,都可以插入只要有一个数据不一样就可以插入.
4.1>primary key主键(一个列表中可以单列做主键,也可以多列做主键,约束等同于not null unique),字段的值不为空且唯一,存储引擎默认是(innoDB):对于innoDB存储引擎来说,一张表必须有一个主键.
化学反应:not null + unique === primary key
5.1>auto_increment:自增长(默认从1开始)
结论:可以指定id值去插入数据,注意插入的数据id必须是增长的,中间可以有间隔,但必须是增长的,但在后边在不指定插入数据的时候会在默认最后一个id值追加一个id值,(即使前边有没有用的id值)
5.2>设置自增长的值
5.2.1>设置步长为会话设置,只在本次连接中有效,当关闭服务器,或者退出管理员系统这个设置就会消失
set session auto_increment_increment=5;
全局设置步长都有效.
set gloable auto_increment_increment=5;
设置起始偏移量
set gloable auto_increment_offset=3;
注意:如果设置的偏移量大于步长的值,则偏移量的值会被忽略.
设置完之后exit,待系统识别以后,再登陆才会有效.
6,1>foreign key是在靓装关联表建立关系
建立关系:constraint fk_id foreign key(dep_id) references dep(id)
on delete cascade on update cascade
结论:1>当2张表建立关系以后,删除主表 的时候 ,从表因为关联,也会删除相关联的数据,删除从表的受任何数据,主表不会受到任何的影响 ,
2>在建立标的时候一定要先建立主表,再建立从表,在插入数据的时候也是先插入主表的数据,再插入从表的数据(都是血的教训)
补充:清空区分delete和truncate:
delete from t1; # 如果有自增id,新增的数据,仍然是以删除前的最后一样作为起始
truncate table t1; # 数据量大,删除速度比上一条快,且直接先从0开始.