数据库
数据库管理系统
数据库应用软件
2、SQL 语言
数据定义语言(DDL) drop create alter
数据操作语言(DML)insert update delete
数据查询语言(DQL)select
数据控制语言(DCL) grant revoke commit
3、mysql 简绍
客户端— 服务器软件 (client / server)
Mysql 社区版 和 mysql 服务版
4、提高数据库方面的能力
多写 sql 语句
5、启动
首先要启动 mysql 服务器 ,然后才能连接到客户端
常用的操作数据库的 sql 语句
显示当前的数据库
show databases;
显示当前的表
show tables
查看当前使用的数据库
select database()
最初有 6 张必须的数据库!这六张表非常重要
例如:mysql 是必须的,描述了用户的访问权限等等
创建数据库
create databse database_name;
删除数据库
drop database database_name;
查看数据库使用端口
show variables like ‘port’;
查看数据库编码
show variables like 'character%';
7、数据库存储引擎
数据库管理系统(DBMS)使用数据引擎创建、查询、更新和删除数据操作。
不同的存储引擎提供存储机制、索引技巧、锁定水平等。
mysql的核心就是存储引擎
不要在整个服务器使用同一种 存储引擎 。针对具体的要求,对每一个表使用不同的存储引擎。InnoDB、MyISAM、Memory、Merge等等。
查看系统支持的引擎类型
show engines;
Support 列表示某种引擎是否能用,yes 表示可以使用,no表示不能使用,default 表示当前引擎为默认的储存引擎。
InnoDB 存储引擎
事务型数据库的首选引擎,mysql5.5后为默认的存储引擎。
主要的特性:
1、InnoDB 给 MySql 提供了具有提交、回滚和奔溃恢复能力的事务安全存储引擎。
提供事务的支持,这样 java 、 spring 等才拥有事务属性
2、InnoDB 处理巨大数据量最大性能设计
MyISAM 存储引擎
基于 ISAM 存储引擎,对其扩展在 web 、数据仓库和其他应用环境。
主要特性:
大文件
当把删除、更新及插入操作混合使用的时候,动态尺寸的行产生更少的碎片
最大的键长度是 1000 字节
Memory 存储引擎
Memory 存储引擎将表中的数据存储到内存中。
为查询和引用其他表数据提供快速访问。
8、存储引擎的选择
不同的存储引擎都有各自的特点,以适应不同的需求。
如果要提交、回滚和崩溃恢复能力的事务安全能力,并要实现并发控制,InnDB 是个很好的选择
如果只是用来插入和查询记录,用 MyISAM 引擎能提供较好的处理效率。
如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择保存在内存的 memory 引擎
总结:一个数据库多张表,可以使用不同的引擎各种可能和实际需求,使用合适的引擎可以大大的提高整个数据库性能。
查看默认存储引擎
show variables like “shorage_engine"
9、数据表的基本操作
数据表是数据库中最重要、最基本的操作对象,是数据存储的基本单位。
创建数据表的过程是约束数据属性列的过程
数据表属于数据库,创建数据表前,应该先使用数据库
use [数据库 ]
如果没有选择数据库,会抛出 “no database selected"
首先创建数据库
create database test_db;
选择创建的数据库
use test_db;
创建 table 表
create table tb_empl
(
id int(11),
name varchar(25),
salary float
);
查看 table 表
show tables;
使用主键约束
主键,表中一列或者多列的组合,主键约束要求主键数据唯一,并且部位空。能够唯一的标识一条记录。
create table tb_empl
(
id int(11) primary key,
name varchar(25),
salary float
);
create table tb_empl
(
id int(11),
name varchar(25),
salary float,
primary key(id)
);
使用外键约束
现在大型互联网公司禁止使用外键,一搬都是冗余字段。
在设计数据库时,某一字段属于一个表,但它又同时出现在另一个或多个表,且完全等同于它在其本来所属表的意义表示,那么这个字段就是一个冗余字段。
数据量大的时候你会发现两个表通过联接来取数据就显得相当费力了。
合理的加入冗余字段这个润滑剂,减少join,让数据库执行性能更高更快
使用非空约束
字段名 数据类型 not null
name varchar(25 ) not null
使用唯一性约束
可以为空,但是只能有一个为空
字段名 数据类型 unique
name varchar(22) unique
使用默认约束
字段名 数据类型 DEFAULT 默认值
deptId INT(11) default 1111
设置表的属性值自动增加
字段名 数据类型 auto_increment
id int(11) primary key auto_increment
查看表的基本结构语句
describe 表名
或者
desc 表名
示例:desc prd_term_opt
查看创建数据库表的 创建结构语句
show create table 表名
使用上面语句后,还可以看到存储引擎和字符编码
例如:
CREATE TABLE `person` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`NAME` varchar(80) NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
修改数据表名
alter table <oldTableName> rename [to] <newTableName>
修改字段类型
alter table <tableName> modify <字段名> <数据类型>
ALTER TABLE USER MODIFY PASSWORD VARCHAR(15)
修改字段名
alter table <tableName> change <旧字段名> <新字段名> <数据类型>
添加字段
alter table <tableName> add <新字段名>
<数据类型> [first | after 已存在字段名 ]
first 为可选参数,将新添加的字段设置为表的第一个字段
after 为可选参数,其作用将新添加字段放到指定字段后面
alter table user add hello VARCHAR(64) first
添加物无完整性约束的字段
alter table user add hello VARCHAR(64)
添加物完整性约束条件的字段
alter table user add hello VARCHAR(64) not null
alter table user add demo VARCHAR(64) after hello
删除字段
alter table <tableName> drop <字段名>
修改字段的排列位置
alter table <tableName> modify <需要修改字段> <数据类型> first | after <排在什么字段的后面>
alter table user modify id int(10)
AFTER Email
Id 表示需要修改的字段 , Email表示需要排列的字段。
alter table user modify id int(10) FIRST
经常多用 desc <tableName>
更改表的存储引擎
可以根据需要,选择不同的存储引擎,甚至可以为每张表选择不同的存储引擎。
查看数据库存储引擎
更改存储引擎的语法
alter table <tableName> engine = <更改存储引擎名>
alter table user = MyISAM;
删除数据表
注意删除数据表的同时,表中的数据也被删除了。
专家解惑
疑问1 :表删除操作须谨慎。
表删除操作将把表的定义和表中的数据-起删除,并且MySQL在执行删除操作时,不会有任何的确认信息提示,因此执行删除操时,应当慎重。在删除表前,最好对表中的数据进行备份,这样当操作失误时,可以对数据进行恢复,以免造成无法挽回的后果。
疑问2 :每一个表中都要有一个主键吗?
并不是每-一个表中都需要主键,如果多个表之间进行连接操作时,需要用到主键。因此并不需要为每个表建立主键,而且有些情况最好不使用主键。
疑问3 :并不是每个表都可以任意选择存储引擎。
外键约束( FOREIGN KEY)不能跨引擎使用。MySQL支持多种存储引擎,每一个表都可以指定一个不同的存储引擎,但是要注意:外键约束是用来保证数据的参照完整性,如果表
之间需要关联外键,却指定了不同的存储引擎,这些表之间是不能创建外键约束的。所以说,存储引擎的选择也不完全是随意的。
疑问4 :带AUTO_ INCREMENT 约束的字段值是从1开始的吗?
默认的,在MySQL中, AUTO_ INCREMENT的初始值是1,每新增一条记录, 字段值自动加1。设置自增属性(AUTO INCREMENT)的时候,还可以指定第一条插入记录的自 增字段的值,这样新插入的记录的自增字段值从初始值开始递增,如在tb_ emp8 中插入第一- 条记录,同时指定id值为5,则以后插入的记录的id值就会从6开始往上增加。添加唯一~性的主键约束时,往往需要设置字段自动增加属性。
第五章 数据类型和运算符
基本的数据库了类型
数据库表由多列字段构成,每一个字段指定了不同的数据类型。指定字段的数据类型之后,也就决定了向字段插入的数据内容,例如,当要插入数值的时候,可以将它们存储为整数类型,也可以将它们存储为字符串类型;不同的数据类型也决定了MySQL在存储它们的时候使用的方式,以及在使用它们的时候选择什么运算符号进行运算。
(1)数值数据类型:包括整数类型TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT、浮点小数数据类型FLOAT和DOUBLE,定点小数类型DECIMAL。
(2)日期/时间类型:包括YEAR、TIME、DATE、DATETIME 和TIMESTAMP。
(3)字符串类型:包括CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET等。字符串类型又分为文本字符串和二进制字符串。
显示宽度只用于显示,并不能限制取值范围和占用空间,如: INT(3)会占用4个字节的存储空间,并且允许的最大值也不会是999,而是INT整型所允许的最大值。
如何选择数据库类型
MySQL提供了大量的数据类型,为了优化存储,提高数据库性能,在任何情况下均应使
用最精确的类型。即在所有可以表示该列值的类型中,该类型使用的存储最少。
1.整数和浮点数
如果不需要小数部分,则使用整数来保存数据;如果需要表示小数部分,则使用浮点数类
型。对于浮点数据列,存入的数值会对该列定义的小数位进行四舍五入。例如,如果列的值的
范围为1~99999,若使用整数,则MEDIUMINT UNSIGNED是最好的类型;若需要存储小数,
则使用FLOAT类型。
浮点类型包括FLOAT和DOUBLE类型。DOUBLE类型精度比FLOAT类型高,因此,
如要求存储精度较高时,应选择DOUBLE类型。
2.浮点数和定点数
浮点数FLOAT、DOUBLE相对于定点数DECIMAL的优势是:在长度-定的情况下,浮点数能表示更大的数据范围,但是由于浮点数容易产生误差,因此对精确度要求比较高时,建
议使用DECIMAL来存储。
DECIMAL在MySQL中是以字符串存储的,用于定义货币等对精确度要求较高的数据。在数据迁移中,float(M,D)是非标准 SQL定义,数据库迁移可能会出现问题,最好不要这样使用。另外两个浮点数进行减法和比较运算时也容易出问题,因此在进行计算的时候,一定要小心。如果进行数值比较,最好使用DECIMAL类型。
3.日期与时间类型
MySQL对于不同种类的日期和时间有很多的数据类型,比如YEAR和TIME。如果只需要记录年份,则使用YEAR类型即可;如果只记录时间,只需使用TIME类型。
如果同时需要记录日期和时间,则可以使用TIMESTAMP或者DATETIME类型。由于TIMESTAMP列的取值范围小于DATETIME的取值范围,因此存储范围较大的日期最好使用
DATETIME。
TIMESTAMP也有-一个DATETIME不具备的属性。默认的情况下,当插入一- 条记录但并没有指定TIMESTAMP这个列值时,MySQL会把TIMESTAMP列设为当前的时间。因此当
需要插入记录同时插入当前时间时,使用TIMESTAMP是方便的,另外TIMESTAMP在空间上比DATETIME更有效。
4. CHAR与VARCHAR之间的特点与选择
CHAR和VARCHAR的区别如下:
●CHAR是固定长度字符,VARCHAR是可变长度字符;
●CHAR会自动删除插入数据的尾部空格,VARCHAR不会删除尾部空格。
CHAR是固定长度,所以它的处理速度比VARCHAR的速度要快,但是它的缺点就是浪费存储空间。所以对存储不大,但在速度上有要求的可以使用CHAR类型,反之可以使用
VARCHAR类型来实现。
存储引擎对于选择CHAR和VARCHAR的影响:
●对于MyISAM存储引擎:最好使用固定长度的数据列代替可变长度的数据列。这样可以使整个表静态化,从而使数据检索更快,用空间换时间。
●对于InnoDB存储引擎:使用可变长度的数据列,因为InnoDB数据表的存储格式不分固定长度和可变长度,因此使用CHAR不一定比使用VARCHAR更好。
但由于VARCHAR是按照实际的长度存储,比较节省空间,所以对磁盘I/O和数据存储总量比较好。
5. ENUM和SET
ENUM只能取单值,它的数据列表是一一个枚举集合。它的合法取值列表最多允许有65 535个成员。因此,在需要从多个值中选取一个时,可以使用ENUM。比如:性别字段适合定义
为ENUM类型,每次只能从‘男’或‘女’中取一个值。
SET可取多值。它的合法取值列表最多允许有64个成员。空字符串也是一一个合法的SET值。在需要取多个值的时候,适合使用SET类型,比如:要存储一个人兴趣爱好,最好使用
SET类型。ENUM和SET的值是以字符串形式出现的,但在内部,MySQL 以数值的形式存储它们。
6. BLOB和TEXT
BLOB是二进制字符串,TEXT是非二进制字符串,两者均可存放大容量的信息。BLOB主要存储图片、音频信息等,而TEXT只能存储纯文本文件。
常见的运算符
运算符连接表达式中各个操作数,其作用是用来指明对操作数所进行的运算。运用运算符可以更加灵活地使用表中的数据,常见的运算符类型有 : 算术运算符,比较运算符,逻辑运算符,位运算符。本章节将介绍各种运算符的特点和使用方法。
1.算术运算符
算术运算符用于各类数值运算,包括加(+)、减(-)、乘(*)、除(1)、求余(或称模运算,%)。
一系列的 SQL 语句 :
create table tmp14 (num int)
desc tmp14
insert into tmp14 VALUE (64)
desc tmp14
select * from tmp14
select num,num+12,num +23 from tmp14;
2.比较运算符
比较运算符用于比较运算。包括大于(>) 、小于(<)、等于(=)、大于等于(>=)、小于等于(<=)、不等于(!=),以及IN、BETWEEN AND、IS NULL、GREATEST、LEAST、
LIKE、REGEXP 等。
等于运算符
等号(=) 用来判断数字、字符串和表达式是否相等。如果相等,返回值为1,否则返回值为0。
select 1 = 0, '2' = 2 , 2=2 , 'b' = 'b’ ;
安全等于运算符
这个操作符和 = 操作符执行相同的 比较操作,不过 <=> 可以用来判断NULL值。在两个操作数均为NULL时,其返回值为1而不为NULL;而当一个操作数为NULL时,其返回值为0而不为NULL。
select 1<=> 0, '2'<=>2, 'b'<=> 'b';
select 1<=> null, '2'<=>2, 'b'<=> 'b',null <=> null;
不等于运算符
‘< >’或者 ‘ ! = ’ 用于判断数字、字符串、表込式不相等的判断。如果不相等,返回值为1;否則返回值为 0。这两个运算符不能用于判断空値NULL。
select 'good' <> 'god' , 1 <> 2 , 4 != 4;
小于或者等于运算符
‘<=’'用来判断左边的操作数是否小于或者等于右边的操作数。如果小于或者等于,返回值为1,否则返回值为0。‘<=’ 不能用于判断空值NULL。
select ‘good’ <= ‘god’ , 1 < 2 , 4 <= 4
IS NULL 运算符 IS NOT NULL 运算符
IS NULL和ISNULL检验一个值是否为 NULL, 如果为NULL,返回值为1。否则返回值为0;
ISNOTNULL检验-一个值是否为非NULL,如果是非NULL,返回值为1;否则返回值为0。
select null is null , isnull(null) , isnull(10) , 10 is not null
between and 运算符
语法格式为 : expr BETWEEN min AND max。假如expr大于或等于min且小于或等于max,则BETWEEN的返回值为1,否则返回值为0。,
select 4 between 2 and 5 , 4 between 3 and 6 , 12 between 9 and 10;
LEAST 运算符
语法格式为 : LEAST(值1,2值..值n) , 其中值n表示参数列表中有n个值。在有两个或多个参数的情况下 , 返回最小值。假如任意一个自变量为NULL , 则LEASTO的返回值为NULL。
select least(2,0) , least(20,3,45) , least('a','b','c'),least (10,null) ;
greatest 运算符
语法格式为: GREATEST(值1,值2..值n),其中n表示参数列表中有n个值。当有2个或多个参数时,返回值为最大值,假如任意一~个 自变量为NULL,则GREATESTO的返回值
为NULL。
select GREATEST(0,10),GREATEST('a','b','c'),GREATEST('a','b','c');
IN 、 NOT IN 运算符
IN运算符用来判断操作数是否为IN列表中的其中-一个值,如果是,返回值为1;否则返回值为0。
NOT IN运算符用来判断表达式是否为IN列表中的其中-一个值,如果不是,返回值为1;否则返回值为0。:
select 2 IN (1,2,5,'thks') , 'thk' IN (1,3,5,'thks')
like运算符
LIKE运算符用来匹配字符串,语法格式为: expr LIKE匹配条件,如果expr满足匹配条件,则返回值为1 (TRUE) ;如果不匹配,则返回值为0 (FALSE)。若expr或匹配条件中
任何一一个为NULL,则结果为NULL。
LIKE运算符在进行匹配时,可以使用下面两种通配符:
(1)‘%’,匹配任何数目的字符,甚至包括零字符。
(2) ’_’ 只能匹配-一个字符。
select 'stud' like 'stud','stud' like 'stu_' , 'stud' like 'd'
regexp 运算符
REGEXP运算符用来匹配字符串,语法格式为:
expr REGEXP匹配条件,如果expr满足匹配条件,返回1;如果不满足,则返回0;若expr 或匹配条件任意-一个为NULL,则结果为NULL。
REGEXP运算符在进行匹配时,常用的有下面几种通配符:
(1)“ ^ ’ 匹配以该字符后面的字符开头的字符串。
(2) ‘$’ 匹配以该字符后面的字符结尾的字符串。
(3) ‘ . ’ 匹配任何一个单字符。
(4) “]”匹配在方括号内的任何字符。例如,“[abc]”匹配“a”、“b”或“c”为了命名字符的范围,使用一个‘’。“[a-z]” 匹配任何字母,而“[0-9]”匹配任何数字。
(5) **' 匹配零个或多个在它前面的字符。例如, “x*”匹配任何数量的‘x’ 字符,“[0-9]*”匹配任何数量的数字,而“*”匹配任何数量的任何字符。
select 'ssky' REGEXP '^s' , 'ssky' REGEXP 'y$' ,'ssky' REGEXP '.sky'
正则表达式
一个可以进行复杂查询的强大
工具,相对于LIKE字符串匹配,它可以使用
更多的通配符类型,查询结果更加灵活。读者可以参考相关的书籍或资料,详细学习正则
表达式的写法,在这里就不再详细介绍了。后面章节中,会介绍到如何使用正则表达式查
询表中的记录。
3.逻辑运算符
逻辑运算符的求值所得结果均为1 (TRUE)、0 (FALSE),这类运算符有逻辑非(NOT或者!)、逻辑与(AND或者&&)、逻辑或(OR或者|)、逻辑异或(XOR)。
在SQL中,所有逻辑运算符的求值所得结果均为TRUE、FALSE或NULL。在MySQL
中,它们体现为1(TRUE)、 0(FALSE)和NULL。其大多数都与不同的数据库SQL通用。
NOT 或者 !
逻辑非运算符NOT或者!表示当操作数为0时,所得值为1;当操作数为非零值时,所得值为0;当操作数为NULL时,所得的返回值为NULL。
select not 10 , not ( 1- 1 ) , not null , not 1 + 1
4.位操作运算符
位操作运算符参与运算的操作数按二进制位进行运算。包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)6种。
更多文章请关注《万象专栏》