MySQL概述

文章目录

    • 一、概述
    • 二、数据库操作
      • 1、DDL
      • 2、DML
      • 3、DQL
      • 4、DCL
    • 三、MySQL函数
    • 四、事务
    • 五、索引
    • 六、数据库管理
    • 七、数据库设计
    • 八、JDBC
    • 小结

一、概述

什么是数据库?
数据库是一个长期存放在计算机内,有组织可共享的大量数据集合,是一个数据仓库。数据库能够保存并管理数据,一般分为两种:

  • 关系型数据库(SQL):通过外键关联建立表与表之间的关系。
    MySQL、Oracle、SQL server…
  • 非关系型数据库(NoSQL):数据以对象的形式存储在数据库中,对象之间的关系通过每个对象自身属性来决定。
    Redis、MongoDB…

什么是DBMS?
数据库管理系统:可以有效的组织、存储和维护数据的数据库软件。

MySQL简介
一个开源的非关系型数据库,免费且功能齐全,是各大企业常用的数据库。

二、数据库操作

结构化查询语句分类

MySQL概述_第1张图片

1、DDL

  1. 数据值和列类型

数值类型
字符串类型
日期和时间型数值
NULL值

  1. 数据字段属性

Unsigned
ZEROFILL
Auto_Increment
NULL和NOT NULL
DEFAULT

  1. 数据表的类型

数据表类型:MyISAM,InnoDB,HEAP,BOB…
设置数据表字符集:CHARSET=utf8(可在数据库配置my.ini文件中修改默认参数设定)
MySQL概述_第2张图片

注:(代码中[]表示可选项)

创建表

create table [if not exists] `表名`( 
	'字段名1' 列类型 [属性][索引][注释], 
	'字段名2' 列类型 [属性][索引][注释], 
	#... 
	'字段名n' 列类型 [属性][索引][注释] 
)[表类型][表字符集][注释]; 

修改表
修改表名:ALTER TABLE 旧表名 RENAME AS 新表名
添加字段:ALTER TABLE 表名 ADD 字段名 列类型[属性]
修改字段:
ALTER TABLE 表名 MODIFY 字段名 列类型[属性]
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 列类型[属性]
删除字段:ALTER TABLE 表名 DROP 字段名

删除表

DROP TABLE [IF EXISTS] table_name;

2、DML

用于操作数据库对象中包含的数据,包括:INSERT(插入)、 UPDATE(更新)、 DELETE(删除)等语句
INSERT

INSERT INTO table_name[(column_name1, column_name2,...)] VALUES('value1','value2','value3');

UPDATE

UPDATE table_name SET column_name=value [,column_name2=value2,...] [WHERE condition];

DETELE

DELETE FROM table_name [WHERE condition];

TRUNCATE:清空表数据,但表结构、索引、约束等不变

TRUNCATE [table] table_name;

注:DELETE与TRUNCATE的区别:
相同 : 都能删除数据 , 不删除表结构 , 但TRUNCATE速度更快
不同 :

  • 使用TRUNCATE TABLE 重新设置AUTO_INCREMENT计数器
  • 使用TRUNCATE TABLE不会对事务有影响

3、DQL

模板:

SELECT [ALL | DISTINCT]
{* | Table.* | [Table.field1[as alias1][,table.field2[as alias2]][,...]}
FROM table_name [as table_alias]
	[left | right | inner join table_name2] --联合查询
	[WHERE ...] --结果筛选条件
	[GROUP BY ...] --分组条件
	[HAVING ...] --过滤分组的次要条件
	[ORDER BY ...] --排序条件
	[LIMIT {[offset,] row_count | row_countOFFSET offset}] --查询的记录条数

补充
EXPLAIN语句 : 分析SQL语句执行性能
详细:【MySQL优化】——看懂explain

4、DCL

事务、权限管理,见后小节

三、MySQL函数

常用函数:略

聚合函数
MySQL概述_第3张图片
MD5加密:用MD5函数对密码进行加密,例update table_test set pwd = md5(pwd);

四、事务

概念

  • 事务指一组SQL语句在同一批次被执行
  • 如果批次中存在错误语句,那么所有语句执行失效
  • MySQL事务处理只支持InnoDB和BDB数据表类型

ACID原则

  • 原子性
    MySQL概述_第4张图片
  • 一致性
    MySQL概述_第5张图片
  • 隔离性
    MySQL概述_第6张图片
  • 持久性
    MySQL概述_第7张图片

事务实现:包括提交处理指令(COMMIT)和取消处理指令(ROLLBACK)两种。

--使用set语句来改变自动提交模式(MySQL默认开启自动提交)
SET autocommit=0;/*关闭自动提交*/
SET autocommit=1;/*开启自动提交*/
--开始一个事务,标记事务起始点
START TRANSACTION
/*事务执行语句*/
[SAVEPOINT name] --设置保存点
--提交一个事务给数据库或回滚事务到初始状态
[COMMIT]/[ROLLBACK [name]](可回滚到指定保存点)
--还原自动提交
SET autocommit=1; 
[RELEASE SAVEPOINT] --删除保存点

五、索引

概念:在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
作用

  • 提高查询速度
  • 确保数据的唯一性
  • 可以加速表和表之间的连接 , 实现表与表之间的参照完整性
  • 使用分组和排序子句进行数据检索时 , 可以显著减少分组和排序的时间
  • 全文检索字段进行搜索优化

分类

  • 主键索引 (Primary Key):某一属性能唯一标识一条记录(只有一个)
  • 唯一索引 (Unique):避免同一个表中某列数据中的值重复(可能有多个)
  • 常规索引 (Index):快速定位特定数据
  • 全文索引 (FullText):快速定位特定数据(百度搜索)

索引准则

  • 索引不是越多越好
  • 不要对经常变动的数据加索引
  • 小数据量的表建议不要加索引
  • 索引一般应加在查找条件的字段

索引的数据结剖析

好文:MySQL索引背后的数据结构及算法原理

六、数据库管理

权限管理:授予权限GRANT、删除权限REVOKE

-- 分配权限/添加用户 
GRANT 权限列表 ON 表名 TO 用户名 [IDENTIFIED BY [PASSWORD] 'password'] 
	- all privileges 表示所有权限 
	- *.* 表示所有库的所有表 
	- 库名.表名 表示某库下面的某表 

-- 查看权限 SHOW GRANTS FOR root@localhost; 
SHOW GRANTS FOR 用户名 
	-- 查看当前用户权限 
	SHOW GRANTS;SHOW GRANTS FOR CURRENT_USER;SHOW GRANTS FOR CURRENT_USER(); 

-- 撤消权限 
REVOKE 权限列表 ON 表名 FROM 用户名 
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 用户名 -- 撤销所有权限
-- 权限列表 
ALL [PRIVILEGES] -- 设置除GRANT OPTION之外的所有简单权限 
ALTER -- 允许使用ALTER TABLE 
ALTER ROUTINE -- 更改或取消已存储的子程序 
CREATE -- 允许使用CREATE TABLE 
CREATE ROUTINE -- 创建已存储的子程序 
CREATE TEMPORARY TABLES -- 允许使用CREATE TEMPORARY TABLE 
CREATE USER -- 允许使用CREATE USER, DROP USER, RENAME USER和REVOKE ALL PRIVILEGES。 
CREATE VIEW -- 允许使用CREATE VIEW 
DELETE -- 允许使用DELETE 
DROP -- 允许使用DROP TABLE 
EXECUTE -- 允许用户运行已存储的子程序 
FILE -- 允许使用SELECT...INTO OUTFILE和LOAD DATA INFILE 
INDEX -- 允许使用CREATE INDEX和DROP INDEX 
INSERT -- 允许使用INSERT 
LOCK TABLES -- 允许对您拥有SELECT权限的表使用LOCK TABLES 
PROCESS -- 允许使用SHOW FULL PROCESSLIST 
REFERENCES -- 未被实施 
RELOAD -- 允许使用FLUSH 
REPLICATION CLIENT -- 允许用户询问从属服务器或主服务器的地址 
REPLICATION SLAVE -- 用于复制型从属服务器(从主服务器中读取二进制日志事件) 
SELECT -- 允许使用SELECT 
SHOW DATABASES -- 显示所有数据库 
SHOW VIEW -- 允许使用SHOW CREATE VIEW 
SHUTDOWN -- 允许使用mysqladmin shutdown 
SUPER -- 允许使用CHANGE MASTER, KILL, PURGE MASTER LOGS和SET GLOBAL语句, mysqladmin debug命令;允许您连接(一次),即使已达到max_connections。 
UPDATE -- 允许使用UPDATE 
USAGE -- “无权限”的同义词 
GRANT OPTION -- 允许授予权限


-- 分析和存储表的关键字分布 
ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE 表名 ... 
-- 检查一个或多个表是否有错误 
CHECK TABLE tbl_name [, tbl_name] ... [option] ... option = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED} 
-- 整理数据文件的碎片 
OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...

备份管理

  • 直接拷贝数据库文件
  • 使用mysql命令行

导出:mysqldump -uroot -p123456 [-B] DB_name [table_name] > file_pathname(i.e. D:/a.sql)
导入:mysql -u(username) -p(pwd) DB_name < XX.sql(备份文件)

七、数据库设计

规范数据库设计:良好的数据库能够节省数据存储空间,保证数据完整性,方便进行数据库应用系统的开发,有效保证开发活动的正常进行。

三大范式

  • 第一范式 (1st NF)

第一范式的目标是确保每列的原子性,如果每列都是不可再分的最小数据单元,则满足第一范式。

  • 第二范式(2nd NF)

第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一 范式(1NF)。
第二范式要求记录是唯一的,即每个表只描述一件事情。

  • 第三范式(3rd NF)

如果一个关系满足第二范式,并且除了主键以外的其他列都不传递依赖于主键列,则满足第三范式.
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。

数据库设计三大范式详解

八、JDBC

MySQL概述_第8张图片
数据库驱动:可简单理解为操作数据库的中间程序。
JDBC:sun公司为了简化和统一对数据库的操作,定义了几套java操作数据库的规范,称之为JDBC。开发人员只需要学习jdbc接口,就可以操作数据库。

组成:java.sql、javax.sql包以及数据库驱动

步骤:
1、加载驱动
2、获取与数据库的连接
3、获取向数据库发送sql语句的对象
4、将SQL语句传递给数据库并执行,获取结果集
5、取出结果集中的数据
6、关闭连接,释放资源

通用代码:(驱动已导入项目依赖库)

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class JdbcDemo{
	public static void main(String[] args) throws Exception{
		Connection conn = null;
		Statement st = null;
		ResultSet rs  = null;
		try{
			String url = "jdbc:mysql://localhost:3306/jdbcTest? useUnicode=true&characterEncoding=utf8&useSSL=true";
			String username = "root";
			String password = "123456";
			//1.-
			Class.forName("com.mysql.jdbc.Driver");
			//2.-
			conn = DriverManager.getConnection(url, username, password);
			/*可开启事务*/
			//conn.setAutoCommit(false);
		
			//3.-
			st = conn.createStatement();
			String sql = "select * form test_table";
			//4.-
			rs = st.executeQuery(sql);
			//5.-
			while(rs.next()){
				System.out.println(rs.getObject("id"));
				System.out.println(rs.getObject("name"));
			}
			/*提交事务*/
   			//conn.commit();
			}catch(Exception e){
				/*失败回滚事务*/
				try{
					conn.rollback();
				}catch(SQLException e){
					e.printStackTrace();
				}
				e.printStackTrace();
			}finally{
				//6.-
 		 		rs.close();
  				st.close();
  				conn.close();
 			}
		}
	}
}

PreparedStatement和Statement对象

PreperedStatement是Statement的子类,它的实例对象可以通过调用
Connection.preparedStatement()方法获得,相对于Statement对象而言:

  • PreperedStatement可以避免SQL注入的问题。(PreperedStatement把传入的参数视为字符串,并忽略转义字符
  • Statement会使数据库频繁编译SQL,可能造成数据库缓冲区溢出。
  • PreparedStatement可对SQL进行预编译,从而提高数据库的执行效率。并且
    对于sql中的参数,PreperedStatement允许使用占位符的形式进行替换,简化sql语句的编写。
String sql = "insert into users(id,name) values(?,?)"; 
//通过conn对象获取负责执行SQL命令的prepareStatement对象 
st = conn.prepareStatement(sql); //为SQL语句中的参数赋值,注意,索引是从1开始的 
st.setInt(1, 1);//id是int类型的 
st.setString(2, "leo");//name是varchar(字符串类型)

代码复用:上面的步骤过于繁琐,可以通过一个属性文件(.property或.xml)包装连接属性(用户名、密码、URL等)。再定义一个工具类完成对数据库的连接和释放。

数据库连接池
数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。

开源数据源连接池:

  • DBCP
  • C3P0

在项目中使用时需要导入相应jar包,并遵循使用规范编码,实际上,这些数据库连接池本质都是对DateSource接口的实现,用户也可以实现该接口以生成自定义数据连接池。

小结

本篇文章简单介绍了数据库相关知识,但深度有限,后续会进一步探讨MySQL调优技术。

MySQL面试题汇总:MySQL数据库面试题(2020最新版)

你可能感兴趣的:(数据库)