MySQL
简介
数据库DB
数据库( DataBase , DB )从本质上讲就是一个文件系统,它能够将数据有组织地集合在一起,按照一定的规则长期存储到计算机的磁盘中,并且能够供多个用户共享和使用,同时,用户能够对数据库中的数据进行插入、删除、修改和查询等操作。
数据库管理系统 BDMS
数据库管理系统( DataBase Management System , DBMS 从本质讲就是一个为管理数据库中的数据而设计的一套管理系统。它依托数据库,对外提供统一管理数据库中数据的功能和接口能够有效地对数据库的安全、认证、数据 备份、数据恢复、数据传输等进行统一的管理。同时,数据库管理系统能够根据所依托的数据库模型对数据库进行相应的分类。大多数的数据库都是通过数据库管理系统对数据库中的数据进行管理和维护的。
DB 与 DBMS 的关系
数据库的分类
关系型数据库
依据所有存储数据的模型之间的关系建立的数据库。所谓关系模型,指的是 “ 一对一、
一对多、多对多 ” 等
关系型。常见的关系型数据库如下:
Oracle:是 Oracle 公司的数据库产品
Mysql: 最早属于瑞典的 MysqlAB 公司的,后被 Sun 公司收购, Sun 在 2009 年
4 月 20 号被 Oracle 收购。
SQLServer:微软旗下的数据库产品
Access:微软旗下的数据库产品
DB2:IBM 公司旗下的数据库产品
非关系型数据库
泛指非关系型的数据库,区别于关系数据库。采用了没有特定关系模型来组织数据。常
见的非关系型数据库如下:
MongoDB:是一个面向文档的开源 NoSQL 数据库 .MongoDB 使用 JSON 之类的文档来存储任何数据. 它是用 c++ 写的。
Cassandra:是 Facebook 为收件箱搜索开发的 .Cassandra 是一个用于处理大量结构化数据的分布式数据存储系统
Redis:是最著名的键值存储。 Redis 是用 C 语言编写的。它是根据 BSD 授权的。
HBase:谷歌为 BigTable 数据库设计的分布式非关系数据库。
数据库的安装及配置
安装
安装命令:
sudo apt-get update # 更新软件源
sudo apt-get install mysql-server # 安装 mysql
安装过程会提示设置 mysql root 用户的密码
输入 root 账号的密码
确认 root 账号的密码
然后它会自动安装完成
启动或关闭 MySQL
启动命令
service mysql start
关闭命令
service mysql stop
重启命令
service mysql restart
注意 : 默认安装完成后, MySQL 为启动状态
确认是否启动成功
命令 :
sudo netstat -tap | grep mysql
注意 :
mysql节点处于 LISTEN 状态表示启动成功
进入 MySQL Shell
命令 :
mysql -u root -p
回车
输入安装mysql 时的密码
mysql 中文乱码
原因
character_set_server 默认设置是 latin1
查看命令 :
show variables like "char%";
查看结果如下
解决方案 : 修改 mysql 配置
步骤 0: 退出 mysql
exit
步骤 1: 编辑配置文件 sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
步骤 2: 在文件 [mysqld] 下添加 character_set_server=utf8. 保存退出
步骤 3: 重启 mysql 服务
service mysql stop
service mysql start
或
service mysql restart
步骤 4: 登录 MySQL, 并查看 MySQL 目前设置的编码。 show variables like "char%";
外部工具连接 mysql 失败
原因
Ubuntu 下默认安装 MySQL 只支持本地机的 localhost 和 127.0.0.1 进行连接访问 , 不能通
过虚拟机的 IP 地址进行远程访问 MySQL
修改
1, 修改 mysql
1.1:在 Ubuntu 系统的 dos 中打开 mysql 库。
mysql -u root -p
这时会提示你输入 root 的密码,输入 root 密码后登陆进入 mysql 控制
台。
在 mysql 控制台中执行如下 sql 语句
1.2:切换之 mysql 库中
use mysql;
1.3:修改权限表,将 root 的登陆 host 改为 ‘%’, 即允许所有 ip 。
update user set host = '%' where user = 'root';
1.4:立刻刷新权限
flush privileges;
注意:如果你还是不能远程连接,则继续执行下一步操作
2, 修改 mysql 配置文件
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
修改其中的 bind-address 后面的 ip 值为 0.0.0.0 ,如下:
bind-address = 0.0.0.0
保存修改,重启 mysql ,即可。命令如下 :
service mysql restart
至此,即可通过远程 ip 登陆 mysql 了
以上步骤完成后就可以在主机安装 mysql 可视化操作工具了 , 如 sqyog
SQL语句
简介
SQL ( Structured Query Language )结构化查询语言,用于存取、查询、更新数据以及管理关系型数据库系统
SQL 是在 1981 年由 IBM 公司推出,一经推出基于其简洁的语法在数据库中得到了广泛的应用,成为主流数据库的通用规范
SQL 由 ANSI 组织确定规范
在不同的数据库产品中遵守 SQL 的通用规范,但是也对 SQL 有一些不同的改进,形成了一些数据库的专有指令
MySQL : limit
SQLServer : top
Oracle : rownum
分类
根据 SQL 指令完成的数据库操作的不同,可以将 SQL 指令分为四类
数据存在表中 , 表是存储在数据库中 ,mysql 中可以有多个数据库表: 类似与 Execl
- DDL ( Data Definition Language )数据定义语言
- 用于完成对数据库对象(数据库、数据表、视图、索引等)的创建、删除、修改
- DML ( Data Manipulation Language )数据操作 / 操纵语言
- 用于完成对数据表中的数据的添加、删除、修改操作
- 添加:将数据存储到数据表
- 删除:将数据从数据表移除
- 修改:对数据表中的数据进行修改
- DQL ( Data Query Language )数据查询语言
- 用于将数据表中的数据查询出来
- DCL ( Data Control Language )数据控制语言
- 用于完成事务管理等控制性操作
基础语法
在 MySQL Command Line Client 或者 Navicat 等工具中都可以编写 SQL 指令
- SQL 指令不区分大小写
但是在后期编写sql 指令时 ,sql 提供的关键字一般使用大写 , 自定义的名称用小写
- 每条 SQL 表达式结束之后都以 ; 结束
- SQL 关键字之间以空格进行分隔
- SQL 之间可以不限制换行(可以有空格的地方就可以有换行)
- MySQL 注释:
- 单行注释: -- 注释内容
注意 : 在 -- 后要加空格
- 单行注释: # 注释内容
- 多行注释: /* 注释内容 */
DDL:数据定义语言
作用:用于完成对数据库对象(数据库、数据表、视图、索引等)的创建、删除、修改
数据库操作
查询数据库
- > 显示当前 mysql 中的数据库列表
> show databases;
- > 显示指定名称的数据的创建的 SQL 指令
> show create database 库名 ;
创建数据库
- > 创建数据库
> create database 库名 ;
- > 创建数据库,当指定名称的数据库不存在时执行创建
> create database if not exists 库名 ;
- > 在创建数据库的同时指定数据库的字符集(字符集:数据存储在数据库中采用的编码格
式 utf8 、 gbk )
> CREATE DATABASE IF NOT EXISTS 库名 CHARSET 'utf8';
修改数据库字符集
- > 修改数据库的字符集
> alter database 库名 CHARSET 字符集 ;
删除数据库
- > 删除数据库
> drop database 库名 ;
- > 如果数据库存在则删除数据库
> drop database if exists 库名 ;
使用 / 切换数据库
use 库名 ;
数据表操作
创建完数据库之后,接下来就是在数据库中创建数据表。在 MySQL 中,数据表以二维表格的形式展示,表格中的一行代表一条完整的数据记录,表格中的一列代表数据的某个
特定属性。
需要注意:
在数据库中创建表之前,需要查看当前使用的数据库
语法: select database();
然后切换到你需要操作的数据库
use db_name;
建表
语法
create table 表名 ( 字段 1 字段类型 , 字段 2 字段类型 , ... 字段 n 字段类型 );
字段类型
int :整型
double :浮点型,例如 double(5,2) 表示最多 5 位,其中必须有 2 位小数,即最大值为
999.99 ;
char :固定长度字符串类型;
char(10): 'aaa ' 占 10 位
varchar :可变长度字符串类型;
varchar(10): 'aaa' 占 3 为
text :字符串类型;
blob :字节类型;
date :日期类型,格式为: yyyy-MM-dd ;
time :时间类型,格式为: hh:mm:ss
timestamp :时间戳类型 yyyy-MM-dd hh:mm:ss 会自动赋值
datetime: 日期时间类型 yyyy-MM-dd hh:mm:ss
boolean:mysql 不支持 ,oracle 支持
示例
创建一张存储学员信息的表 :stu
表中的字段有 :
s_id 一条数据的唯一标识符 int primary key auto_increment
s_name 学员姓名 varchar(30)
s_sex 学员性别 varchar(10)
s_age 学员年龄 int
s_class 学员所在班级 varchar(50)
s_num 学号 varchar(16)
s_type 学员专业 varchar(50)
sql 语句
create table stu(
s_id int primary key auto_increment,
s_name varchar(30),
s_sex varchar(10),
s_age int,
s_class varchar(50),
s_num varchar(16),
s_type varchar(50)
);
查看所有表
语法
SHOW TABLES;
重命名表
rename table 原表名 to 新表名 ;
查看表信息
语法
SHOW CREATE TABLE 表名 ;
修改字符集
语法
ALTER TABLE 表名 CHARACTER SET 修改后的字符集 ;
注意 : 一般使用 utf8( 就是 utf-8)
查表字段信息
语法
DESC 表名;
备份表
语法
create table 新表名 as select * from 要备份的表的名称 ;
如 :
create table tname2 as select * from tname1;
备份表结构
语法
create table 新表名 like 要备份的表的名称 ;
如 :
create table tname2 like tname1;
删除表
语法
DROP TABLE 表名 ;
添加列
语法
ALTER TABLE 表名 ADD 添加的列名 填加的列字段类型 ;
修改列
alter table 表名 modify 要修改的列名 修改后的字段类型 ;
删除列
alter table 表名 drop 列名 ;
注意 : 一次只能删一列
列重命名
ALTER TABLE 表名 CHANGE 原列名 新列名 新字段类型 ;
DML:数据操作语言
插入数据
作用 : 给表中添加数据
语法
insert into 表名 ( 列名 1, 列名 2....) values ( 值 1, 值 2....);
示例:
# 向数据表中指定的列添加数据(不允许为空的列必须提供数据)
insert into stus(stu_num,stu_name,stu_gender,stu_age,stu_tel)
values ( '20210101' , ' 张三 ' , ' 男 ' , 21 , '13030303300' );
# 数据表名后的字段名列表顺序可以不与表中一致,但是 values 中值的顺序必须与表名
后字段名顺序对应
insert into stus(stu_num,stu_name,stu_age,stu_tel,stu_gender)
values ( '20210103' , ' 王五 ' , 20 , '13030303302' , ' 女 ' );
# 当要向表中的所有列添加数据时,数据表名后面的字段列表可以省略,
# 但是 values 中的值的顺序要与数据表定义的字段保持一致 ;
insert into stus values ( '20210105' , ' 孙琦' , ' 男 ' , 21 , '13030303304' , '666666' );
# 不过在项目开发中,即使要向所有列添加数据 , 也建议将列名的列表显式写出来 ( 增强
SQL 的稳定性 )
insert into stus(stu_num,stu_name,stu_gender,stu_age,stu_tel,stu_qq)
values ( '20210105' , ' 孙琦 ' , ' 男 ' , 21 , '13030303304' , '666666' );
修改数据
语法:
update 表名 set 列名 1= 值 1 ,列名 2= 值 2 [ where 条件 ];
示例:
# 将学号为 20210105 的学生姓名修改为 “ 孙七 ” (只修改一列)
update stus set stu_name= ' 孙七 ' where stu_num= '20210105' ;
# 将学号为 20210103 的学生 性别修改为 “ 男 ”, 同时将 QQ 修改为 777777 (修改多列)
update stus set stu_gender= ' 男 ' ,stu_qq= '777777' where
stu_num= '20210103' ;
# 根据主键修改其他所有列
update stus set stu_name= ' 韩梅
梅 ' ,stu_gender= ' 女 ' ,stu_age= 18 ,stu_tel= '13131313311' ,stu_qq= '999999'
where stu_num= '20210102' ;
# 如果 update 语句没有 where 子句,则表示修改当前表中所有行(记录)
update stus set stu_name= 'Tom' ;
删除数据
语法:
delete from 表名 [where 条件 ];
示例:
# 删除学号为 20210102 的学生信息
delete from stus where stu_num= '20210102' ;
# 删除年龄大于 20 岁的学生信息 ( 如果满足 where 子句的记录有多条,则删除多条记录 )
delete from stus where stu_age> 20 ;
# 如果删除语句没有 where 子句,则表示删除当前数据表中的所有记录 ( 敏感操作 )
delete from stus;