1. 数据库基础
-
什么是SQL?
-
SQL ( Structured Query Language )
-
SQL是专为数据库建立的操作命令集,是一种功能齐全的数据库语言
-
数据 (Data)
-
数据库 (Database)
-
数据库管理系统 (DBMS) : 位于应用程序与存储数据之间的一层数据管理软件
-
数据库系统 (DBS)
-
-
2. DBMSDE主要功能
-
数据库的定义功能 :
DDL: 数据定义语言
create语句 : 创建数据库,创建表
alter语句 : 修改数据库结构,修改表结构
drop语句 : 删除数据库,删除表 -
数据库的操作功能 :
DML :数据库的操作语言
select语句 : 对数据的查询
insert语句 : 对数据的插入
update语句 : 对数据的更新
delete语句 : 对数据的删除 -
数据库的保护功能 :
-
数据库的数据恢复、数据库额并发控制、数据完整性控制和数据安全性控制
-
-
数据库的维护功能 :
-
数据库的数据导入、转换、储存、数据库性能监控等
-
-
DBMS的优点
-
相互关联的数据的集合
-
较少的数据冗余
-
程序和数据相互对立
-
保证数据的安全、可靠、准确
-
数据可并发使用并能同时保证数据的一致性
-
3. MySQL数据库
储存引擎 :
数据的存储方式就是存储引擎engines
使用不同的存储引擎,数据是以不同的方式存储的
查看存储引擎:
show engines
InnoDB : 存两个文件
1. 持久化存储
2. 并发 修改 删除的操作的效率比较高
3. mysql5.6以上,默认的存储方式
4. row-level locking 行级锁
5. table-;evel locking 表级锁
6. foreign keys 外键(约束)
7. 树tree - 加速查询 (树型结构+数据+表结构)
8. transations 事务 保证数据的安全和完整
myisam : 三个文件
1. 持久化存储
2. 读 插入的操作效率高一些
3. mysql5.5以下默认的存储方式
4. table-;evel locking 表级锁
5. 树tree - 加速查询(树型结构+数据+表结构)
memory : 磁盘中只存一个数据(表结构),其他存在内存中
基于hash检索(内存中检索)
# InnoDB
用于事务处理应用程序,支持外键和行级锁。如果应用对事物的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包括很多更新和删除操作,那么InnoDB存储引擎是比较合适的。InnoDB除了有效的降低由删除和更新导致的锁定,还可以确保事务的完整提交和回滚,对于类似计费系统或者财务系统等对数据准确要求性比较高的系统都是合适的选择。
# MyISAM
如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不高,那么可以选择这个存储引擎。
# Memory
将所有的数据保存在内存中,在需要快速定位记录和其他类似数据的环境下,可以提供极快的访问。Memory的缺陷是对表的大小有限制,虽然数据库因为异常终止的话数据可以正常恢复,但是一旦数据库关闭,存储在内存中的数据都会丢失。
# 修改储存引擎 默认innodb
create table 表名(表头...) engine=引擎; (myisam innodb memory)
例子:
create table myisam_t (id int,name char(18)) engine=myisam; # myisam innodb memory
查看创表语句
show create table 表名
MySQl数据库是一种开源的关系型数据库管理系统
查看所有的数据库 : show databases;
新建数据库 : create database 数据库名
删除数据库 : drop database 数据库名
Windows安装数据库
卸载数据库:
1. 停止mysql服务 cmd :net stop mysql
2. mysql remove 删除服务
3. 删除安装目录
4. 删除环境变量
5. 清除注册表/重启计算机
安装数据库 :
1. 路径不能有中文
2. 路径中不能有特殊字符
3. 在创建my.ini (utf-8格式)文件 在安装目录中创建 :
"""
配置mysql
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
[mysqld]
#设置3306端口
port = 3306
# 设置mysql的安装目录
basedir=D:\mysql\mysql-5.6.44-winx64
# 设置mysql数据库的数据的存放目录
datadir=D:\mysql\mysql-5.6.44-winx64\data
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
"""
4.配置环境变量 :
添加环境变量 D:\Mysql\mysql-5.6.45-winx64\bin
5. 管理员下cmd :mysqld install 安装
6. 启动mysql服务 :cmd下: net start mysql (启动的是mysql server端)
7. 启动客户端 cmd : mysql
mysql -u root #进入
mysql -u root -p #输密码进入
exit # 退出
3.1 MySQL数据类型
数值
类型 | 大小(字节) | 范围 (有符号) | 范围 (无符号) | 用途 |
---|---|---|---|---|
Tinyint | 1 | (-128 ~ 127) | (0 ~ 255) | 小整数值 |
Smallint | 2 | (-32768 ~ 32767) | (0 ~ 65535) | 大整数值 |
Mediumint | 3 | (-8388608 ~ 8388607) | (0 ~ 16777215) | 大整数值 |
Int/integer | 4 | (-2147483648 ~ 2147483647) | (0 ~ 4294967295) | 大整数值 |
BigInt | 8 | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |
下面是小数 | ||||
Float | 4 | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 单精度 浮点数值 |
Double | 8 | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 双精度 浮点数值 |
Decimal | 大小 : 若M>D,为M+2,然为D+2. 范围依赖于M和D的值 | 依赖于M和D的 | 小数值 |
日期/时间
表示时间值的日期和时间类型为DateTime、Date、TimeStamp、Time和Year。
每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。
TIMESTAMP类型有专有的自动更新特性,将在后面描述。
类型 | 大小 ( bytes) | 范围 | 格式 | 用途 |
---|---|---|---|---|
Date | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
Time | 3 | '-838:59:59'/'838:59:59' | HH:MM:SS | 时间值或持续时间 |
Year | 1 | 1901/2155 | YYYY | 年份值 |
DateTime | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
TimeStamp | 4 | 1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
字符串
字符串类型指char、varchar、binary、varbinary、blob、text、enum和set。该节描述了这些类型如何工作以及如何在查询中使用这些类型。
类型 | 大小 | 用途 |
---|---|---|
char | 0-255 bytes | 定长字符串 |
varchar | 0-65535 bytes | 变长字符串 |
tinyblob | 0-255 bytes | 不超过 255 个字符的二进制字符串 |
tinytext | 0-255 bytes | 短文本字符串 |
blob | 0-65 535 bytes | 二进制形式的长文本数据 |
text | 0-65 535 bytes | 长文本数据 |
mediumblob | 0-16 777 215 bytes | 二进制形式的中等长度文本数据 |
mediumtext | 0-16 777 215 bytes | 中等长度文本数据 |
longblob | 0-4 294 967 295 bytes | 二进制形式的极大文本数据 |
longtext | 0-4 294 967 295 bytes | 极大文本数据 |
char和varchar的区别
-
char是定长的,varchar是变长的
-
char类型比varchar效率高
-
varchar比char节省空间
enum和set类型
enum中文名称叫枚举类型,它的值范围需要在创建表时通过枚举方式显示。enum只允许从值集合中选取单个值,而不能一次取多个值。
set和enum非常相似,也是一个字符串对象,里面可以包含0-64个成员。根据成员的不同,存储上也有所不同。set类型可以允许值集合中任意选择1或多个元素进行组合。对超出范围的内容将不允许注入,而对重复的值将进行自动去重。
类型 | 大小 | 用途 |
---|---|---|
enum | 对1-255个成员的枚举需要1个字节存储;对于255-65535个成员,需要2个字节存储;最多允许65535个成员。 | 单选:选择性别 |
set | 1-8个成员的集合,占1个字节9-16个成员的集合,占2个字节17-24个成员的集合,占3个字节25-32个成员的集合,占4个字节33-64个成员的集合,占8个字节 | 多选:兴趣爱好 |
单选 : enum() # 只能从给出的有限的条件中选择 create table enum_t(sex enum('男','女')) # 如果写入其他的结果是空 多选 : set() 从有限的条件选多个,去重 creat table set_t(hobby set('抽烟','喝酒','烫头')); insert into set_t values('烫头,喝酒') # 自动去重,选其他则是空
3.2 约束
unsigned # 建表时,必须放在首位 只能约束int-无符号 not null # 非空约束 default # 设置默认值 直接在其后面放默认值 unique # 唯一;联合唯一 auto_increment # 自增(针对int) 自带not null 需要设置unique # 被auto_increment修饰的列为标识列,可以自动增长。一张表中只能有一个标识列 # auto_increment只能用来修饰数值类型的列,并且该类型的列列只能为key类型的列,key类型的列有: primary key 、unique、key、foreign key # 当为数据库表中插入新纪录时,字段上的值会自动生成唯一的ID,并且再次插入新数据,这个新数据自增 # 删除某一数据后,唯一的ID不会消失 primary key # 主键 相当于非空+唯一 一张表中只能有一个,且必须有 设置主键: alter table 表名 add primary key(需要设置主键的字段名); foreign key # 外键约束 # 约束字段至少 unique # 联级删除 on delete cascade # 联机更新 on update cascade 级联更新和级联删除 : create table test1( id int primary key auto_increment, cid int, foreign key(cid) references test2(id) on delete cascade on update cascade ); # 将表test1中的cid字段与 表test2中的id 进行联机更新和联级删除 # 由于是表test1中的某字段关联表test2中的某字段,所有,必须先有test2,也就是是必须先创建test2 # 插入数据同样必须同行中先有test2的数据,才能插入咋同行中插入test1数据 #修改数据只能修改test2中的数据,test1的数据会同步,
unique约束 可以插入多个null 对于mysql来说,数据与数据之间的相等就是重复 但是null不能用 = 判断 重复 二用 is / not is
联合唯一: create table t2( id int primary key, servername char(12) not null, ip char(15), port int, unique(ip,port) # 联合唯一
auto_increment 自增: 1.只能操作int 2.自带非空属性 3.只能对unique 字段设置 (唯一) 4.不受删除影响 (添加的id会记录下来,再次添加会延续下一位,删除数据后,再次添加也会延续那条删除的数据) create table t1( id int unique auto_increment name char(12) not null )
设置主键: 一张表只能有一个主键 primary key 联合主键: creat table t1( family_name char(4), name char(4), primary key(family_name, name) # 联合主键 key PRI )
外键级联 :
外键约束 : 对应表中的字段至少是unique的,推荐使用主键作为关联字段
级联更新和级联删除 : create table test1( id int primary key auto_increment, cid int, foreign key(cid) references test2id) on delete cascade on update cascade ); # 只允许被关联的字段数据删除和修,操作后,本字段会同步更新 foreign key(cid) references test2(id) # 这个不允许删除和修改,否则报错
# 数据的插入操作 将已有表格class的数据全部插入到新到的表格class1中 insert into class1 select * from class; 将已有数据表格class中的部分数据插入到class表格中 insert into class1(id,name) select id,cname from class; 正常插入数据: insert into 表名 values(字段数据,字段数据,...);
3.3 数据库建表方式和原则
查看所有的数据库 : show databases; 新建数据库 : create database 数据库名; 删除数据库 : drop database 数据库名; 删除表: drop table 表名1,表名2...; 进入数据库 : use 数据库名; 查看表结构 : desc 表名; 查看创表语句 : show create table student;
select user(); # 查看当前登录用户 set password = password("密码"); # 给当前用户设置密码 create user '用户名'@'192.168.16.%'; # 创建用户,并且16网段下的所有主机都可以用这个用户名登录 create user '用户名'@'192.168.16.%' identified by '密码'; # 创建用户,设置密码 grant on 数据库名.表名 to '用户名'@'ip地址' # 创建 用户设置查看相应表的权限 grant on 数据库名.表名 to '用户名'@'ip地址%' identified by '密码' ; # 创建用户和密码并给相应表的权限 在这个数据库下的所有表中给这个用户名增删改查的权限(all): grant all on 数据库名.* to '用户名@ip地址' 客户端登录srver: mysql -u用户名 -h server端IP地址 -p root下查看所有用户: select user,host from mysql.user; 删除用户: delect from mysql.user where user like '用户名%';
注释 : 单行注释 " -- " 多行注释 " /* 注释的内内容 */ "
创建表
create table 表名 ( 属性名1 数据类型 [约束条件], 属性名2 数据类型 [约束条件], ... 属性名n 数据类型 [约束条件] ); [] 中是可选内容 最后一个属性后没有逗号 create table students( id varchar(20), nane varchar(10), age int, );
修改表
1. 添加字段
alter table 表名 add 属性名 数据类型; alter table student add sex char(6); alter table 表名 add (属性名 数据类型,属性名 数据类型...); alter table student add (height int, weight int);
2. 添加主键约束
-
通过alter语句
alter table 表名 modify 字段 数据类型 primary key alter table 表名 add primary key(字段) alter table 表名 add constraint 主键约束的名字 primary key(字段)
-
删除主键约束
alter table 表名 drop primary key
3. 删除字段
alter table 表名 drop 属性名; alter table student drop height;
4. 修改字段
alter table 表名 modify 字段名 类型 alter table student modify weight char(10); alter table 表名 change 字段名 字段名 类型 alter table student change weight 体重 int;
5. 查表结构
desc 表名
6. 清空表
delete from 表名 # 如果有自增id,新增的数据,仍然是以删除以前的最后数据作为起始 truncate table 表名 # 数据量大,删除速度比上一条块,却直接从零开始,(初始化表)
对数据的操作
1. 添加数据
insert into 表名 value(数据) # 只能添加一条数据 insert into 表名 values(数据1),(数据2)... insert into 表名(字段1,字段2) values(对应数据1,对应数据2) # 给单独的字段添加数据(其他字段约束为null的时候) insert into 表1(字段1,字段2) select (字段3,字段4) from 表2 # 给表1的字段1,字段2 添加表2的字段3,字段4的数据
2. 删除数据
delete from 表名 where 条件 delete from 表名 where id=1
3. 修改数据
update 表名 set 字段=值 where 条件 update 表名 set 字段1=值1,字段2=值2...where 条件 update 表名 set 字段1=值1,字段2=值2...where id=1
4. 查询数据
单表查 :
select 字段名 from 表名 # 查多个字段用逗号隔开 select * from 表名 # 查整个表 select user() # 查询当前用户 select database() # 查询当前所在库 select now() # 查询当前时间 select distinct 字段名 from 表名 ; # 去重查 select distinct 字段名,字段名 from 表名 ; # 多个字段去重查 select 字段名 新名字 from 表名 ; # 重命名 select 字段名 新名字,字段名 新名字 from 表名 ; # 重命名 select 字段名 as 新名字 from 表名 ; # 重命名 拼接字符: select concat('要添加的字符串','要添加的字符串',...原字段名) from 表名 select concat('要添加的字符串','要添加的字符串',...原字段名)自定义显示表头 from 表名 select concat('要添加的字符串','要添加的字符串',...原字段名)as 自定义显示表头 from 表名 select concat_ws('要添加的字符串','要添加的字符串',...原字段名) from 表名 select concat_ws('要添加的字符串','要添加的字符串',...原字段名) 自定义字显示表头 from 表名 select concat_ws('要添加的字符串','要添加的字符串',...原字段名) as 自定义显示表头 from 表名
多表查 :
内连接 - inner join
内连接 - 只显示两张表中互相匹配上的项
select * from 表1 inner join 表2 on 连接条件 select * from 表1 inner join 表2 on dep_id = department.id select * from 表1 inner join 表2 on dep_id = department.id 条件
外连接 :
左外连接 select * from 表1 left join 表2 on 连接条件 # 谁在左边全部显示谁 右外连接 select * from 表1 right join 表2 on 连接条件 # 谁在右边全部显示谁 全外连接: select * from 表1 left join 表2 on 连接条件 union select * from 表1 right join 表2 on 连接条件
子查询 - 嵌套查询 :
select * from department where id in (select distinct dep_id from employee where age>25);
子查询处理可以放在条件中,还可以放在连表中,还可以放在select字段(要求查询的结果必须是一个单行单列的值)中.
推荐连表 : 连表的效率比子查询的效率要高
select 语句到底做了什么? select name from emp; select name as n,(select age from employee where name = n) from emp;
select * from 表 where 字段 > 一个值 如果我们查询出来的结果是一个值,那么就可以使用 > < = select * from 表 where 字段 in (1个值,1个值) 如果我们查询出来的结果是一列中的多个值 # dep_id # 201 # 202 # 204 如果我们查出来的是一张表,也不能作为条件,如果必须保留这两个字段,就不能用作条件,只能连表 # id name # 1 alex
2.2 Oracle数据库
启动和关闭数据库实例
-
启动数据库实例
-
Oracle数据库实例的启动分三个步骤 : 启动实例、加载数据库、打开数据库
-
startup nomount / mount / open / force nomount :表示启动实例不加载数据库 mount : 启动实例,加载数据库并保持数据库的关闭状态 opem :启动实例,加载并打开数据库,默认选项 force : 终止实例并重新启动数据库
-
切换用户
conn 用户名/密码 [as sysdba];
括号内可写可不写 -
root用户登录 :
conn sys/change_on_install as sysdba;
-
显示当前登录的用户 :
show user;
-
-
关闭数据库实例
-
关闭数据库、卸载数据库、关闭Oracle实例
-
shutdown normal / transactional / immediate / abort normal : 正常关闭数据库 transactional :所有的活动事务提交完毕后,再关闭数据库 immediate : 尽可能短的时间内立即关闭数据库 abort : 以终止的方式关闭数据库
-
-
查数据
在使用sqlplus的时候,首先进行环境的设置
1. 设置每行数据显示的长度(一行显示的最多字符总数) set linesize 长度; 2. 修改每页新式记录的长度(从顶部标题到结束之间大的行数) set pagesize 行数;
查全部表 : select * from tab 查表结构 : desc 表名
数据类型 :
Number(n) : 表示数字(可小数),n表示数字的长度 Varchar2(n) : 表示字符串,n表示字符串的长度 Date :表示日期 Number(7,2) : 表示数字,共7位,小数占2位,整数占5位
连接符 " ||"
-
去重
查询所有的工作种类 select distinct job form emp;
-
别名
指定别名查询 select empno 编号,ename 姓名,job 工作 from emp;
-