* 库的操作 (增删改查)一.系统数据库查看系统库命令 show databases1.information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息、列信息、权限信息、字符信息等2.performance_schema: MySQL 5.5开始新增一个数据库:主要用于收集数据库服务器性能参数,记录处理查询请求时发生的各种事件、锁等现象3.myslq: 授权库,主要存储系统用户的权限信息4.test: MySQL数据库系统自动创建的测试数据库二.创建数据库1.求救语法: help create database;2.创建数据库语法 CREATE DATABASE 数据库名 charset utf8;3.数据库命名规则: 可以由字母、数字、下划线、@、#、$ 区分大小写 唯一性 不能使用关键字如 create select 不能单独使用数字 最长128位三.数据库相关操作1.查看数据库 show databases;2.查看当前库 show create database db1;3.查看所在的库 select database()4.选择数据库 use 数据库名5.删除数据库 drop database 数据库名6.修改数据库 alter database db1 charset utf8;四 补充:1.SQL语言主要用于存取数据、查询数据、更新数据和管理关系数据库系统,SQL语言由IBM开发。SQL语言分为3种类型:(1)DDL语句 数据库定义语言: 数据库、表、视图、索引、存储过程,例如CREATE DROP ALTER(2)DML语句 数据库操纵语言: 插入数据INSERT、删除数据DELETE、更新数据UPDATE、查询数据SELECT(3)DCL语句 数据库控制语言: 例如控制用户的访问权限GRANT、REVOKE * 表的操作一.存储引擎1.数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎 存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。2.在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的3.MySql数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎二.mysql支持的存储引擎 查看所有支持的引擎 show engines\G; 查看正在使用的存储引擎 show variables like ‘storage_engine%‘;1.InnoDB 存储引擎2.MyISAM 存储引擎3.Memory 存储引擎4.BLACKHOLE 黑洞存储引擎5.指定表类型/存储引擎的命令: create table t1(id int)engine=innodb;# 默认不写就是innodb 小练习: 创建四张表,分别使用innodb,myisam,memory,blackhole存储引擎,进行插入数据测试 create table t1(id int)engine=innodb; create table t2(id int)engine=myisam; create table t3(id int)engine=memory; create table t4(id int)engine=blackhole;查看数据库中的文件:(1).frm是存储数据表的框架结构(2).ibd是mysql数据文件(3).MYD是MyISAM表的数据文件的扩展名(4).MYI是MyISAM表的索引的扩展名(5)memory 在重启mysql或者重启机器后,表内数据清空(6)blackhole 往表内插入任何数据,都相当于丢入黑洞,表内永远不存记录.三.表介绍: 表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称为表的字段. id,name,sex,age,birth称为字段,其余的,一行内容称为一条记录四.创建表语法: create table 表名( 字段名1 类型[(宽度) 约束条件], 字段名2 类型[(宽度) 约束条件], 字段名3 类型[(宽度) 约束条件] ); #注意: 1. 在同一张表中,字段名是不能相同 2. 宽度和约束条件可选 3. 字段名和类型是必须的1.创建数据库 create database db2 (charset utf8; )可省略2.使用数据库 use db23.创建表create table a1( id int, name varchar(50) age int(3));4.插入表的记录insert into a1 values(1,"mj",18),(2,"wu",28);5.查询表的数据和结构(1)查询表中的存储数据 select * from a1;(2)查看a1表的结构 desc a1;(3)查看表的详细结构 show create table a1\G;6.复制表(1)新创建一个数据db3 create database db3 charset utf8;(2)使用db3 use db3(3)既复制表结构,又复制记录create table b1 select * from db2.a1(4)查看db3文件夹中的数据和表结构:select * from db3.b1;7.如果只复制表结构,不要记录#在db2数据库下新创建一个b2表,给一个where条件,条件要求不成立,条件为false,只拷贝表结构 create table b2 select * from db2.a1 where 1>5; 查看表结构 desc b2; 查看表结构中的数据,是空数据; select * from b2;方法二: create table b3 like db2.a1;7.删除表:drop table 表明; *数据类型引入: 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的. 详细参考链接:http://www.runoob.com/mysql/mysql-data-types.html一.mysql常用数据类型概括: 1.数字 整型:tinyint int bigint 小数: float:在位数比较长的情况下不精准 double:在位数比较长的情况下不精准 decimal:精准 内部原理是以字符串形式去存; 2.字符串: char(10) :简单粗暴,浪费空间,存取速度快 varchar:精准,节省空间,存取速度慢 sql优化:创建表时,定长(性别)的类型往前放,变长(地址 描述信息)的往后放 大于255个字符,超了就把文件路径存放到数据库中,(图片 视频数据库中只存路径或url). 3.时间类型 常用datetime 4.枚举类型和集合类型二.数值类型(一) 整数类型:TINYINT SMALLINT MEDIUMINT INT BIGINT 默认有符号 作用:存储年龄,等级,id,各种号码等1.tinyint[(m)] [unsigned] [zerofill] 小整数,数据类型用于保存一些范围的整数数值范围: 有符号: -128 ~ 127 无符号: 0 ~ 255 MySQL中无布尔值,使用tinyint(1)构造。2. int[(m)][unsigned][zerofill] 整数,数据类型用于保存一些范围的整数数值范围: 有符号: -2147483648 ~ 2147483647 无符号: 0 ~ 42949672953.bigint[(m)][unsigned][zerofill] 大整数,数据类型用于保存一些范围的整数数值范围: 有符号: -9223372036854775808 ~ 9223372036854775807 无符号: 0 ~ 18446744073709551615注意: 默认是有符号; [unsigned](可设置) int类型后面的存储是显示宽度,而不是存储宽度 zerofill 用0填充 mysql> create table t4(id int(5) unsigned zerofill); 为该类型指定宽度时,仅仅只是指定查询结果的显示宽度,与存储范围无关,存储范围如下 其实我们完全没必要为整数类型指定显示宽度,使用默认的就可以了 默认的显示宽度,都是在最大值的基础上加1(二)浮点型 (存储薪资,身高,体重,体制参数)1.定点数类型:dec等同于decimal2.浮点类型:float double语法:单精度 float: 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 精确度: **** 随着小数的增多,精度变得不准确 ****双精度 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要高,但也会变得不准确 ****精准decimal: decimal[(m[,d])] [unsigned] [zerofill] 参数解释:准确的小数值,M是整数部分总个数(负号不算),D是小数点后个数。 M最大值为65,D最大值为30。 精确度: **** 随着小数的增多,精度始终准确 **** 对于精确数值计算时需要用此类型 decaimal能够存储精确值的原因在于其内部按照字符串存储。三.日期类型: (DATE TIME DATETIME TIMESTAMP YEAR)作用:存储用户注册时间,文章发布时间,员工入职时间,出生时间,过期时间等语法:复制代码语法: YEAR YYYY(1901/2155) create table t8(born_year year);#无论year指定何种宽度,最后都默认是year(4) 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) create table t9(d date,t time,dt datetime); insert into t9 values(now(),now(),now()) 调用mysql自带的now()函数,获取当前类型指定的时间 TIMESTAMP YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某时) create table t10(time timestamp); insert into t10 values(now());补充: 在实际应用的很多场景中,MySQL的这两种日期类型都能够满足我们的需要,存储精度都为秒,但在某些情况下,会展现出他们各自的优劣。 下面就来总结一下两种日期类型的区别。 1.DATETIME的日期范围是1001——9999年,TIMESTAMP的时间范围是1970——2038年。 2.DATETIME存储时间与时区无关,TIMESTAMP存储时间与时区有关,显示的值也依赖于时区。在mysql服务器,操作系统以及客户端连接都有时区的设置。 3.DATETIME使用8字节的存储空间,TIMESTAMP的存储空间为4字节。因此,TIMESTAMP比DATETIME的空间利用率更高。 4.DATETIME的默认值为null;TIMESTAMP的字段默认不为空(not null),默认值为当前时间(CURRENT_TIMESTAMP),如果不做特殊处理,并且update语句中没有指定该列的更新值,则默认更新为当前时间。注意:#1. 单独插入时间时,需要以字符串的形式,按照对应的格式插入#2. 插入年份时,尽量使用4位值#3. 插入两位年份时,<=69,以20开头,比如50, 结果2050 >=70,以19开头,比如71,结果1971 create table t12(y year); insert into t12 values (50),(71);四.字符类型:注意:char和varchar括号内的参数指的都是字符的长度1. 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;)2.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) 检索: 尾部有空格会保存下来,在检索或者说查询时,也会正常显示包含空格在内的内容3.相关函数: length():查看字节数 char_length():查看字符数查看字节数#char类型:3个中文字符+2个空格=11Bytes#varchar类型:3个中文字符+1个空格=10Bytes总结:#常用字符串系列:char与varchar注:虽然varchar使用起来较为灵活,但是从整个系统的性能角度来说,char数据类型的处理速度更快,有时甚至可以超出varchar处理速度的50%。因此,用户在设计数据库时应当综合考虑各方面的因素,以求达到最佳的平衡 #其他字符串系列(效率:char>varchar>text)TEXT系列 TINYTEXT TEXT MEDIUMTEXT LONGTEXTBLOB 系列 TINYBLOB BLOB MEDIUMBLOB LONGBLOBBINARY系列 BINARY VARBINARY text:text数据类型用于保存变长的大字符串,可以组多到65535 (2**16 ? 1)个字符。mediumtext:A TEXT column with a maximum length of 16,777,215 (2**24 ? 1) characters.longtext:A TEXT column with a maximum length of 4,294,967,295 or 4GB (2**32 ? 1) characters. 五.枚举类型和集合类型字段的值只能在给定范围中选择,如单选框,多选框enum :单选 只能在给定的范围内选一个值,如性别 sex 男male/女femaleset :多选 在给定的范围内可以选择一个或一个以上的值(爱好1,爱好2,爱好3...)示例:mysql> create table consumer( -> id int, -> name varchar(50), -> sex enum(‘male‘,‘female‘,‘other‘), -> level enum(‘vip1‘,‘vip2‘,‘vip3‘,‘vip4‘),#在指定范围内,多选一 -> fav set(‘play‘,‘music‘,‘read‘,‘study‘) #在指定范围内,多选多 -> );mysql> insert into consumer values -> (1,‘赵云‘,‘male‘,‘vip2‘,‘read,study‘), -> (2,‘赵云2‘,‘other‘,‘vip4‘,‘play‘);六.完整性约束(一)介绍 约束条件与数据类型的宽度一样,都是可选参数 作用:用于保证数据的完整性和一致性(二) PRIMARY KEY (PK) #标识该字段为该表的主键,可以唯一的标识记录 FOREIGN KEY (FK) #标识该字段为该表的外键 NOT NULL #标识该字段不能为空 UNIQUE KEY (UK) #标识该字段的值是唯一的 AUTO_INCREMENT #标识该字段的值自动增长(整数类型,而且为主键) DEFAULT #为该字段设置默认值说明: #1. 是否允许为空,默认NULL,可设置NOT NULL,字段不允许为空,必须赋值 #2. 字段是否有默认值,缺省的默认值是NULL,如果插入记录时不给字段赋值,此字段使用默认值 sex enum(‘male‘,‘female‘) not null default ‘male‘ #必须为正值(无符号) 不允许为空 默认是20 age int unsigned NOT NULL default 20 3. 是否是key 主键 primary key 外键 foreign key 索引 (index,unique...)UNSIGNED #无符号ZEROFILL #使用0填充1.not null 与default 是否可空,null表示空,非字符串 not null - 不可空 null - 可空 默认值,创建列时可以指定默认值,当插入数据时如果未主动设置,则自动添加默认值 create table tb1( nid int not null defalut 2, num int not null );2.unique在mysql中称为单列唯一 第一 create table department( id int, name char(10) unique); insert into department values(1,‘it‘),(2,‘sale‘); 第二: create table department( id int, name char(10) , unique(id), unique(name));insert into department values(1,‘it‘),(2,‘sale‘);联合唯一: mysql> create table services( -> id int, -> ip char(15), -> port int, -> unique(id), -> unique(ip,port) -> ); insert into services values -> (1,‘192,168,11,23‘,80), -> (2,‘192,168,11,23‘,81), -> (3,‘192,168,11,25‘,80); 3.primary key not null + unique的化学反应,相当于给id设置primary key 单列做主键 多列做主键(复合主键)约束等价于 not null unique,字段的值不为空且唯一:存储引擎默认是(innodb):对于innodb存储引擎来说,一张表必须有一个主键。(1)单列主键 创建t14表,为id字段设置主键,唯一的不同的记录 create table t14( id int primary key, name char(16)); insert into t14 values (1,‘xiaoma‘), (2,‘xiaohong‘); 错误:insert into t14 values(2,‘wxxx‘);(2)复合主键 create table t16( ip char(15), port int, primary key(ip,port)); insert into t16 values(‘1.1.1.2‘,80),(‘1.1.1.2‘,81); 4.auto_increment 约束:约束的字段为自动增长,约束的字段必须同时被key约束示例:create table student(id int primary key auto_increment,name varchar(20),sex enum(‘male‘,‘female‘) default ‘male‘);不指定idinsert into student(name) values (‘老白‘),(‘小白‘)指定IDinsert into student values(4,‘asb‘,‘female‘);再次插入一条不指定id的记录,会在之前的最后一条记录继续增长mysql> insert into student(name) values (‘大白‘);DELETE注意:对于自增的字段,在用delete删除后,再插入值,该字段仍按照删除前的位置继续增长示例:delete: delete from student; insert into student(name) values(‘ysb‘); 效果: id | name | sex | +----+------+------+ | 9 | ysb | male |应该用truncate清空表,比起delete一条一条地删除记录,truncate是直接清空表,在删除大表时用它TRUNCATE清空表 truncate student insert into student(name) values(‘xiaobai‘); | id | name | sex | +----+---------+------+ | 1 | xiaobai | male |补充: 查看可用的 开头auto_inc的词 show variables like ‘auto_inc%‘; 步长auto_increment_increment,默认为1# 起始的偏移量auto_increment_offset, 默认是1 设置步长 为会话设置,只在本次连接中有效 set session auto_increment_increment=5; #全局设置步长 都有效。 set global auto_increment_increment=5; # 设置起始偏移量 set global auto_increment_offset=3;注意: 如果auto_increment_offset的值大于auto_increment_increment的值,则auto_increment_offset的值会被忽略 设置完起始偏移量和步长之后,再次执行show variables like‘auto_inc%‘;发现跟之前一样,必须先exit,再登录才有效。 清空表区分delete和truncate的区别: delete from t1; #如果有自增id,新增的数据,仍然是以删除前的最后一样作为起始。 truncate table t1;数据量大,删除速度比上一条快,且直接从零开始。5.foreign key情景: 公司有3个部门,但是有1个亿的员工,那意味着部门这个字段需要重复存储,部门名字越长,越浪费。解决方法: 我们完全可以定义一个部门表 员工信息表关联该表,如何关联,即foreign key一张是employee表,简称emp表(关联表,也就从表)一张是department表,简称dep表(被关联表,也叫主表)代码: #1.创建表时先创建被关联表,再创建关联表# 先创建被关联表(dep表)create table dep( id int primary key, name varchar(20) not null, descripe varchar(20) not null); #再创建关联表(emp表)create table emp( id int primary key, name varchar(20) not null, age int not null, dep_id int, constraint fk_dep foreign key(dep_id) references dep(id)); #2.插入记录时,先往被关联表中插入记录,再往关联表中插入记录 insert into dep values(1,‘IT‘,‘IT技术有限部门‘),(2,‘销售部‘,‘销售部门‘),(3,‘财务部‘,‘花钱太多部门‘); insert into emp values(1,‘zhangsan‘,18,1),(2,‘lisi‘,19,1),(3,‘egon‘,20,2),(4,‘yuanhao‘,40,3),(5,‘alex‘,18,2);3.删除表 #按道理来说,删除了部门表中的某个部门,员工表的有关联的记录相继删除。 但是先删除员工表的记录之后,再删除当前部门就没有任何问题上面的删除表记录的操作比较繁琐,按道理讲,裁掉一个部门,该部门的员工也会被裁掉。其实呢,在建表的时候还有个很重要的内容,叫同步删除,同步更新注意:在关联表中加入on delete cascade #同步删除on update cascade #同步更新代码:复制代码create table emp( id int primary key, name varchar(20) not null, age int not null, dep_id int, constraint fk_dep foreign key(dep_id) references dep(id) on delete cascade #同步删除 on update cascade #同步更新);#再去删被关联表(dep)的记录,关联表(emp)中的记录也跟着删除 delete from dep where id=3; 再去更改被关联表(dep)的记录,关联表(emp)中的记录也跟着更改 update dep set id=222 where id=2;
原文地址:https://www.cnblogs.com/J-7-H-2-F-7/p/9557070.html
时间: 2024-10-29 19:10:58