初识数据库
一、数据库管理软件的由来
之前的数据永久保存都是保存在文件中,而一个文件只能保存在一台机器上,且程序的所有组件都运行在同一台机器上,这种方式存在以下问题:
1、程序所有的组件不可能运行在同一台机器上
因为这台机器一旦挂掉则意味着整个软件的崩溃,并且程序的执行效率依赖于承载它的硬件,而一台机器机器的性能总归是有限的, 受限于目前的硬件水平,就一台机器的性能垂直进行扩展是有极限的。 于是我们只能通过水平扩展来增强我们系统的整体性能,这就需要我们将程序的各个组件分布于多台机器去执行。
2、数据安全问题
根据1的描述,我们将程序的各个组件分布到各台机器,但需知各组件仍然是一个整体,言外之意,所有组件的数据还是要共享的。 但每台机器上的组件都只能操作本机的文件,这就导致了数据必然不一致。 于是我们想到了将数据与应用程序分离:把文件存放于一台机器,然后将多台机器通过网络去访问这台机器上的文件(用socket实现), 即共享这台机器上的文件,共享则意味着竞争,会发生数据不安全,需要加锁处理。
3、并发
根据2的描述,我们必须写一个socket服务端来管理这台机器(数据库服务器)上的文件,然后写一个socket客户端,完成如下功能:
1.远程连接(支持并发) 2.打开文件 3.读写(加锁) 4.关闭文件
总结:
我们在编写任何程序之前,都需要事先写好基于网络操作一台主机上文件的程序(socket服务端与客户端程序),于是有人将此类程序写成一个专门的处理软件,这就是mysql等数据库管理软件的由来,但mysql解决的不仅仅是数据共享的问题,还有查询效率,安全性等一系列问题,总之,把程序员从数据管理中解脱出来,专注于自己的程序逻辑的编写。
二、数据库概述
1、什么是数据?
描述事物的符号记录称为数据。描述事物的符号既可以是数字,也可以是文字、图片,图像、声音、语言等,数据由多种表现形式,它们都可以经过数字化后存入计算机。
在计算机中描述一个事物,就需要抽取这一事物的典型特征,组成一条记录
2、什么是数据库(DataBase)?
数据库即存放数据的仓库,只不过这个仓库是在计算机存储设备上,而且数据是按一定的格式存放的
过去人们将数据存放在文件柜里,现在数据量庞大,已经不再适用
数据库是长期存放在计算机内、有组织、可共享的数据即可。数据库中的数据按一定的数据模型组织、描述和储存,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种用户共享。
3、什么是数据库管理系统(Database Management System)?
数据库管理系统——一个系统软件,作用:1、解决科学地组织和存储数据;2、用来高效获取和维护数据
如MySQL、Oracle、SQLite、Access、MS SQL Server
mysql主要用于大型门户,例如搜狗、新浪等,它主要的优势就是开放源代码,因为开放源代码这个数据库是免费的,他现在是甲骨文公司的产品。
oracle主要用于银行、铁路、飞机场等。该数据库功能强大,软件费用高。也是甲骨文公司的产品。
sql server是微软公司的产品,主要应用于大中型企业,如联想、方正等。
4、数据库服务器、数据管理系统、数据库、表和记录的关系
数据库服务器:运行数据库管理软件的计算机
数据库管理系统:一个软件
表:即文件,用来存放多行内容/多条记录
数据库:文件夹,用来组织文件/表
记录:事物一系列典型的特征
数据:描述事物特征的符号
三、MySQL介绍
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司。MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
1、MySQL是什么?
myql就是一个基于socket编写的C/S架构的软件。
客户端软件
mysql自带:mysql命令,mysqldump命令等
python模块:如pymysql
2、数据库管理软件分类
一类是关系型数据库:如sqllite,db2,oracle,access,sql server,MySQL,主要特征是:需要有表结构,sql语句通用。
一类是非关系型数据库:mongodb,redis,memcache,主要特征:是key-value存储的,没有表结构。
四、下载安装
Windows版本
#1、下载:MySQL Community Server 5.7.16 http://dev.mysql.com/downloads/mysql/ #2、解压 如果想要让MySQL安装在指定目录,那么就将解压后的文件夹移动到指定目录,如:C:\mysql-5.7.16-winx64 #3、添加环境变量 【右键计算机】--》【属性】--》【高级系统设置】--》【高级】--》【环境变量】--》【在第二个内容框中找到 变量名为Path 的一行,双击】 --> 【将MySQL的bin目录路径追加到变值值中,用 ; 分割】 #4、初始化 mysqld --initialize-insecure #5、启动MySQL服务 mysqld # 启动MySQL服务 #6、启动MySQL客户端并连接MySQL服务 mysql -u root -p # 连接MySQL服务器
上一步解决了一些问题,但不够彻底,因为在执行【mysqd】启动MySQL服务器时,当前终端会被hang住,那么做一下设置即可解决此问题: 注意:--install前,必须用mysql启动命令的绝对路径 # 制作MySQL的Windows服务,在终端执行此命令: "c:\mysql-5.7.16-winx64\bin\mysqld" --install # 移除MySQL的Windows服务,在终端执行此命令: "c:\mysql-5.7.16-winx64\bin\mysqld" --remove 注册成服务之后,以后再启动和关闭MySQL服务时,仅需执行如下命令: # 启动MySQL服务 net start mysql # 关闭MySQL服务 net stop mysql
Linux版本
#二进制rpm包安装 yum -y install mysql-server mysql # centOS7下安装方法如下:(作者避免mysql被闭源) yum -y install mariadb-server mariadb
源码安装:
1.解压tar包 cd /software tar -xzvf mysql-5.6.21-linux-glibc2.5-x86_64.tar.gz mv mysql-5.6.21-linux-glibc2.5-x86_64 mysql-5.6.21 2.添加用户与组 groupadd mysql useradd -r -g mysql mysql chown -R mysql:mysql mysql-5.6.21 3.安装数据库 su mysql cd mysql-5.6.21/scripts ./mysql_install_db --user=mysql --basedir=/software/mysql-5.6.21 --datadir=/software/mysql-5.6.21/data 4.配置文件 cd /software/mysql-5.6.21/support-files cp my-default.cnf /etc/my.cnf cp mysql.server /etc/init.d/mysql vim /etc/init.d/mysql #若mysql的安装目录是/usr/local/mysql,则可省略此步 修改文件中的两个变更值 basedir=/software/mysql-5.6.21 datadir=/software/mysql-5.6.21/data 5.配置环境变量 vim /etc/profile export MYSQL_HOME="/software/mysql-5.6.21" export PATH="$PATH:$MYSQL_HOME/bin" source /etc/profile 6.添加自启动服务 chkconfig --add mysql chkconfig mysql on 7.启动mysql service mysql start 8.登录mysql及改密码与配置远程访问 mysqladmin -u root password 'your_password' #修改root用户密码 mysql -u root -p #登录mysql,需要输入密码 mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'your_password' WITH GRANT OPTION; #允许root用户远程访问 mysql>FLUSH PRIVILEGES; #刷新权限
1. 解压 tar zxvf mariadb-5.5.31-linux-x86_64.tar.gz mv mariadb-5.5.31-linux-x86_64 /usr/local/mysql //必需这样,很多脚本或可执行程序都会直接访问这个目录 2. 权限 groupadd mysql //增加 mysql 属组 useradd -g mysql mysql //增加 mysql 用户 并归于mysql 属组 chown mysql:mysql -Rf /usr/local/mysql // 设置 mysql 目录的用户及用户组归属。 chmod +x -Rf /usr/local/mysql //赐予可执行权限 3. 拷贝配置文件 cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf //复制默认mysql配置 文件到/etc目录 4. 初始化 /usr/local/mysql/scripts/mysql_install_db --user=mysql //初始化数据库 cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql //复制mysql服务程序 到系统目录 chkconfig mysql on //添加mysql 至系统服务并设置为开机启动 service mysql start //启动mysql 5. 环境变量配置 vim /etc/profile //编辑profile,将mysql的可执行路径加入系统PATH export PATH=/usr/local/mysql/bin:$PATH source /etc/profile //使PATH生效。 6. 账号密码 mysqladmin -u root password 'yourpassword' //设定root账号及密码 mysql -u root -p //使用root用户登录mysql use mysql //切换至mysql数据库。 select user,host,password from user; //查看系统权限 drop user ''@'localhost'; //删除不安全的账户 drop user root@'::1'; drop user root@127.0.0.1; select user,host,password from user; //再次查看系统权限,确保不安全的账户均被删除。 flush privileges; //刷新权限 7. 一些必要的初始配置 1)修改字符集为UTF8 vi /etc/my.cnf 在[client]下面添加 default-character-set = utf8 在[mysqld]下面添加 character_set_server = utf8 2)增加错误日志 vi /etc/my.cnf 在[mysqld]下面添加: log-error = /usr/local/mysql/log/error.log general-log-file = /usr/local/mysql/log/mysql.log 3) 设置为不区分大小写,linux下默认会区分大小写。 vi /etc/my.cnf 在[mysqld]下面添加: lower_case_table_name=1 修改完重启:#service mysql restart
MAC版本
下载https://dev.mysql.com/downloads/mysql/5.7.html#downloads安装包。双击安装、下一步后安装完成。
在/etc/profile文件内添加环境变量:PATH= /usr/local/mysql/bin:$PATH 然后在最后一行添加export PATH,保证全局生效。
$PATH代表取系统自带的环境变量的值。
退出文件编辑后,执行source /etc/profile 立即生效配置文件修改。
启动mysql服务:在系统偏好设置下找到mysql,点击启动mysql服务。
五、密码设置和密码破解
MAC版本
启动MySQL后,必须先执行安全配置向导mysql_secure_installation。
根据安装时系统提示的密码,设置新密码。
需要输入判断的语句:
Enter current password for root (enter for none):<–初次运行直接回车
Set root password? [Y/n] <– 是否设置root用户密码,输入y并回车或直接回车
Remove anonymous users? [Y/n] <– 是否删除匿名用户,生产环境建议删除,所以直接回车
Disallow root login remotely? [Y/n] <–是否禁止root远程登录,根据自己的需求选择Y/n并回车,建议禁止
Remove test database and access to it? [Y/n] <– 是否删除test数据库,直接回车
Reload privilege tables now? [Y/n] <– 是否重新加载权限表,直接回车
通用密码修改
初始状态下,管理员root,密码为空,默认只允许从本机登录localhost 设置密码 [root@egon ~]# mysqladmin -uroot password "123" 设置初始密码 由于原密码为空,因此-p可以不用 [root@egon ~]# mysqladmin -uroot -p"123" password "456" 修改mysql密码,因为已经有密码了,所以必须输入原密码才能设置新密码 命令格式: [root@egon ~]# mysql -h172.31.0.2 -uroot -p456 [root@egon ~]# mysql -uroot -p [root@egon ~]# mysql 以root用户登录本机,密码为空
密码破解
首先,保证mysql服务在停止状态。执行sudo mysqld_safe --skip-grant-tables命令
MacBook-Pro:local hqs$ sudo mysqld_safe --skip-grant-tables Password: Logging to '/usr/local/mysql/data/MacBook-Pro.local.err'. 2018-05-08T12:48:38.6NZ mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/data
然后,打开一个新的终端,执行mysql -uroot登录数据库
接着,修改数据库密码,这个地方需要注意5.7版本mysql数据库下已经没有password这个字段了,password字段改成了authentication_string
mysql> update mysql.user set password=password("1234") where user="root" and host="localhost"; # 这个是5.6版本通用写法 ERROR 1054 (42S22): Unknown column 'password' in 'field list' mysql> update mysql.user set authentication_string=password('1234') where user='root' and host="localhost"; # 5.7版本后数据库下已经没有password这个字段了 Query OK, 1 row affected, 1 warning (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 1 mysql> flush privileges; Query OK, 0 rows affected (0.01 sec)
随后,杀死mysql进程来关闭mysql数据库。
huangqiushideMacBook-Pro:~ hqs$ ps aux| grep mysql hqs 8982 0.0 0.0 4286184 908 s001 S+ 9:03下午 0:00.01 grep mysql _mysql 8810 0.0 0.2 4686868 19516 s000 S+ 8:48下午 0:00.59 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --skip-grant-tables --log-error=huangqiushideMacBook-Pro.local.err --pid-file=huangqiushideMacBook-Pro.local.pid root 8740 0.0 0.0 4295984 744 s000 S+ 8:48下午 0:00.02 /bin/sh /usr/local/mysql/bin/mysqld_safe --skip-grant-tables root 8738 0.0 0.1 4330940 5536 s000 S+ 8:48下午 0:00.05 sudo mysqld_safe --skip-grant-tables huangqiushideMacBook-Pro:~ hqs$ kill -9 8810 -bash: kill: (8810) - Operation not permitted huangqiushideMacBook-Pro:~ hqs$ kill -9 8740 -bash: kill: (8740) - Operation not permitted huangqiushideMacBook-Pro:~ hqs$ sudo kill -9 8740 Password: huangqiushideMacBook-Pro:~ hqs$ sudo kill -9 8810 huangqiushideMacBook-Pro:~ hqs$ sudo kill -9 8738 kill: 8738: No such process huangqiushideMacBook-Pro:~ hqs$ ps aux| grep mysql hqs 9006 0.0 0.0 4267752 864 s001 S+ 9:04下午 0:00.00 grep mysql
最后,在系统偏好设置—MySQL,正常启动MySQL服务
huangqiushideMacBook-Pro:~ hqs$ mysql -uroot -p1234 mysql: [Warning] Using a password on the command line interface can be insecure. mysql: Unknown OS character set ''. mysql: Switching to the default character set 'latin1'. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 10 Server version: 5.7.22 MySQL Community Server (GPL) Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
六、统一字符编码
1、MAC需要先切换到管理员用户,再创建配置文件/etc/my.cnf。写入一下内容(下面那一组):
#mysql5.5以下版本 [mysqld] default-character-set=utf8 [client] default-character-set=utf8 [mysql] default-character-set=utf8 #mysql5.5以上:修改方式有所改动 [mysqld] character-set-server=utf8 collation-server=utf8_general_ci [client] default-character-set=utf8 [mysql] default-character-set=utf8
2、修改完成后,在系统偏好设置中启动mysql服务,启动完成后mysql -uroot 登陆数据库,执行"\s"进行编码验证
mysql> \s -------------- mysql Ver 14.14 Distrib 5.7.22, for macos10.13 (x86_64) using EditLine wrapper Connection id: 20 Current database: Current user: root@localhost SSL: Not in use Current pager: stdout Using outfile: '' Using delimiter: ; Server version: 5.7.22 MySQL Community Server (GPL) Protocol version: 10 Connection: Localhost via UNIX socket Server characterset: utf8 Db characterset: utf8 Client characterset: utf8 Conn. characterset: utf8 UNIX socket: /tmp/mysql.sock Uptime: 1 min 1 sec Threads: 1 Questions: 6 Slow queries: 0 Opens: 105 Flush tables: 1 Open tables: 98 Queries per second avg: 0.098 -------------- mysql>
七、初识SQL语句
有了mysql这个数据库软件,就可以将程序员从对数据的管理中解脱出来,专注于对程序逻辑的编写。
mysql服务端软件即mysqld帮我们管理好文件夹以及文件,前提是作为使用者的我们,需要下载mysql的客户端,或者其他模块来连接到mysqld,然后使用mysql软件规定的语法格式去提交自己命令,实现对文件夹或文件的管理。该语法即sql(Structured Query Language 即结构化查询语言)。
SQL语言主要用于存取数据、查询数据、更新数据和管理关系数据库系统,SQL语言由IBM开发。SQL语言分为3种类型: #1、DDL语句 数据库定义语言: 数据库、表、视图、索引、存储过程,例如CREATE DROP ALTER #2、DML语句 数据库操纵语言: 插入数据INSERT、删除数据DELETE、更新数据UPDATE、查询数据SELECT #3、DCL语句 数据库控制语言: 例如控制用户的访问权限GRANT、REVOKE
1、操作库(文件夹)
增:create database db1 charset utf8; # charset指定数据库字符编码
查:show databases; # 查看所有数据库(往往会有一些默认库)
information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息、列信息、权限信息、字符信息等 performance_schema: MySQL 5.5开始新增一个数据库:主要用于收集数据库服务器性能参数,记录处理查询请求时发生的各种事件、锁等现象 mysql: 授权库,主要存储系统用户的权限信息 test: MySQL数据库系统自动创建的测试数据库
show create database db1; # 查看数据库,在文件系统/usr/local/mysql/data目录下可找到刚刚创的数据库
mysql> create database db1 charset utf8; Query OK, 1 row affected (0.03 sec) mysql> show create database db1; +----------+--------------------------------------------------------------+ | Database | Create Database | +----------+--------------------------------------------------------------+ | db1 | CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET utf8 */ | +----------+--------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | db1 | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.01 sec)
改:alter database db1 charset gbk; # 改数据库字符编码
mysql> alter database db1 charset gbk; Query OK, 1 row affected (0.01 sec) mysql> show create database db1; +----------+-------------------------------------------------------------+ | Database | Create Database | +----------+-------------------------------------------------------------+ | db1 | CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET gbk */ | +----------+-------------------------------------------------------------+ 1 row in set (0.00 sec)
删:drop database db1; # 删除数据库,文件系统/usr/local/mysql/data目录下db1目录被删除
mysql> drop database db1; Query OK, 0 rows affected (0.03 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec)
2、操作表(文件)
切换文件夹:use db1
mysql> create database db1 charset utf8; Query OK, 1 row affected (0.00 sec) mysql> use db1 Database changed
mysql> use db1 Database changed mysql> select database(); +------------+ | database() | +------------+ | db1 | +------------+ 1 row in set (0.00 sec)
增:create table t1(id int, name char) ; # 表需要设置字段和字段的字符类型
执行完增操作后,可以在/usr/local/mysql/data/db1下看到多出来的 t1.frm t1.ibd这两个文件。t1.frm存放表结构,t1.ibd存放表数据。
查:show create table t1; # 查看表
mysql> create table t1(id int, name char); Query OK, 0 rows affected (0.04 sec) mysql> mysql> show create table t1; +-------+---------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+---------------------------------------------------------------------------------------------------------------------+ | t1 | CREATE TABLE `t1` ( `id` int(11) DEFAULT NULL, `name` char(1) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | +-------+---------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
show tables; # 查看当前库下所有的表
mysql> show tables; +---------------+ | Tables_in_db1 | +---------------+ | t1 | +---------------+ 1 row in set (0.00 sec)
desc t1; # 查看表数据
mysql> desc t1; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | char(6) | YES | | NULL | | +-------+---------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
改:改表的字段
alter table t1 modify name char(6); # 默认char宽度为1,现在修改为6
mysql> alter table t1 modify name char(6); Query OK, 0 rows affected (0.04 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> show create table t1; +-------+------------------------------------------------------------------------------+ | Table | Create Table | +-------+------------------------------------------------------------------------------+ | t1 | CREATE TABLE `t1` ( `id` int(11) DEFAULT NULL, `name` char(6) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | +-------+-------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
alter table t1 change name NAME char(7); # 字段名改为大写,并修改字段类型
mysql> alter table t1 change name NAME char(7); Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> desc t1; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | NAME | char(7) | YES | | NULL | | +-------+---------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
删:删除表
drop table t1;
mysql> drop table t1; Query OK, 0 rows affected (0.00 sec) mysql> desc t1; ERROR 1146 (42S02): Table 'db1.t1' doesn't exist mysql> show tables; Empty set (0.00 sec)
3、操作文件内容/记录
增:插入
insert t1(id, name) values(1, 'egon1'), (2, 'egon2'), (3, 'egon3');
查:select id,name from t1; # 这是切到库下的情况
select * from db1.t1; # db1.t1指定db1库下的t1表
mysql> create table t1(id int, name char(6)); Query OK, 0 rows affected (0.01 sec) mysql> insert t1(id, name) values(1, 'egon1'), (2, 'egon2'), (3, 'egon3'); Query OK, 3 rows affected (0.01 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> select * from db1.t1; +------+-------+ | id | name | +------+-------+ | 1 | egon1 | | 2 | egon2 | | 3 | egon3 | +------+-------+ 3 rows in set (0.00 sec)
改:改表内的记录
update db1.t1 set name="SB";
mysql> update db1.t1 set name="SB"; Query OK, 3 rows affected (0.01 sec) Rows matched: 3 Changed: 3 Warnings: 0 mysql> select * from db1.t1; +------+------+ | id | name | +------+------+ | 1 | SB | | 2 | SB | | 3 | SB | +------+------+ 3 rows in set (0.00 sec)
update db1.t1 set name='ALEX' where id=2;
mysql> update db1.t1 set name='ALEX' where id=2; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from db1.t1; +------+------+ | id | name | +------+------+ | 1 | SB | | 2 | ALEX | | 3 | SB | +------+------+ 3 rows in set (0.01 sec)
删:删除表内记录
delete from t1 where id=2; # 删除指定记录
delete from t1; # 删除报表内所有记录
mysql> delete from t1 where id=2; Query OK, 1 row affected (0.00 sec) mysql> select * from db1.t1; +------+------+ | id | name | +------+------+ | 1 | SB | | 3 | SB | +------+------+ 2 rows in set (0.00 sec) mysql> delete from t1; Query OK, 2 rows affected (0.00 sec) mysql> select * from db1.t1; Empty set (0.00 sec)
清空表的方法总结:
delete from t1; # 如果有自增id,新增的数据,仍然是以删除前的最后一样作为起始
truncate table t1; # 数据量大,删除速度比上一条快,且直接从零开始
auto_increment表示:自增
primary key 表示:约束(不能重复且不能为空);加速查找