Skip to content

你知道的数据存储方式有哪些?

文件

有什么缺点?

无法区分数据类型

没有访问安全限制

没有备份恢复机制

一 数据库入门

1 什么是数据库

数据库(Database)是按照数据结构来组织、存储和管理数据的建立在计算机存储设备上的仓库。

严格来说,数据库是长期储存在计算机内、有组织的、可共享的数据集合。这种数据集合具有如下特点:尽可能不重复,以最优方式为某个特定组织的多种应用服务,其数据结构独立于使用它的应用程序,对数据的增、删、改、查由统一软件进行管理和控制

2 常用数据库管理系统

Mysql:甲骨文公司的产品,免费。

Oracle:甲骨文公司的产品。和java语言兼容非常好。适合中大型,中大应用。

SqlServer:微软公司的产品。主要应用在window平台下,和.net平台兼容性好。

以上这些都是关系型数据库

关系模型就是指二维表格模型,因而一个关系型数据库就是由二维表及其之间的联系组成的一个数据组织

2 数据库中数据存储结构

要使用数据库,必须先安装数据库服务软件,然后建立数据库,在数据库中建表,在表中存储数据。

所谓数据库服务器, 是指在机器上装了一个数据库管理程序,这个管理程序可以管理多个数据库,一般开发人员会针对每一个应用创建一个数据库。

为保存应用中实体的数据,一般会在数据库创建多个表,以保存程序中实体的数据。

数据库服务器、数据库和表的关系如图所示:

img

3 SQL语言

SQL(Structured Query Language),结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。

SQL语言包含4个部分

(1) 数据定义语言(Data Definition Language, DDL)

​ 是SQL语言集中负责数据结构定义与数据库对象定义的语言,这些语句包括CREATE、ALTER、DROP等。

(2) 数据操作语言(Data Manipulation Language,DML)

​ 用户通过它可以实现对数据库中数据的基本操作。比如,对表中数据的增删改查。这些语句包括:

​ SELECT - 从数据库表中获取数据;

​ UPDATE - 更新数据库表中的数据;

​ DELETE - 从数据库表中删除数据;

​ INSERT INTO - 向数据库表中插入数据

​ 等等

(3)数据控制语言(Data Control Language,DCL)

​ 用来设置或者更改数据库用户或角色权限的语句,这些语句包括GRANT、DENY、REVOKE等。

(4)事务控制语言(Transaction Control Language, TCL)

​ 语句主要包括SAVEPOINT、ROLLBACK 、COMMIT等

大小写的基本规则

(1)SQL 的关键字和函数名不区分大小写;

(2)数据库名和表名的默认大小写取决于服务器主机的操作系统在命名方面的规定,建议都使用小写,多个单词使用下划线分隔。

比如 Windows 系统的文件名不区分大小写,所以运行在 Windows 系统上面的 MySQL 服务器也不用区分数据库名和表名的大小写。Linux 系统的文件名区分大小写,所以运行在 Linux 系统上的 MySQL 服务器需要区分数据库名和表名的大小写

(3)列名和索引名都不区分大小写。一般都使用小写,多个单词使用下划线分隔

另外,列名不要使用SQL中的关键字

二 MySql数据库入门

1 安装/卸载

官方网站:https://www.mysql.com/

下载地址:https://dev.mysql.com/downloads/mysql/

安装过程可以参考视频

2 连接mysql数据库

打开cmd,输入mysql -uroot -p

shell
mysql -uroot -p
Enter password: ****

或者
mysql -uroot –proot

参数说明:

-u用户名 –p密码

三 数据库管理 (了解)

1 查询所有数据库

plsql
mysql> show databases;

自带的数据库

数据库名称描述
information_schema信息数据库,其中保存着关于所有数据库的信息(元数据)。元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。
mysql核心数据库,主要负责存储数据库的用户、权限设置、关键字等,以及需要使用的控制和管理信息,不可以删除。
performance_schema保存服务器运行过程中的状态信息,可用于性能监控
sys通过视图将information_schema和performance_schema的信息结合起来,更方便了解服务器性能信息

2 创建数据库

语法

create database [IF NOT EXISTS] 数据库名

[DEFAULT] charset 字符集名称

[DEFAULT] COLLATE 校对规则

charset 字符集,如果不指定,采用默认的字符集编码方式

COLLATE 校对规则,校对规则定义了同一个字符集中字符的比较规则,一般使用默认规则

plsql
mysql> create database dbtest;
-- 或者 创建时指定字符集
mysql> create database dbtest default charset utf8;

注意:

mysql8开始,默认的字符集编码方式为utf8mb4;mysql8之前为latin1

使用utf8默认校对规则为utf8_general_ci,使用utf8mb4默认校对规则为utf8mb4_general_ci(ci即case insensitive,不区分大小写)

3 删除数据库

语法:drop database [ IF EXISTS ] 数据库名

plsql
mysql> drop database dbtest;

4 查看数据库字符集等信息

语法:show create database 数据库名

plsql
mysql> show create database dbtest;

5 修改数据库

语法

alter database 数据库名

[DEFAULT] charset 字符集名称]

[DEFAULT] COLLATE 校对规则]

plsql
mysql> alter database dbtest default charset gb2312;

6 切换数据库

语法:use 数据库名

plsql
mysql> use db2202;

四 表管理

1 查看所有表

plsql
mysql> show tables;

2 创建表

语法:CREATE TABLE [if not exists] 表名 (

​ 列名1 类型1,…,列名n 类型n

)

注意:创建表时,要根据需保存的数据创建相应的列,并根据数据的类型定义相应的列类型

plsql
mysql> create table student(
    id int,
    name varchar(10),
    age int);

MySQL常用数据类型:

分类数据类型说明
数值类型比如:TINYINT, SMALLINT, INT, BIGINT FLOAT, DOUBLE, DECIMALint(11),11表示显示宽度,当设置无符号和zerofill时,且数值的长度小于显示宽度时,左边会补0。decimal可用于存储表示精确小数位数的数据
字符串、文本、二进制类型比如:CHAR(size)VARCHAR(size)BLOB LONGBLOBTEXTLONGTEXTchar固定长度字符串,最大255字符varchar可变长度字符串,最大65535个字符BLOB表示二进制数据TEXT文本数据,最大64KB,LONGTEXT最大4GB注意:使用char或者varchar需要指定存储的字符串的最大长度
时间日期比如:DATEDATETIMETimeStampTimeStamp表示时间戳,是以年月日时分秒的形式进行展示,一般使用datetime较多

注意:数据库中,字符串使用单引号表示

char与varchar区别?

varchar 长度可变,比如定义为varchar(100),如果数据实际长度为10,那么该字段只会分配10个字符

char 长度固定,不管数据实际占用几个字符,都会分配指定长度的字符

3 查看表结构

语法:desc 表名

sql
mysql> desc student;

4 删除表

语法:drop table 表名

sql
mysql> drop table student;

5 修改表

语法:alter table 表名 add|drop|modify|change column 列名 [类型]

5.1 添加字段(添加列)

sql
mysql> alter table student add column birth date;

5.2 删除列

sql
mysql> alter table student drop column birth;

5.3修改字段类型 modify

sql
mysql> alter table student modify column sex char(1);

5.4 修改字段名称 change

sql
mysql> alter table student change column id sid int;

5.5 修改表名

语法:rename table 原表名 to 新表名

sql
mysql> rename table test to tt;

五 表的增删改操作(重点)

Insert语句 (增加数据)

Delete语句 (删除数据)

Update语句 (更新数据)

1 插入数据

语法:insert into 表名(列名1,...) values(值1,...);

sql
mysql> insert into student(sid,name,age,sex) values(1,'zhangsan',20,'M');

-- 如果是给表中的每个字段都插入值,列名可以省略不写
mysql> insert into student values(2,'lisi', 12, 'M');

-- 如果只给某些字段插入值,列名必须写
mysql> insert into student(sid, name) values(3, 'Lucy');

-- 可以插入多条记录
mysql> insert into student(sid,name,age,sex) values(1,'zhangsan',20,'M'),(10,'lisi',12,'F');

注意:

插入的数据应与字段的数据个数、类型相同,在values中列出的数据位置必须与被加入的列的排列位置相对应;

数据的大小应在列的规定范围内,例如:不能将一个长度为100的字符串加入到长度为10的列中;

字符和日期型数据应包含在单引号中;

如果插入空值,不指定或使用null

2 删除数据

语法:delete from 表名 [where条件];

sql
--- 如果不写where,会删除表中的所有数据
mysql> delete from student;

-- 如果指定条件,根据条件删除,如删除sid值为3的所有数据
mysql> delete from student where sid=3;

注意:清空表中所有数据,还可以使用如下写法

sql
mysql> truncate student;

通过delete与turncate清空表的区别?

严格来说,truncate的操作称为截断表

在启用事务的情况下,delete的数据库可以回滚,truncate不行;

如果使用自增约束,truncate后,再次插入数据,自增字段值从1开始,使用delete后,自增的字段从数据库中记录的最大值开始(比如自增到100,即使删除了100这条数据,自增的值还是会从101开始)

3 修改数据

语法:update 表名 set 字段名1=值1, ... [where条件];

UPDATE语法可以用新值更新原有表的行中的数据,如没有WHERE子句,则更新所有的行

sql
mysql> update student set age=30;
mysql> update student set age=20,sex='F';
mysql> update student set sex='M' where sid=1;

六 查询数据(重点)

基本语法:select * | 列名1,列名2…from 表名 [where 条件]

*是通配符,表示表中的所有字段

1 查询所有数据

sql
select * from student;

2 查询指定列数据

sql
mysql> select sid,name,age,sex from student;
mysql> select name,age,sid,sex from student;
mysql> select sid,name from student;

3 查询时指定列别名

格式:字段名 as 别名,其中,as可以省略不写

sql
mysql> select name as stu_name from student;
mysql> select name stu_name from student;

4 查询时使用运算符

sql
mysql> select name, age+10  new_age from student;
mysql> select sid,name,java+c total from student;

5 查询时去除重复数据

sql
mysql> select distinct age from student;

6 按条件查询 where

where语句中可以使用的运算符主要包括:

比较运算符>、<、<=、 >=、 =、 <>、 !=大于、小于、大于(小于)等于、不等于
BETWEEN ...AND...显示在某一区间的值
IN(set)显示在in列表中的值,例:in(100,200)
LIKE模糊查询 _ %
IS NULL判断是否为空
逻辑运算符and(&&)、 or (||)and多个条件同时成立or 多个条件任一成立
not不成立,例:where not(salary>100); is not null

6.1逻辑条件查询

涉及多个条件 and(与) or(或)

sql
mysql> select * from student where sex='F' and c=70;
mysql> select * from student where sex='F' or java=60;

6.2 比较条件查询

主要涉及 > 、 >= 、< 、<= 、= 、<> , between and

sql
mysql> select * from student where java>80;
mysql> select * from student where java<>89;  不等于
mysql> select * from student where java between 70 and 90;

6.3 判断是否为null

null表示没有数据

sql
mysql> select * from student where age is null;
mysql> select * from student where age is not null;

6.4 模糊查询

模糊查询的关键字:like,not like

% 表示匹配0个或多个字符

_ (下划线) 表示匹配一个字符

sql
-- 以wang开头
mysql> select * from student where name like 'wang%';

-- 包含wang
mysql> select * from student where name like '%wang%';

mysql> select * from student where name like 'wang__';

6.5 in

用来确定指定列的值是否匹配列表中的值

java
mysql> select * from student where sid in(1,3,5);

7 查询中使用聚合函数

聚合函数:count()/avg()/sum()/max()/min()

使用列名作为参数时,不统计值为null的数据

7.1计算表中有多少条数据(行)

count()

sql
mysql> select count(*) from student;
mysql> select count(1) from student;

-- 统计age字段值不是null的数据个数
mysql> select count(age) from student;

7.2求平均值

avg()

sql
mysql> select avg(age) from student;

7.3求最大值和最小值

max()/min()

sql
mysql> select max(c) from student;
mysql> select min(c) from student;

7.4求和

sum()

sql
mysql> select sum(c) from student;

8 排序 order by

语法:select … order by 列名1[asc/desc], 列名2[asc/desc]...

order by 指定排序的列名。排序时,可以指定按照多个列名排序

asc 升序、desc 降序 (默认是升序)

sql
mysql> select * from student order by java;

-- 降序
mysql> select * from student order by java desc;

-- 升序 ,默认
mysql> select * from student order by java asc;

-- 本例根据java成绩升序,值相同,根据c成绩降序
mysql> select * from student order by java, c desc;

9 分组查询 group by

语法:select … group by 列名1 [asc/desc], 列名2... [having 条件]

可以根据多个列名分组,分组后的数据可以根据分组时使用的列名排序(mysql8不支持排序),默认升序

having 必须出现在group by 后面,表示对分组后的结果进行条件查询

注意:分组时,select 后获取的字段一般是group by 中使用的分组字段,select后还可以使用聚合函数,聚合函数中可以使用非分组字段。除了以上两种情况,分组时,select后包含其他字段没有实际意义

sql
mysql> select count(sex) from student group by sex;
mysql> select sex,count(sex) from student group by sex;

-- 使用having 对分组后数据查询
mysql> select sex,count(sex) from student group by sex having count(sex)>1;

注意:Having和where均可实现条件过滤,但在having可以使用聚合函数,having通常跟在group by后,它作用于组。

10 分页查询 limit

语法 limit offset, size

实际开发时,由于表中数据比较多,而页面上显示数据的区域有限,为了提高可读性和用户体现,一般都采用分页显示方式。

分页时,offset表示查询的起始位置,size表示每页要查询的记录个数

offset可以不写,表示从0位置开始查询

sql
mysql> select * from student limit 0,2;

-- 如果offset=0, 可以不写
mysql> select * from student limit 2;

mysql> select * from student limit 2,2;
mysql> select * from student limit 4,2;

如何根据页码计算分页查询时的起始位置?

每页显示的数据用pageSize表示,如果传的参数是页码pageNum,

offset= (pageNum -1) * pgeSize

11 查询时的书写顺序

select 列名 from 表名 where条件 group by 列名 having 条件 order by 列名 limit offset,size

sql
mysql> select sex,count(sex) from student where sex is not null group by sex order by sex desc;

七 常用函数 (了解)

1日期函数

sql
--  当前日期时间函数
mysql> select now(); 

-- 设置日期字段值
mysql> update student set hire_date='2017/07/21' where sid=1;
mysql> update student set hire_date='2017-07-21' where sid=1;
mysql> update student set hire_date=now() where sid=2;

-- 当前日期时间
mysql> select sysdate();  

--  当前日期
mysql> select current_date();

-- 当前时间
mysql> select current_time(); 

-- 当前时间戳
mysql> select current_timestamp(); 

-- 两个日期的差,天数
mysql> select datediff('2017-07-21', '2017-07-24'); 

-- 日期格式化
mysql> select DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s')

select date_format(birth, '%Y-%m-%d') from student;

--  unix时间戳 秒
mysql> select unix_timestamp();

-- 日期增加1天
mysql> select date_add(now(), INTERVAL 1 day);

-- 时间减少1天
mysql> select date_sub(now(), INTERVAL 1 day);

-- 间隔
-- INTERVAL 1 YEAR
-- INTERVAL 1 MONTH
-- INTERVAL 1 DAY
-- INTERVAL 1 HOUR
-- INTERVAL 1 MINUTE
-- INTERVAL 1 SECOND

-- 分别获取年月日时分秒
mysql> SELECT YEAR(now());
mysql> SELECT MONTH(now());
mysql> SELECT DAY(now());
mysql> SELECT HOUR(now());
mysql> SELECT MINUTE(now());
mysql> SELECT SECOND(now());

2字符串函数

sql
-- 字符串长度,以字节为单位
mysql> select length('hello');  
mysql> select length(name) as l,name from student where length(name) >5;

-- 以字符为单位长度
mysql> select char_length('你好');

-- 字符串比较大小,0表示相同,1表示前面比后面大,-1前面比后面小
mysql> select strcmp('world','hello'); 

-- 字符串合并
mysql> select concat('haah', 'aaa', 'bbb'); 

-- 字符串截取,索引从1开始
mysql> select substring('hello', 2); 

-- 第三个参数表示截取的长度
mysql> select substring('hello', 2, 2); 

-- 去除两端的空格
mysql> select trim('  hello  '); 

-- 子串的查询,返回查到的索引值,如果不存在,返回0
mysql> select instr('hello', 'el');

附录

mysql字符集编码

从mysql8版本开始,使用默认字符集是utf8mb4;

mysql8之前版本使用默认字符集是latin1,所以对于中文,需要解决中文乱码问题

mysql有六处使用了字符集,分别为:client 、connection、database、results、server 、system。 client:是客户端使用的字符集; connection:是连接数据库的字符集设置类型,如果程序没有指明连接数据库使用的字符集类型就按照服务器端默认的字符集设置; database:是数据库服务器中某个库使用的字符集设定,如果建库时没有指明,将使用服务器安装时指定的字符集设置; results:是数据库给客户端返回时使用的字符集设定,如果没有指明,使用服务器默认的字符集; server:是服务器安装时指定的默认字符集设定; system:是数据库系统使用的字符集设定

查看数据库字符集:

sql
mysql> show variables like 'char%';

5.7中修改字符集为utf8:

修改my.ini文件,在[client]和[mysqld]中增加编码设置

(参考路径:C:\ProgramData\MySQL\MySQL Server 5.7\my.ini)

properties
[client]
default-character-set=utf8

[mysqld]
character-set-server=utf8

注意:修改配置后,需要重启mysql服务。如果有些地方字符集不对,可以将my.ini文件复制到mysql安装路径下。