前言
在平时的开发过程中,数据库是必须掌握的一项技能,只有熟练的掌握了数据库的相关知识才能大大的提高开发效率和代码质量。
本文全面且详细的说一说数据库的相关知识。
一、数据库介绍
1.1 概念
数据库(Database)是按照数据结构来组织、存储和管理数据的建立在计算机存储设备上的仓库。
1.2 数据库分类
数据库从类型上来区分可以分为以下三种数据库:
网络数据库
网络数据库是指把数据库技术引入到计算机网络系统中,借助于网络技术将存储于数据库中的大量信息及时发布出去;而计算机网络借助于成熟的数据库技术对网络中的各种数据进行有效管理,并实现用户与网络中的数据库进行实时动态数据交互。
层级数据库
层次结构模型实质上是一种有根结点的定向有序树(在数学中"树"被定义为一个无回的连通图)。
关系数据库
关系数据库是我们日常开发的使用最多的数据库类型。关系数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。现实世界中的各种实体以及实体之间的各种联系均用关系模型来表示。关系模型是由埃德加·科德于1970年首先提出的,并配合“科德十二定律”。现如今虽然对此模型有一些批评意见,但它还是数据存储的传统标准。关系模型由关系数据结构、关系操作集合、关系完整性约束三部分组成。
典型关系型数据库
Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL、SQLite。
二、SQL基本操作
结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。
2.1 SQL分类
结构化查询语言在之前的一片文章也详细的说明过:SQL语言:DDL、DML、DQL、DCL详解,它可以分为以下几种:
1、 数据查询语言(DQL:Data Query Language):
其语句,也称为“数据检索语句”,用以从表中获得数据,确定数据怎样在应用程序给出。保留字SELECT是DQL(也是所有SQL)用得最多的动词,其他DQL常用的保留字有WHERE,ORDER BY,GROUP BY和HAVING。这些DQL保留字常与其他类型的SQL语句一起使用。
2、数据操作语言(DML:Data Manipulation Language):
其语句包括动词INSERT,UPDATE和DELETE。它们分别用于添加,修改和删除表中的行。也称为动作查询语言。
3、事务处理语言(TPL):
它的语句能确保被DML语句影响的表的所有行及时得以更新。TPL语句包括BEGIN TRANSACTION,COMMIT和ROLLBACK。
4、数据控制语言(DCL):
它的语句通过GRANT或REVOKE获得许可,确定单个用户和用户组对数据库对象的访问。某些RDBMS可用GRANT或REVOKE控制对表单个列的访问。
5、数据定义语言(DDL):
其语句包括动词CREATE和DROP。在数据库中创建新表或删除表(CREAT TABLE 或 DROP TABLE);为表加入索引等。DDL包括许多与人数据库目录中获得数据有关的保留字。它也是动作查询的一部分。
三、Mysql基本介绍
MySQL是一个关系型数据库管理系统,也是在日常开发过程中使用最多的数据库之一。它由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。
3、1 MySQL数据库相关操作
启动和停止MySQL服务
命令行方式:net start/stop
系统服务方式:services.msc
登录和退出MySQL系统
登录:mysql/mysql.exe -hPup
退出:exit/quit/\q
3、1、1 数据库操作
创建数据库:create database 数据库名字 [库选项]
显示数据库
1、显示全部:show databases;
2、匹配部分:show databases like ‘pattern’;
选择数据库:use 数据库名字;
修改数据库
1、修改数据库字符集:alter database 数据库名字 [新库选项];
删除数据库:drop database 数据库名字;
3、1、2 数据表操作
创建数据表
1、普通创建表:create table 表名 (字段名 字段类型) [表选项]
2、表选项:存储引擎、字符集、校对集
3、复制已有表结构:create table 表名 like 已有表名;
显示数据表
1、显示所有表:show tables;
2、匹配显示表:show tables like ‘pattern’;
3、显示表结构
Describe\desc\show columns from 表名
4、显示表创建语句:show create table 表名;
设置表属性:varchar/int
修改表结构
1、修改表名:rename table 旧表名 to 新表名
2、修改表选项:alter table 表名 表选项 [=] 新值
3、新增字段:alter table 表名 add [column] 新字段名 列类型 [列属性] [位置first/after 字段名]
4、修改字段名:alter table 表名 change 旧字段名 新字段名 字段类型 [列属性] [新位置]
5、修改字段类型(属性):alter table 表名 modify 字段名 新类型 [新属性] [新位置]
6、删除字段:alter table 表名 drop 字段名
删除表结构:drop table 表名列表;
3、1、3 数据操作
插入操作
1、指定字段:Insert into 表名[(字段列表)] values(对应字段列表)
2、全表字段:Insert into 表名 values(对应表结构)
查询操作
1、查询表中全部数据:select * from 表名
2、查询表中部分字段:select 字段列表 from 表名
删除操作:delete from 表名;
更新操作:update 表名 set 字段 = 新值;
3、2 列属性
简单属性
1、Null属性
2、默认值
设定默认值
使用default关键字
3、列描述
主键
1、创建主键
字段后创建:primary key
表字段后创建:primary key(字段)
表创建后增加:alter table 表名 add primary key(字段)
2、查看主键:desc\show create table 表名;
3、删除主键:alter table 表名 drop primary key;
4、复合主键:primary key(字段列表)
自动增长
1、原理
初始值
步长
2、使用自动增长:auto_increment
3、修改自动增长:alter table 表名 auto_increment = 新值;
4、删除自动增长:alter table 表名 modify 字段 字段类型 [没有自增长]
5、初始设置
查看初始状态:Show variables like ‘auto_increment%’;
修改初始设置:set auto_increment_increment/offset = 新值;
6、细节问题
一张表只能有一个自增长字段
唯一键
1、创建唯一键
字段后创建:unique [key];
表字段后创建:unique key(字段名)
表创建后:alter table 表名 add unique key(字段名);
2、查看唯一键
3、删除唯一键:alter table 表名 drop index 唯一键名字
4、复合唯一键:unique key(字段列表)
外键
1、外键概念
如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。由此可见,外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。外键又称作外关键字。
2、基本操作
增加外键:[constraint `外键名字` ] foreign key(外键字段) references 主表(主键);
查看外键:desc/show create table 表名;
删除外键:alter table 表名 drop foreign key 外键名字;
外键约束
1、约束的基本概念
2、外键约束的概念
3、外键约束级别
严格:district
级联:cascade
置空:set null
四、SQL的高级数据操作
4、1 复杂查询
新增数据
1、多数据插入
insert into 表名[(字段列表)] values(值列表1),(值列表2)…; 复制代码
2、主键冲突
冲突更新:
insert into [(字段列表)] values(值列表1) on duplicate key update 字段 = 新值; 复制代码
冲突替换:
replace into 表名[(字段列表)] values(值列表1; 复制代码
3、蠕虫复制
insert into 表名 [(字段列表)] select */字段列表 from 表 复制代码
更新数据
1、条件限制:where 条件;
2、记录数限制:limit 数据;
删除数据
1、条件限制:where 条件;
2、记录数限制:limit 数据;
查询数据
1、From数据源
单表数据:表名
多表数据:表1,表2…,笛卡尔积
动态数据:from (select语句) as 别名
2、Where子句:条件限定
3、Group by子句
分组统计:group by 字段名;
聚合函数:Count,max,min,avg,sum,group_concat
多分组:group by 字段1,字段2…
分组排序:group by 字段 [asc|desc]
回溯统计:with rollup
4、Having子句:针对group by结果判定
5、Order by子句:order by 字段 [asc|desc]
6、Limit子句
记录数限制:limit 数量;
分页:limit 起始位置,数量;
连接查询
1、连接查询的意义
2、连接查询分类
交叉连接、内连接、外连接、自然连接
3、交叉连接:左表 cross join 右表;
4、内连接:左表 [inner] join 右表 on 连接条件;
5、外连接
左连接:左表 left join 右表 on 连接条件;
右连接:左表 right join 右表 on 连接条件;
6、自然连接:左表 natural [inner/left/right] join 右表
7、using关键字
子查询
1、子查询概念
子查询是一种常用计算机语言SELECT-SQL语言中嵌套查询下层的程序模块。当一个查询是另一个查询的条件时,称之为子查询。
2、主查询概念
3、子查询和主查询的关系
4、子查询分类
按位置:from子查询、where子查询
按功能:标量/列/行/表/exists 子查询
5、子查询中特定关键字使用
in、any、some、all
4、2 用户权限管理
用户管理
1、创建用户
表插入:insert into mysql.user (username,password,host) values(用户信息列表)
SQL指令:create user 用户名@主机地址 [identyfied by ‘明文密码’];
2、删除用户:drop user 用户名@主机地址;
3、修改用户密码
更新表:update mysql.user set password=password(‘明文密码’) where username=用户名 and host=主机地址;
SQL指令:set password for 用户名@主机地址;
权限管理
1、授予权限:grant
grant 权限列表/all privileges on 数据库.数据表 to 用户名@主机地址;
2、取消权限:revoke
revoke 权限列表/all privileges on 数据库.数据表 from 用户名@主机地址;
3、刷新权限:flush
flush privileges;
4、权限分类
数据权限、结构权限、管理权限
密码丢失的解决方案
1、关闭Mysql服务器
2、利用Mysqld.exe重启服务器
mysqld/mysqld.exe –skip-grant-tables
3、新建客户端利用mysql无用户登录
4、修改密码
5、关闭服务器,正常启动服务器
总结
本文对数据库的一些基本概念和操作进行了总结,关于数据库的更深层次的知识,比如触发器、视图、存储过程、数据库优化等等,之前也有文章进行了专门的详细介绍,有兴趣的可以参考阅读,后面也将会更新关于数据库的其他文章。