1.1、什么是数据库

  • 概念
    数据库由一批数据构成有序的集合,这些数据被存放在结构化的数据表里。数据表之间相互关联。
    数据库系统提供对数据的安全控制和完整性控制。
    简单来说就是存储数据的仓库。
  • 数据的的发展阶段
    大致划分为4个阶段
    人工管理阶段
    文件系统阶段
    数据库系统阶段
    高级数据库阶段
  • 数据库种类
    层次式数据库
    网络式数据库
    关系式数据库
    不同种类的数据库按不同的数据结构来联系和组织。
  • 数据库的特点
    实现数据共享
    减少数据冗余
    采用特定的数据类型
    具有较高的数据独立性
    具有统一的数据控制功能
  • 数据库的构成:三个部分
    数据库:用于存储数据的地方。
    数据库管理系统:用于管理数据库的软件。
    数据库应用程序:为了提高数据库系统的处理能力所使用的管理数据库的软件补充。

1.2、专业术语

  • DB(DataBase)
    数据库
    依照某种数据模型进行组织并存放到存储器的数据集合
    存储器就是硬盘。
    依照某种数据模型进行组织就是可以分不同类型存放。
  • DBMS
    数据库管理系统
    用来操作管理数据库的服务软件
  • DBS
    数据库系统:就是DB+DBMS
    指带有数据库并整合了数据库管理软件的服务器
  • MySQL:适用于Linux系统的数据库。
  • MariaDB:与MySQL同一个作者,为了避免MySQL被商业化。
    MySQL目前企业使用更多,两者还是有一定的区别。不可以同时使用,会发生冲突。
  • MySQL特点以及应用
    主要特点
    • 适用于中小规模、关系型数据库

    • 支持Linux、Unix、Windows等多种操作系统

    • 支持Python、Java、Perl、PHP等编程语言

  • 典型的应用环境
    • LAMP平台、与Apache HTTP Server组合

    • LNMP平台、与Nginx组合

1.3、常见的数据库软件

主流操作系统:Unix、Linux、Windows

软件名 开源 跨平台 厂商
Oracle 甲骨文
MySQL 甲骨文
SQL Server 微软
DB2 IBM
Redis 开源软件
Memcached 开源软件
MongoDB 开源软件

1.4、数据库模型

1.5、SQL语言

  • SQL语言包括4个部分
    1. 数据定义语言(DDL):DROP、CREATE、ALTER等语句 。

    2. 数据库操作语言(DML):INSERT(插入)、UPDATE(修改 )、DELETE(删除)语句。

    3. 数据查询语言(DQL):SELECT语句。

    4. 数据控制语言(DCL):GRANT、REVOKE、COMMIT、ROLLBACK等语句。

二、搭建MySQL数据库服务器

2.1、准备环境

  • 官方下载地址
    https://dev.mysql.com/downloads/mysql/
  1. 准备以下软件
[root@db1 opt]# ls
mysql-5.7.17.tar
mysql-community-client-5.7.17-1.el7.x86_64.rpm			
#客户端管理软件
mysql-community-common-5.7.17-1.el7.x86_64.rpm		
#数据库和客户端共享文件
mysql-community-devel-5.7.17-1.el7.x86_64.rpm
#客户端应用程序的库和头文件
mysql-community-embedded-5.7.17-1.el7.x86_64.rpm
#嵌入式函数库
mysql-community-embedded-compat-5.7.17-1.el7.x86_64.rpm
#嵌入式兼容函数库
mysql-community-embedded-devel-5.7.17-1.el7.x86_64.rpm
#头文件和库文件作为MySQL的嵌入式库文件
mysql-community-libs-5.7.17-1.el7.x86_64.rpm
#MySQL数据库客户端应用程序的共享库
mysql-community-libs-compat-5.7.17-1.el7.x86_64.rpm
#客户端应用程序的共享兼容库
mysql-community-minimal-debuginfo-5.7.17-1.el7.x86_64.rpm
mysql-community-server-5.7.17-1.el7.x86_64.rpm
mysql-community-test-5.7.17-1.el7.x86_64.rpm

  2.使用yum安装

[root@db1 opt]# yum -y install mysql-community-*.rpm
[root@db1 opt]# rpm -qa | grep -i mysql
  1. 3.启动服务
    首次启动服务,会执行数据初始化,创建一些必要的数据和文件放在数据库目录中。

  2. [root@db1 opt]# systemctl start mysqld			##启动服务
    [root@db1 opt]# systemctl enable mysqld			##服务开机自启 
    [root@db1 opt]# systemctl status mysqld			#查看状态
    [root@db1 opt]# netstat -utnlp | grep mysql		#查看服务信息,默认端口为3306
    [root@db1 opt]# ps -C mysqld					#查看进程
    [root@db1 opt]# ls /var/lib/mysql				#默认是空的,启动服务后自动创建这些文件和目录
    [root@db1 opt]# cd
    [root@db1 ~]# grep password /var/log/mysqld.log  #初始密码存放位置
    2020-08-12T10:18:02.808042Z 1 [Note] A temporary password is generated for root@localhost: ejgq6=2r2A7v
    
    [root@db1 ~]# mysql -uroot -p'ejgq6=2r2A7v' 	#每个人的初始密码不同,使用初始密码登录啥也干不了。
    #-u后加用户名,-p后加密码含有特殊字符的加单引号
    mysql> show databases;		#查看当前已经有的库
    ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
    #报错提示,必须先重置密码,用ALTER USER命令。
    mysql> alter user root@"localhost" identified by "123qqq...A";		#初始配置中密码复杂度有要求
    Query OK, 0 rows affected (0.00 sec)
    mysql> show databases;		#查看当前已经有的库
    mysql> exit
    Bye
    [root@db1 ~]# mysql -uroot -p'123qqq...A'		#使用新的密码登录
    

2.2、相关参数

文件 说明 备注
/etc/my.cnf 主配置文件 与这个服务相关的信息都在[mysqld]下。
/var/lib/mysql 数据库目录
var/log/mysqld.log 日志文件 随机的初始密码也存放在这里
/var/lib/mysql/mysql.sock
默认端口号 3306
进程名 mysqld
传输协议 TCP
进程所有者 mysql
进程所属组 mysql
错误日志 /var/log/mysqld.log

主配置文件中默认开启的功能有“指定数据库目录位置”,“服务启动sock文件” ,“服务的错误日志文件”,“进程的PID文件“。

ps aux | grep mysqld  //查看进程调用的文件

2.3、初始配置,修改密码

  • 数据库管理员是root
    默认仅允许root本机链接
    首次登录密码在安装软件时随机生成
    随机密码存储在日志文件/var/log/mysqld.log里
    连接命令是]# mysql -h数据库地址 -u用户名 -p密码
  • 修改密码策略
mysql> show variables like "%password%";  
-- 查看包含password字样的变量,全局变量修改的时候使用set global。
mysql> show variables like "%password%";
+---------------------------------------+--------+
| Variable_name                         | Value  |
+---------------------------------------+--------+
| default_password_lifetime             | 0      |
| disconnect_on_expired_password        | ON     |
| log_builtin_as_identified_by_password | OFF    |
| mysql_native_password_proxy_users     | OFF    |
| old_passwords                         | 0      |
| report_password                       |        |
| sha256_password_proxy_users           | OFF    |
| validate_password_check_user_name     | OFF    |
| validate_password_dictionary_file     |        |
| validate_password_length              | 8      |
| validate_password_mixed_case_count    | 1      |
| validate_password_number_count        | 1      |
| validate_password_policy              | MEDIUM |  -- 验证方式是长度;数字;大小写;特殊字符;
| validate_password_special_char_count  | 1      |
+---------------------------------------+--------+
14 rows in set (0.00 sec)
mysql> set global validate_password_policy=0;	--修改策略
Query OK, 0 rows affected (0.00 sec)
mysql> set global validate_password_length=6;	--修改密码长度
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like "%password%";		--查看变量
+---------------------------------------+-------+
| Variable_name                         | Value |
+---------------------------------------+-------+
| default_password_lifetime             | 0     |
| disconnect_on_expired_password        | ON    |
| log_builtin_as_identified_by_password | OFF   |
| mysql_native_password_proxy_users     | OFF   |
| old_passwords                         | 0     |
| report_password                       |       |
| sha256_password_proxy_users           | OFF   |
| validate_password_check_user_name     | OFF   |
| validate_password_dictionary_file     |       |
| validate_password_length              | 6     |	--密码长度,默认是8位。修改后为6位。
| validate_password_mixed_case_count    | 1     |
| validate_password_number_count        | 1     |
| validate_password_policy              | LOW   |  --默认为高级别MEDLIUM,设置后为低级别LOW。验证方式是长度、数字;大小写;特殊字符;
| validate_password_special_char_count  | 1     |
+---------------------------------------+-------+
14 rows in set (0.00 sec)
  • 永久修改密码策略
[root@db1 ~]# vim /etc/my.cnf    #主配置文件
[mysqld]
validate_password_policy=0
validate_password_length=6
:wq
#重启服务后生效
[root@db1 ~]# systemctl restart mysqld  //重启服务
[root@db1 ~]# mysql -uroot -p'123qqq...A'
mysql>alter user root@"localhost" identified by "123456"; --修改密码为123456

三、数据库的基本管理

3.1、客户端连接MySQL服务的几种方法

  • (1)命令行
  • (2)web页面
  • (3)安装图形软件
  • (4)编写脚本(PHP、Java、Python)
  • (5)使用mysql命令
    —— mysql -h服务器IP -u用户名 -p密码 [数据库名]
    不加数据库名,默认进入数据库根目录
    —— quit或exit退出

3.2、数据存储流程

  • (1)连接数据库服务器
  • (2)建库——相当于在数据库的目录下创建一个新的目录
  • (3)建表——相当于新建一个文件
  • (4)插入数据——类似与文件内容
  • (5)断开连接

3.3、MySQL管理环境

  • SQL命令使用规则(结构化查询语言)
    • 每条SQL命令以”;“结尾

    • 默认命令不支持Tab补全(98%不能补全)

    • \c终止SQL命令

    • SQL命令不区分字母大小写(密码、变量值除外)

3.4、常用SQL命令分类

  • 管理数据库使用SQL(结构化查询语言)
    • DDL 数据库定义语言 如:create、alter、drop

    • DML 数据操作语言 如:insert、update、delete

    • DCL 数据控制语言 如:grant、revoke

    • DTL 数据事物语言 如:commit、rollback、savepoint

四、MySQL基本操作

4.1、库管理命令

  • 库类似于文件夹,用来存储表

4.1.1、显示已有库

mysql> show databases;		--显示已有库
+--------------------+
| Database           |
+--------------------+
| information_schema |	--虚拟库,在内存里,数据库目录下没有
| mysql              |	--mysql库是必须有的,用于描述用户访问权限。
| performance_schema |
| sys                |
+--------------------+

4.1.2、显示连接用户

mysql> select user();

4.1.3、切换库

mysql> use mysql

4.1.4、显示当前所在的库

mysql> select database();
+------------+
| database() |
+------------+
| mysql      |
+------------+
1 row in set (0.00 sec)

4.1.5、创建库

库的命名规则

  • 仅可以使用数字、字母、下划线、不能纯数字
  • 区分字母大小写,具有唯一性
  • 不可使用指令关键字、特殊字符
mysql> create database buydb;
mysql> create database gamedb;
Query OK, 1 row affected (0.00 sec)
mysql> use buydb;
mysql> select database();
+------------+
| database() |
+------------+
| buydb      |
+------------+
1 row in set (0.00 sec)

4.1.6、删除库

删除数据库是将已存在的数据库从磁盘上清除,里面的数据也会被清除。

mysql> drop database gamedb;

4.1.7、查看创建好的数据库定义

mysql> show create database  buydb\G  
*************************** 1. row ***************************
       Database: buydb
Create Database: CREATE DATABASE `buydb` /*!40100 DEFAULT CHARACTER SET latin1 */
1 row in set (0.00 sec)

4.2、表管理命令

  • 表就是存储数据的文件

4.2.1、建表

格式:
mysql>create table 库名.表名( 字段名1 类型(宽度) , 字段名2 类型(宽度) , …) DEFAULT CHARSET=utf8; //指定中文字符集.

mysql> create database db1;		--先创建库
Query OK, 1 row affected (0.00 sec)
mysql> create table db1.stuinfo( name char(15) , homeadd char(20) , class char(7) );		--创建表,
Query OK, 0 rows affected (0.01 sec)
[root@db1 ~]# cd /var/lib/mysql/db1/
[root@db1 db1]# ls			--在对应的文件夹中存在数据,db.opt是库的配置文件.
db.opt  stuinfo.frm  stuinfo.ibd
mysql> create table db1.学生表2(姓名 char(4) , 住址 char(10) , 班级 char(7) )default charset=utf8;		--创建能输入中文的表
Query OK, 0 rows affected (0.01 sec)

mysql> desc 学生表2;		--查看表结构

4.2.2、查看创建这个表用的命令

mysql> show create table db1.学生表2;		--查看创建这个表用的命令.

4.2.3、查看表结构

格式:desc 库名.表名;

mysql> desc stuinfo;		--查看表的结构
+---------+----------+------+-----+---------+-------+
| Field   | Type     | Null | Key | Default | Extra |
+---------+----------+------+-----+---------+-------+
| name    | char(15) | YES  |     | NULL    |       |
| homeadd | char(20) | YES  |     | NULL    |       |
| class   | char(7)  | YES  |     | NULL    |       |
+---------+----------+------+-----+---------+-------+
3 rows in set (0.00 sec)
--后四列统称为约束条件

4.2.4、删除表命令

格式: drop table 库名.表名;

mysql> drop table db1.学生表2;
Query OK, 0 rows affected (0.00 sec)

4.2.5、修改MySQL服务的默认字符集

更改服务器的my.cnf配置文件,添加character_set_server=utf8 配置,然后重启数据库服务。

[root@dbsvr1 ~]# vim /etc/my.cnf                          #修改运行服务配置
[mysqld]
.. ..
character_set_server=utf8
[root@dbsvr1 ~]# systemctl restart mysqld                 #重启服务
.. ..
[root@dbsvr1 ~]# mysql –u root -p  
Enter password:
.. ..
mysql> SHOW VARIABLES LIKE 'character%';                  #确认更改结果
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                          |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.03 sec)

4.3、表记录管理命令

4.3.1、插入表记录(增)

  1. 1.插入1条记录 给所有字段赋值
    格式:
    insert into 库名.表名 values (字段1,字段2,字段3,…);

  2. mysql> insert into db1.stuinfo values("tom","beijin","2006");
    Query OK, 1 row affected (0.00 sec)
    

2.插入多条记录 给所有字段赋值
格式:
insert into 库名.表名 values (字段1,字段2,字段3,…),(字段1,字段2,字段3,…);

mysql> insert into db1.stuinfo values("lisi","baoding","2006"),("zhangsan","zhangjiakou","2006");
Query OK, 2 rows affected (0.00 sec)

3.插入1条记录 给某几个字段赋值
格式:
insert into 库名.表名 (字段名1,字段名2,字段名3) values (字段1,字段2,字段3,…);

mysql> insert into db1.stuinfo (name,class) values("wangwu","2007");
Query OK, 1 row affected (0.00 sec)

mysql> select * from db1.stuinfo;
+----------+-------------+-------+
| name     | homeadd     | class |
+----------+-------------+-------+
| tom      | beijin      | 2006  |
| lisi     | baoding     | 2006  |
| zhangsan | zhangjiakou | 2006  |
| wangwu   | NULL        | 2007  |
+----------+-------------+-------+
4 rows in set (0.00 sec)
  1. 4.插入多条记录 给某几个字段赋值
    格式:
    insert into 库名.表名 (字段名1,字段名2,字段名3) values (字段1,字段2,字段3,…),(字段1,字段2,字段3,…);

  2. mysql> insert into db1.stuinfo (name,homeadd,class) values("liuliu","nmg","2002"),("zhouqi","hlj","20004");
    Query OK, 2 rows affected (0.00 sec)
    Records: 2  Duplicates: 0  Warnings: 0
    
    mysql> select * from db1.stuinfo;                                                        +----------+-------------+-------+
    | name     | homeadd     | class |
    +----------+-------------+-------+
    | tom      | beijin      | 2006  |
    | lisi     | baoding     | 2006  |
    | zhangsan | zhangjiakou | 2006  |
    | wangwu   | NULL        | 2007  |
    | liuliu   | nmg         | 2002  |
    | zhouqi   | hlj         | 20004 |
    +----------+-------------+-------+
    6 rows in set (0.00 sec)
    
  • 注意事项
    • 字段值要与字段类型相匹配

    • 字符类型的字段,要用" " 号

    • 依次给所有字段赋值时,字段名可以省略

    • 只给部分字段赋值时,必须明确写出对应的字段名称

    • 没有赋值的字段使用默认值或自增长赋值

4.3.2、删除表记录

  • 命令格式1:条件匹配删除
    • delete from 库名.表名 where 条件表达式;

mysql> delete from db1.stuinfo where class="20004";
Query OK, 1 row affected (0.01 sec)

mysql> select * from db1.stuinfo;
+----------+-------------+-------+
| name     | homeadd     | class |
+----------+-------------+-------+
| tom      | beijin      | 2006  |
| lisi     | baoding     | 2006  |
| zhangsan | zhangjiakou | 2006  |
| wangwu   | NULL        | 2007  |
| liuliu   | nmg         | 2002  |
+----------+-------------+-------+
5 rows in set (0.00 sec)
  • 命令格式2:删除所有记录
    • delete from 库名.表名;

mysql> delete from db1.stuinfo ;
Query OK, 5 rows affected (0.00 sec)

mysql> select * from db1.stuinfo;
Empty set (0.00 sec)
  • 注意事项
    • 不加条件删除表中所有行

  • 删除表
mysql> drop tables stuinfo;		--删除表
Query OK, 0 rows affected (0.00 sec)

4.3.3、修改表记录

  • 命令格式1:批量更新
    • update 库名.表名 set 字段名=值 , 字段名=值 , 字段名=值,…;

--先增加4条记录
mysql> insert into db1.stuinfo values("tom","beijin","2006");
mysql> insert into db1.stuinfo values("lisi","baoding","2006"),("zhangsan","zhangjiakou","2006");
mysql> insert into db1.stuinfo (name,class) values("wangwu","2007");

mysql> select * from db1.stuinfo;			--修改前查看表记录
+----------+-------------+-------+
| name     | homeadd     | class |
+----------+-------------+-------+
| tom      | beijin      | 2006  |
| lisi     | baoding     | 2006  |
| zhangsan | zhangjiakou | 2006  |
| wangwu   | NULL        | 2007  |
+----------+-------------+-------+
4 rows in set (0.00 sec)


mysql> update db1.stuinfo set class="1937";
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4  Changed: 4  Warnings: 0

mysql> select * from db1.stuinfo;			--修改后查看表记录
+----------+-------------+-------+
| name     | homeadd     | class |
+----------+-------------+-------+
| tom      | beijin      | 1937  |
| lisi     | baoding     | 1937  |
| zhangsan | zhangjiakou | 1937  |
| wangwu   | NULL        | 1937  |
+----------+-------------+-------+
4 rows in set (0.00 sec)
  • 命令格式2:条件匹配更新
    • update 库名.表名 set 字段名=值,字段名=值,字段值=值,… where 条件表达式;

mysql> update db1.stuinfo set class="2020" where name="tom";	--修改名字是tom的行
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from db1.stuinfo;
+----------+-------------+-------+
| name     | homeadd     | class |
+----------+-------------+-------+
| tom      | beijin      | 2020  |
| lisi     | baoding     | 1937  |
| zhangsan | zhangjiakou | 1937  |
| wangwu   | NULL        | 1937  |
+----------+-------------+-------+
4 rows in set (0.00 sec)
  • 注意事项
    • 字段值要与字段类型匹配

    • 对于字符类型的字段,值要用" "

    • 不使用where限定条件,会更新所有记录字段值

    • 限定条件时,只更新匹配条件的记录的字段值

4.3.4、查看表记录

  • 命令格式1:通过条件筛选
    select 字段名 from 库名.表名 [ where 条件 ];
  • 命令格式1:显示表内全部
    select * from 库名.表名 ;
  • 注意事项
    • *表示所有字段

    • 查看当前库表记录时库名可以省略

    • 字段列表决定显示列个数

    • 条件决定显示行的个数

mysql> show tables;		--查看当前库下的所有表
+---------------+
| Tables_in_db1 |
+---------------+
| stuinfo       |
+---------------+
1 row in set (0.00 sec)

mysql> select * from db1.stuinfo;		--查看表记录
+----------+-------------+-------+
| name     | homeadd     | class |
+----------+-------------+-------+
| tom      | beijin      | 2020  |
| lisi     | baoding     | 1937  |
| zhangsan | zhangjiakou | 1937  |
| wangwu   | NULL        | 1937  |
+----------+-------------+-------+
4 rows in set (0.00 sec)

mysql> select * from db1.stuinfo  where class="2020";	--查看class为2020的
+------+---------+-------+
| name | homeadd | class |
+------+---------+-------+
| tom  | beijin  | 2020  |
+------+---------+-------+
1 row in set (0.00 sec)