温馨提示
mysql安装包里面:
mysqld是服务端,mysql是客户端。
mysqld其实是SQL后台程序(也就是MySQL服务器),它是关于服务器端的一个程序,mysqld意思是mysql daemon,在后台运行,监听3306端口,如果你想要使用客户端程序,这个程序必须运行,因为客户端是通过连接服务器来访问数据库的。你只有启动了mysqld.exe,你的mysql数据库才能工作。
mysql是一个客户端软件,可以对任何主机的mysql服务(即后台运行的mysqld)发起连接,mysql自带的客户端程序一般都在cmd或者终端下进行操作
mysqld是用来启动mysql数据库的命令
mysql是打开并执行sql语句的命令
注意
在你使用MySQL的过程中,即使你用的是UTF-8编码的客户端,服务器也是UTF-8编码的,数据库也是,就连要保存的这个字符串“ <…”也是合法的UTF-8。
有的时候会报一串奇怪的错误,问题的症结在于,MySQL的“utf8”实际上不是真正的UTF-8。
MySQL的“utf8”只支持每个字符最多三个字节,而真正的UTF-8是每个字符最多四个字节。
MySQL一直没有修复这个bug,他们在2010年发布了一个叫作“utf8mb4”的字符集,绕过了这个问题。
当然,他们并没有对新的字符集广而告之(可能是因为这个bug让他们觉得很尴尬),以致于现在网络上仍然在建议开发者使用“utf8”,但这些建议都是错误的。
简单概括如下:
1.MySQL的“utf8mb4”是真正的“UTF-8”。
2.MySQL的“utf8”是一种“专属的编码”,它能够编码的Unicode字符并不多。
因此:所有在使用“utf8”的MySQL和MariaDB用户都应该改用“utf8mb4”,永远都不要再使用“utf8”。
一、什么是数据库
1、概念:数据库是一个可以在一台机器上独立工作的,并且可以给我们提供高效、便捷的方式对数据进行增删改查的一种工具。 2、优势 1.程序稳定性 :任意一台服务器崩溃了都不会影响数据和另外的服务器。 2.数据一致性 :所有的数据都存储在一起,所有的程序操作的数据都是统一的,就不会出现数据不一致的现象 3.并发 :数据库可以良好的支持并发,所有的程序操作数据库都是通过网络,而数据库本身支持并发的网络操作,不需要我们自己写socket 4.效率 :使用数据库对数据进行增删改查的效率要高出我们自己处理文件很多
二、数据库的一些名词
1、数据/记录:描述事物的符号记录称为数据,描述事物的符号既可以是数字,也可以是文字、图片,图像、声音、语言等,数据由多种表现形式,它们都可以经过数字化后存入计算机 例如:1,明哥,猛男,20,东北 但是单纯的一条记录并没有任何意义,如果我们按逗号作为分隔,给各个字段设置标题,那么就具有可读性了 id,name,sex,age,hometown 1,明哥,猛男,20,东北 2、数据库(DataBase,DB):数据库是长期存放在计算机内、有组织、可共享的数据集合。 其实数据库中的库就是文件夹,一般情况下 每个程序使用一个库,库中一张表(table)就是一个文件 3、数据库管理系统(DataBase Management System ,DBMS):数据库管理系统就是一款专门用于管理数据库的系统软件,就是通过一个软件来管理文件夹、文件、数据 现在主流的数据库有: 关系型数据库 mysql 开源,主要用于大型门户 oracle 企业级,功能强大、安全但是费用高 sqlite 轻量级,文件数据库 sql server 大学课程多数用这个,是微软公司的产品 非关系型数据库:消息转发 memcache redis MongoDB nosql 解释什么是关系型 关系型 一条数据包含了一个事物的多条信息,这些信息之间是有关联性的 非关系型 :存取频繁的,并且要求效率高的,不突出数据之间关联的 k-v id content 4、数据库服务器:数据库管理系统装在哪台机器上,哪台机器就是数据库服务器,但是对这台机器的内存要求比较高 5、数据库管理员(Database Administrator,DBA):维护数据库管理系统(DBMS)的相关工作人员的统称 6、总结 数据库服务器:运行数据库管理软件 数据库管理员:维护数据库管理软件的人 数据库管理软件:管理-数据库 数据库:即文件夹,用来组织文件/表 表:即文件,用来存放多行内容/多条记录
三、初识MySQL
1、介绍
SQL语言主要用于存取数据、查询数据、更新数据和管理关系数据库系统,SQL语言由IBM开发。SQL语言分为3种类型:
DDL(data definition language)语句 数据库定义语言: 数据库、表、视图、索引、存储过程,例如CREATE DROP ALTER
DML(data manipulation language)语句 数据库操作语言: 插入数据INSERT、删除数据DELETE、更新数据UPDATE、查询数据SELECT
DCL(Data Control Language)语句 数据库控制语言: 例如控制用户的访问权限GRANT、REVOKE
2、相关操作
0、Mysql数据库的导入和导出
1.mysqldump是mysql用于转存储数据库的实用程序(后缀是dump或者sql都行)
注意:这个命令是在linux/windows的终端敲的,用于导出数据库(就是还没有进入mysql客户端) 导出一个数据库的结构以及数据 mysqldump -u root -p dbname > dbname.sql 导出多个数据库的结构以及数据 mysqldump -u root -p -B dbname1 dbname2 > dbname.sql 导出所有数据库 mysqldump -u root -p --all-databases > xxx.dump 2.mysql导入数据库 假设已经导出了一个数据库文件 db.sql 方法一: 1. 进入MySQL客户端 2. 创建数据库 create database db; 3. 退出mysql客户端,在终端敲 mysql -u root -p < /opt/db.sql 方法二: 1. 进入MySQL客户端 2. 创建数据库 create database db; 3. use db; 4. source /opt/db.sql
1、 启动server端 - 可以在service服务中操作,也可以打开cmd窗口 > net start mysql 2、停止服务 - 可以在service服务中操作,也可以打开cmd窗口 > net stop mysql 3、登录用户 > mysql -u root -p # mysql5.6默认是没有密码的,遇到password直接按回车键 4、查看所有的库 mysql> show databases; 5、查看当前用户 mysql> select user(); 6、查看当前使用的数据库 mysql> select database(); 7、退出当前用户 mysql> exit # 也可以用\q或者quit退出 8、给当前用户设置密码 mysql> set password = password('newpassword'); 9、给其他用户设置密码 mysql> set password for 'username'@'host' = password('newpassword') 10、在输入sql语句的过程中 如果想要放弃本条语句 mysql> \c 11、创建账号 # %表示这个网段内所有ip都可以连接,identified by '123'表示给这个用户设置密码123 mysql> create user 'ming'@'192.168.16.%' identified by '123'; mysql> create user 'ming'@'192.168.16.5' # 表示某机器可以连接 mysql> create user 'ming'@'%' # 表示所有机器都可以连接
mysql> drop user 'ming'@'%' # 删除用户 12、远程登陆 mysql> mysql -u ming -p123 -h 192.168.16.31 # u是user p是password h是localhost的ip地址 13、使用某个数据库(切换到文件夹) use 数据库名;
四、存储引擎
1、概念
MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。 通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。
2、mysql支持的存储引擎
mysql5.6支持的存储引擎包括InnoDB、MyISAM、MEMORY、BLACKHOLE、CSV、FEDERATED、MRG_MYISAM、ARCHIVE、PERFORMANCE_SCHEMA。
其中NDB和InnoDB提供事务安全表,其他存储引擎都是非事务安全表。
3、各种存储引擎的特性
并发性:某些应用程序比其他应用程序具有很多的颗粒级锁定要求(如行级锁定)。
事务支持:并非所有的应用程序都需要事务,但对的确需要事务的应用程序来说,有着定义良好的需求,如ACID兼容等。
引用完整性:通过DDL定义的外键,服务器需要强制保持关联数据库的引用完整性。
物理存储:它包括各种各样的事项,从表和索引的总的页大小,到存储数据所需的格式,到物理磁盘。
索引支持:不同的应用程序倾向于采用不同的索引策略,每种存储引擎通常有自己的编制索引方法,但某些索引方法(如B-tree索引)对几乎所有的存储引擎来说是共同的。
内存高速缓冲:与其他应用程序相比,不同的应用程序对某些内存高速缓冲策略的响应更好,因此,尽管某些内存高速缓冲对所有存储引擎来说是共同的(如用于用户连接的高速缓冲,MySQL的高速查询高速缓冲等),其他高速缓冲策略仅当使用特殊的存储引擎时才唯一定义。
性能帮助:包括针对并行操作的多I/O线程,线程并发性,数据库检查点,成批插入处理等。
其他目标特性:可能包括对地理空间操作的支持,对特定数据处理操作的安全限制等。
4、事务,行级锁,表级锁的解释
1.事务:一个最小的不可再分的工作单元,通常一个事务对应一个完整的业务 一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。 比如:一个转账的场景小明转账给小红,如果转账的过程中数据库挂了,那么小明和小红的数据都不会发生改变 事务的四大特性: 原子性:事务包含的所有操作要么全部成功,要么全部失败回滚;成功必须要完全应用到数据库,失败则不能对数据库产生影响; 一致性:事务执行前和执行后必须处于一致性状态 隔离性:当多个用户并发访问数据库时,数据库为每一个用户开启的事务,不被其他事务的操作所干扰,多个并发事务之间要相互隔离 持久性:一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便在数据库系统遇到故障的情况下也不会丢失事物的操作 开启事务 更新小明的数据:他的钱-200 更新小红的数据:她的钱+200 关闭事务 如果在小明转账但是小红还没收到账的中途,数据库挂了: 开启事务 更新小明的数据:他的钱-200 这个时候数据库挂了 更新小红的数据:她的钱+200 关闭事务 那么小明的钱不会-200,小红的钱也不会+200,好像没发生转账这件事一样 2.行级锁:不同行可以同时修改,同一行不能同时修改 msyql同一张表中不同行的记录可以被同时修改 但是同一张表中同一行的记录不能被同时修改 3.表级锁:不同表可以同时修改,同一张表不能同时修改
5、存储引擎机制
1.InnoDB:支持事务、行级锁、外键,保持事务的完整性,在修改数据的效率比较快 MySql 5.6 版本默认的存储引擎。InnoDB 是一个事务安全的存储引擎,它具备提交、回滚以及崩溃恢复的功能以保护用户数据。InnoDB 的行级别锁定以及 Oracle 风格的一致性无锁读提升了它的多用户并发数以及性能。 InnoDB 将用户数据存储在聚集索引中以减少基于主键的普通查询所带来的 I/O 开销。为了保证数据的完整性,InnoDB 还支持外键约束。
2.MyISAM:表级锁,查询速度快,但是插入和修改效率慢 MyISAM既不支持事务、也不支持外键、其优势是访问速度快,但是表级别的锁定限制了它在读写负载方面的性能,因此它经常应用于只读或者以读为主的数据场景。
3.Memory:表级锁,既不支持事务、也不支持外键,但数据都存在内存中,处理数据的速度快,但是对内存要求高,重启服务和断电消失 在内存中存储所有数据,应用于对非关键数据由快速查找的场景。Memory类型的表访问数据非常快,因为它的数据是存放在内存中的,并且默认使用HASH索引,但是一旦服务关闭,表中的数据就会丢失, 长用于数据量小的数据库,并对服务器的内存有要求,一般应用于每个用户的登录状态。
4.BLACKHOLE:放进去的所有数据都不会存储,但有一个日志记录着插入的数据,利用日志分流数据 黑洞存储引擎,类似于 Unix 的 /dev/null,Archive 只接收但却并不保存数据。对这种引擎的表的查询常常返回一个空集。这种表可以应用于 DML 语句需要发送到从服务器,但主服务器并不会保留这种数据的备份的主从配置中。
5.CSV 它的表真的是以逗号分隔的文本文件。CSV 表允许你以 CSV 格式导入导出数据,以相同的读和写的格式和脚本和应用交互数据。由于 CSV 表没有索引,你最好是在普通操作中将数据放在 InnoDB 表里,只有在导入或导出阶段使用一下 CSV 表。
6.NDB (又名 NDBCLUSTER)——这种集群数据引擎尤其适合于需要最高程度的正常运行时间和可用性的应用。注意:NDB 存储引擎在标准 MySql 5.6 版本里并不被支持。目前能够支持 MySql 集群的版本有:基于 MySql 5.1 的 MySQL Cluster NDB 7.1;基于 MySql 5.5 的 MySQL Cluster NDB 7.2;基于 MySql 5.6 的 MySQL Cluster NDB 7.3。同样基于 MySql 5.6 的 MySQL Cluster NDB 7.4 目前正处于研发阶段。
7.Merge 允许 MySql DBA 或开发者将一系列相同的 MyISAM 表进行分组,并把它们作为一个对象进行引用。适用于超大规模数据场景,如数据仓库。
8.Federated 提供了从多个物理机上联接不同的 MySql 服务器来创建一个逻辑数据库的能力。适用于分布式或者数据市场的场景。
6、常用的存储引擎及适用场景
InnoDB
用于事务处理应用程序,支持外键和行级锁。如果应用对事物的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包括很多更新和删除操作,那么InnoDB存储引擎是比较合适的。
InnoDB除了有效的降低由删除和更新导致的锁定,还可以确保事务的完整提交和回滚,对于类似计费系统或者财务系统等对数据准确要求性比较高的系统都是合适的选择。
MyISAM
如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不高,那么可以选择这个存储引擎。
Memory
将所有的数据保存在内存中,在需要快速定位记录和其他类似数据的环境下,可以提供极快的访问。Memory的缺陷是对表的大小有限制,虽然数据库因为异常终止的话数据可以正常恢复,但是一旦数据库关闭,存储在内存中的数据都会丢失。
7、存储相关sql语句
1.查看当前的默认存储引擎: mysql> show variables like "default_storage_engine"; 2.查询当前数据库支持的存储引擎 mysql> show engines \G; 3.指定存储引擎建表 3-1.在建表时指定 mysql> create table t1(id int,name varchar(20)) ENGINE=MyISAM; mysql> create table country(id int,cname varchar(50)) ENGINE=InnoDB; 3-2.也可以使用alter table语句,修改一个已经存在的表的存储引擎。 mysql> alter table country engine = MyISAM; 3-3.查看数据库或者表的结构和表的引擎 show create database 数据库名称; show create table 表名; 4.在配置文件中指定 #my.ini文件 [mysqld] default-storage-engine=INNODB
五、库操作(DDL语句数据库定义语言)
1、create:创建
create database 数据库名 charset=utf8; // 创建数据库 create table 表名(id int,name char); // (列名1 数据类型,列名2,数据类型...) 这个是创建表和表头,还没有内容的
2、alter:跟新
ALTER数据库的操作 alter database 数据库名 charset=latin1(要修改的内容); // 修改数据库 ALTER表的操作 1. 修改表名 ALTER TABLE 表名 RENAME 新表名; 2. 增加字段 ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…]; 3. 删除字段 ALTER TABLE 表名 DROP 字段名; 4. 修改字段:modify 修改数据类型和约束,change修改字段名并重新定义数据类型和约束 ALTER TABLE 表名 MODIFY 字段名 数据类型 [完整性约束条件…]; ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…]; 5.修改字段排列顺序/在增加的时候指定字段位置 ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] FIRST; # 放在首位 ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] AFTER 字段名; # 在某个字段后 ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…] FIRST; ALTER TABLE 表名 MODIFY 字段名 数据类型 [完整性约束条件…] AFTER 字段名; 6.增加约束 ALTER TABLE 表名 ADD PRIMARY KEY (字段); ALTER TABLE 表名 ADD UNIQUE (字段); # 增加unique索引的简写,省略的索引名默认就为字段名 ALTER TABLE 表名 ADD UNIQUE INDEX 索引名(字段); # 增加unique索引的完整写法 ALTER TABLE 表名 ADD FOREIGN KEY(当前表字段) REFERENCES 其他表(其他表的字段); 7.删除约束 ALTER TABLE 表名 DROP PRIMARY KEY; # 删除主键 ALTER TABLE 表名 DROP INDEX 索引名; # 删除索引 # 删除外键 SHOW CREATE TABLE 外键所在的表; # 查看外键别名 ALTER TABLE 表名 DROP FOREIGN KEY 外键别名;
create table staff_info( id int(11),name varchar(50), age int(3),sex enum('male','female'), phone bigint(11),job varchar(11));