MySQL 数据库入门与实战教程(一)
1.入门与基础概念1.1MySQL 的基本概念mysql 与 mysqld 的区别mysql是客户端程序用来连接、操作数据库。mysqld是服务端程序后台运行负责管理磁盘上的数据库文件。两者的关系程序员通过 mysql 客户端向 mysqld 服务端发送指令服务端再操作磁盘上的数据。数据库的本质数据库服务是一套提供数据存取的网络程序基于 C(mysql)/S(mysqld)客户端 / 服务器模式。数据库本质上就是 Linux 系统里的目录和文件比如建立数据库 → 本质是在系统里创建一个目录建立表 → 本质是在该目录下创建对应的文件程序员不直接操作这些文件而是通过 mysqld 服务来间接操作以此保证数据的安全与高效。为什么要用数据库普通文件虽然能存数据但没有良好的数据管理能力而数据库服务可以帮我们处理复杂的数据存储、查询、管理需求直接给我们想要的结果程序员只需要写 SQL 指令即可。1.2什么是数据库存储数据用文件就可以了为什么还要弄个数据库?文件保存数据有以下几个缺点文件的安全性问题文件不利于数据查询和管理文件不利于存储海量数据文件在程序中控制不方便数据库存储介质磁盘内存为了解决上述问题专家们设计出更加利于管理数据的东西——数据库它能更有效的管理数据。数据库的水平是衡量一个程序员水平的重要指标。1.3MySQL 的工作流程mysqld服务在后台监听 3306 端口图中LISTEN状态等待客户端连接。程序员通过 mysql 客户端发送 SQL 指令如登录、查询、修改。mysqld 服务接收到指令后去磁盘上的数据库文件中执行对应的操作。结果再通过网络返回给 mysql 客户端呈现给程序员1.4主流数据库SQL Sever 微软的产品.Net程序员的最爱中大型项目。Oracle甲骨文产品适合大型项目复杂的业务逻辑并发一般来说不如MySQL。MySQL世界上最受欢迎的数据库属于甲骨文并发性好不适合做复杂的业务。主要用在电商SNS论坛。对简单的SQL处理效果好。PostgreSQL :加州大学伯克利分校计算机系开发的关系型数据库不管是私用商用还是学术研究使用可以免费使用修改和分发。SQLite 是一款轻型的数据库是遵守ACID的关系型数据库管理系统它包含在一个相对小的C库 中。它的设计目标是嵌入式的而且目前已经在很多嵌入式产品中使用了它它占用资源非常的低在嵌入式设备中可能只需要几百K的内存就够了。H2 是一个用Java开发的嵌入式数据库它本身只是一个类库可以直接嵌入到应用项目中。2.数据库的基本使用2.1连接服务器输入mysql -h 127.0.0.1 -P 3306 -u root -p输出注意如果没有写-h 127.0.0.1默认是连接本地如果没有写-P 3306默认是连接3306端口号2.2服务器数据库表关系所谓安装数据库服务器只是在机器上安装了一个数据库管理系统程序这个管理程序可以管理多个数据库一般开发人员会针对每一个应用创建一个数据库。为保存应用中实体的数据一般会在数据库中创建多个表以保存程序中实体的数据。数据库服务器、数据库和表的关系如下2.3使用案例创建数据库create database helloworld;使用数据库use helloworld;创建数据库表create table student( id int, name varchar(32), gender varchar(2) );表中插入数据insert into student (id, name, gender) values (1, 张三, 男); insert into student (id, name, gender) values (2, 李四, 女); insert into student (id, name, gender) values (3, 王五, 男);查询表中的数据select * from student;演示数据逻辑存储3.MySQL架构MySQL是一个可移植的数据库几乎能在当前所有的操作系统上运行如Unix/Linux、Windows、Mac 和Solaris。各种系统在底层实现方面各有不同但是MySQL基本上能保证在各个平台上的物理体系结构的一致性。Client Connectors客户端连接器支持各种语言JDBCJava、ODBC.NET、PHP、Python、Perl、C API作用让应用程序能连接到 MySQL核心层MySQL Server服务核心这是 MySQL 的 “大脑”干这些事连接池处理连接、验证账号密码SQL 接口接收你的 SQL 命令建表、插入、查询解析器检查 SQL 语法对不对优化器选最快的方式执行 SQL缓存存常用结果加速查询工具服务备份、安全、集群这些辅助功能Pluggable Storage Engines可插拔存储引擎这是 MySQL 的 “手脚”负责和磁盘打交道比如InnoDB默认支持事务MyISAM老引擎速度快但不支持事务 不同引擎可以存不同表各有各的用法。最底层文件系统与日志数据最终存在磁盘文件里同时还有各种日志操作日志、错误日志、事务日志保证数据安全、可恢复。一句话总结客户端发请求 → MySQL Server 处理 → 存储引擎读写磁盘 → 返回结果。4.SQL分类DDL【data definition language】数据定义语言用来维护存储数据的结构代表指令:create, drop, alter管结构建库、建表、删库、改表DML【data manipulation language】数据操纵语言用来对数据进行操作代表指令insertdeleteupdate管数据增、删、改DML中又单独分了一个DQL数据查询语言代表指令select管查询只查不改DCL【Data Control Language】数据控制语言主要负责权限管理和事务代表指令grantrevokecommit管权限、事务超级好记口诀DDL 盖房子建表DML 搬家具增删改数据DQL 看房子查数据DCL 管钥匙权限5.存储引擎1.存储引擎存储引擎是数据库管理系统如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。MySQL的核心就是插件式存储引擎支持多种存储引擎2.查看存储引擎show engines;3.存储引擎对比MySQL 里最常用、也是默认的存储引擎是InnoDB6.库的操作1.创建数据库语法CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name说明大写的表示关键字[]是可选项CHARACTER SET:指定数据库采用的字符集COLLATE:指定数据库字符集的校验规则2.创建数据库案例创建名为db1的数据库create database db1;说明当我们创建数据库没有指定字符集和校验规则时系统使用默认字符集utf8校验规则是utf8_ general_ ci创建一个使用utf8字符集的db2数据库create database db2 charsetutf8;创建一个使用utf字符集并带校对规则的db3数据库。create database db3 charsetutf8 collate utf8_general_ci;3.字符集和校验规则数据库编码集字符集作用规定数据如何存储决定数据库里存的字符是什么样的。比如utf8/utf8mb4决定了中文、特殊字符能不能正常存进去。数据库校验集排序 / 校对规则作用规定数据如何比较、排序、读取是基于字符集的一套规则。比如utf8_general_ci决定了字符串比较时是否区分大小写、重音符号等。总结数据库编码集负责存储数据校验集负责比较数据如WHERE、排序。两者必须匹配否则操作会出错或乱码。3.1查看系统默认字符集以及校验规则show variables like character_set_database; show variables like collation_database;3.2查看数据库支持的字符集show charset;字符集主要是控制用什么语言。比如utf8就可以使用中文。3.3查看数据库支持的字符集校验规则show collation;3.4校验规则对数据库的影响不区分大小写创建一个数据库校验规则使用utf8_ general_ ci[不区分大小写]create database test1 collate utf8_general_ci; use test1; create table person(name varchar(20)); insert into person values(a); insert into person values(A); insert into person values(b); insert into person values(B);区分大小写创建一个数据库校验规则使用utf8_ bin[区分大小写]create database test2 collate utf8_bin; use test2 create table person(name varchar(20)); insert into person values(a); insert into person values(A); insert into person values(b); insert into person values(B);进行查询不区分大小写的查询以及结果区分大小写的查询以及结果结果排序不区分大小写排序以及结果区分大小写排序以及结果4.操纵数据库4.1查看数据库show databases;4.2显示创建语句show create database 数据库名说明MySQL建议我们关键字使用大写但是不是必须的。数据库名字的反引号,是为了防止使用的数据库名刚好是关键字/*!40100 default.... */这个不是注释表示当前mysql版本大于4.01版本就执行这句话/*!80016 ...*/同理表示版本大于 8.00.16 时执行加密选项4.2修改数据库语法ALTER DATABASE db_name [alter_spacification [,alter_spacification]...] alter_spacification: [DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name说明对数据库的修改主要指的是修改数据库的字符集校验规则实例 将db1数据库字符集改成gbk4.4数据库删除DROP DATABASE [IF EXISTS] db_ name;执行删除之后的结果:数据库内部看不到对应的数据库对应的数据库文件夹被删除级联删除里面的数据表全部被删注意不要随意删除数据库4.5备份和恢复--放在最后1.备份语法:# mysqldump -P3306 -u root -p 密码 -B 数据库名 数据库备份存储的文件路径示例将test1库备份到文件退出连接# mysqldump -P3306 -u root -p -B test1 D:test1.sql这时可以打开看看mytest.db1文件里的内容其实把我们整个创建数据库建表导入数据的语句都装载这个文件中。2还原3注意事项如果备份的不是整个数据库而是其中的一张表怎么做# mysqldump -u root -p 数据库名 表名1 表名2 D:/mytest.sql同时备份多个数据库# mysqldump -u root -p -B 数据库名1 数据库名2 ... 数据库存放路径如果备份一个数据库时没有带上-B参数 在恢复数据库时需要先创建空数据库然后使用数据库再使用source来还原。4.6查看连接情况语法show processlist可以告诉我们当前有哪些用户连接到我们的MySQL如果查出某个用户不是你正常登陆的很有可能你的数据库被人入侵了。以后大家发现自己数据库比较慢时可以用这个指令来查看数据库连接情况。