1.数据库:
- 简介:数据库就是存储和管理数据的仓库,数据按照一定的格式进行存储,用户可以对数据库中的数据进行增加、修改、删除、查询等操作。
- 分类:
(1)关系型数据库
数据库、数据表
数据存储形式:数据以行列表格的形式进行存储
常见产品:MySQL、Oracle、DB2、SQL Server、Sqlite(小型关系型数据)
(2)非关系型数据库
数据存储形式:Key-Value形式进行数据存储
常见产品:MongoDB、Redis、HBase
2.MySQL数据库:
- 简介:MySQL 是一个关系型数据库管理系统,它是由瑞典MySQL AB公司开发,目前属于 Oracle 旗下产品,MySQL 是最流行的关系型数据库管理系统之一。MySQL 数据库是 C/S 软件:分为客户端和服务器。
- 特点:
(1)MySQL是开源的,所以你不需要支付额外的费用(MySQL5以上版本已经开始收费)。
(2)MySQL支持大型的数据库。可以处理拥有上千万条记录的大型数据库。
(3)MySQL使用标准的SQL数据语言形式。
(4)MySQL可以安装在不同的操作系统,并且提供多种编程语言的操作接口。这些编程语言包括C、C++、Python、Java、Ruby等等。
(5)支持多种存储引擎。
- 安装:MySQL数据库服务端的端口:3306
# 查看 mysql 数据库的版本
mysql --version
或
mysql -V
- MySQL 登录:通过 MySQL 客户端软件连接到 MySQL 服务器,即可以对 MySQL 服务器上存储的数据进行操作。
mysql -h数据库服务端IP -P数据库服务端端口 -u用户名 -p密码
-h 后面是数据库服务端IP,默认是 127.0.0.1,该参数可以省略
-P 后面是数据库服务端端口,默认是 3306,该参数可以省略
-u 后面是登录的用户名
-p 后面是登录用户密码,如果不填写,回车之后,会提示输入密码
- MySQL 退出:
quit
或
exit
或
ctrl + d
3.DataGrip 软件:
- 简介 : DataGrip是JetBrains公司推出的管理数据库的产品,功能非常强大,可以兼容各种数据库,另外,JetBrains公司还有一款知名的IDE开发工具IDEA,用户体验非常不错。它的设计符合数据库管理员、开发人员需要。
- DataGrip基本使用:
①创建工程
②连接数据库
③DataGrip配置
④创建查询
⑤快捷键使用:Ctrl+Enter(快速执行选择的SQL语句)
4.SQL语句:
- 简介:SQL全称是结构化查询语言(Structured Query Language),是关系型数据库管理系统都需要遵循的规范,是操作关系型数据库的语言,只要是关系型数据库,都支持SQL
虽然所有的关系型数据库都支持SQL,但是不同的关系型数据库都会有一些特殊的东西(特有的函数或语法)。
- 作用:
数据库的增、删、改、查
数据表的增、删、改、查
表记录的增、删、改、查
......
- 分类:
DDL(Data Definition Language):数据定义语言,用来定义数据库对象:数据库,表,列等。
DML(Data Manipulation Language):数据操作语言,用来对数据库中表的记录进行增、删、改。
DQL(Data Query Language):数据查询语言,用来查询数据库中表的记录【核心重点!!!】
DCL(Data Control Language):数据控制语言,用来定义数据库的访问权限和安全级别,及创建用户。
- 通用语法:
(1)SQL语句可以单行或多行书写,以分号结尾;
(2)可使用空格和缩进来增强语句的可读性;
(3)MySQL数据库的SQL语句不区分大小写,关键字建议使用大写
(4)可以使用/* */
、--
、#
的方式完成注释
5.DDL数据定义语言:
- 简介:主要时负责数据库及数据表的结构设置,也就是搭建保存数据的容器,并定义存储规则的语言。
- DDL-数据库操作 :
(1)创建数据库:
# 创建数据库
CREATE DATABASE 数据库名称;
# 当数据库不存在时,创建数据库
CREATE DATABASE IF NOT EXISTS 数据库名称;
# 创建数据库并指定utf8编码
CREATE DATABASE 数据库名称 CHARSET='utf8';
(2)查看数据库:
# 显示已有的数据库
SHOW DATABASES;
(3)使用数据库:
# 使用指定数据库
USE 数据库名称;
(4)删除数据库:
# 删除指定数据库
# 注意:实际工作不要删除数据库!!!
# 注意:实际工作不要删除数据库!!!
# 注意:实际工作不要删除数据库!!!
DROP DATABASE 数据库名称;
- DDL-数据表操作:
(1)创建数据表:
CREATE TABLE 表名(
字段名1 数据类型(长度) 约束,
字段名2 数据类型(长度) 约束
...
);
# 创建表举例
CREATE TABLE category(
# 字段1名称为cid,数据类型为整型,添加主键约束及非空约束
cid INT PRIMARY KEY NOT NULL,
# 字段2名称为cname,数据类型为varchar,最大长度为100
cname VARCHAR(100)
);
-
字段名:数据表中每一列的名称(列头)
-
数据类型:数据的存储形式(结构)
-
约束:数据存储遵循的规则
(2)查看数据表和表结构:
# 查看当前数据库中已有的数据表
SHOW TABLES;
# 查看指定数据表的结构
DESC 表名;
(3)修改表名:
# 修改指定表的名称
RENAME TABLE 表名 TO 新表名;
(4)删除数据表:
# 删除指定的数据表
DROP TABLE 表名;
6.DDL数据定义语言--数据类型和约束:
- 简介:可以在创建表的时候,为表添加一些强制性的验证,比如:数据类型和约束。
- 数据类型:是指在创建表的时候为表中字段指定数据类型,只有数据符合类型要求才能存储起来,使用数据类型的原则是:够用就行,尽量使用取值范围小的,而不用大的,这样可以更多的节省存储空间。
- 常用数据类型如下:
整数:int,bit
小数:decimal
字符串:varchar,char
日期时间:date, time, datetime
枚举类型(enum)
- 数据类型说明:
①decimal表示浮点数,如 decimal(5, 2) 表示共存5位数,小数占 2 位。
②char表示固定长度的字符串,如char(3),如果填充'ab'时会补一个空格为'ab ',3表示字符数
③varchar表示可变长度的字符串,如varchar(3),填充'ab'时就会存储'ab',3表示字符数
④对于图片、音频、视频等文件,不存储在数据库中,而是上传到某个服务器上,然后在表中存储这个文件的保存路径。
⑤字符串 text 表示存储大文本,当字符大于 4000 时推荐使用, 比如技术博客。
- 数据约束是指数据在数据类型限定的基础上额外增加的要求。
- 常见的约束如下:
①主键 primary key:物理上存储的顺序。 MySQL 建议所有表的主键字段都叫 id, 类型为 int unsigned。
②非空 not null:此字段不允许填写空值。NULL表示空
③唯一 unique:此字段的值不允许重复。
④默认 default:当不填写字段对应的值会使用默认值,如果填写时以填写为准。
⑤外键 foreign key:对关系字段进行约束, 当为关系字段填写值时, 会到关联的表中查询此值是否存在, 如果存在则填写成功, 如果不存在则填写失败并抛出异常。
7.DDL数据定义语言--数据约束进阶:
(1)主键约束:
什么是主键?
-
PRIMARY KEY 约束唯一标识数据库表中的每条记录。
-
主键必须包含唯一的值。
-
主键列不能包含 NULL 值。
-
每个表都应该有一个主键,并且每个表只能有一个主键。
主键设置原则:
-
主键应当是对用户没有意义的。
-
永远也不要更新主键。
-
主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等。
-
主键应当由计算机自动生成。
主键约束操作:
# 添加主键
# 在创建数据表时添加
CREATE TABLE person(
id INT PRIMARY KEY,
last_name VARCHAR(100),
first_name VARCHAR(100),
address VARCHAR(100),
city VARCHAR(100)
);
# 在创建后添加约束(了解)
CREATE TABLE person1(
id INT,
last_name VARCHAR(100),
first_name VARCHAR(100),
address VARCHAR(100),
city VARCHAR(100)
);
# 创建表后,使用ALTER TABLE关键字添加主键
ALTER TABLE person1 ADD PRIMARY KEY (id);
# 删除主键约束
# 格式:ALTER TABLE 表名 DROP PRIMARY KEY;
ALTER TABLE person1 DROP PRIMARY KEY;
# 在创建表时添加主键自动增长
CREATE TABLE person2(
id INT PRIMARY KEY AUTO_INCREMENT,
last_name VARCHAR(255),
first_name VARCHAR(255),
address VARCHAR(255),
city VARCHAR(255)
);
# 在创建表之后添加自动增长(了解)
ALTER TABLE person2 CHANGE id INT AUTO_INCREMENT;
注意:
1)主键的值必须是唯一的。
2)在没设置主键自增之前,insert数据时,主键不能为NULL;在设置主键自增之后,insert数据时,主键位置可以为NULL,数据库会自动维护主键的值。
(2)非空约束:
NOT NULL,非空约束,即对应列不接受空NULL值。
非空约束操作:
# 非空约束 not null
# 创建表时添加非空约束
CREATE TABLE person3(
id INT NOT NULL,
last_name VARCHAR(100) NOT NULL,
first_name VARCHAR(100),
address VARCHAR(100),
city VARCHAR(100)
);
(3)唯一约束:
UNIQUE,唯一约束,即对应列的值必须唯一。
唯一约束操作:
# 唯一约束
# 在创建表时添加唯一约束
CREATE TABLE person4 (
id INT PRIMARY KEY,
last_name VARCHAR(100) UNIQUE,
first_name VARCHAR(100),
address VARCHAR(100),
city VARCHAR(100)
);
(4)默认值:
DEFAULT,默认值,插入数据时当不填写字段对应的值会使用默认值,如果填写时以填写为准。
默认值操作:
# 默认值
# 在创建表时添加默认值
CREATE TABLE person5 (
id INT PRIMARY KEY,
last_name VARCHAR(100),
first_name VARCHAR(100),
address VARCHAR(100),
city VARCHAR(100) DEFAULT '北京'
);
8.DDL数据定义语言--数据表字段操作:
1)添加表字段:
# 注意:
# 1. 约束按需求选择添加,可以没有约束,类型必须填写,并只能填写一个类型
# 2. 表字段名称不能重复,否则会出现 Duplicate column 错误
# 3. 如果列名和关键字相同,需要在列名两边加 ``
ALTER TABLE 表名 ADD 列名 类型(长度) [约束];
# 示例1
ALTER TABLE category ADD num INT NOT NULL;
# 示例2
ALTER TABLE category ADD `desc` VARCHAR(100);
2)修改表字段:
ALTER TABLE 表名 CHANGE 旧列名 新列名 类型(长度) 约束;
# 示例1
ALTER TABLE category CHANGE `desc` description VARCHAR(100);
3)删除表字段:
ALTER TABLE 表名 DROP 列名;
# 示例1
ALTER TABLE category DROP num;
9.DML数据操作语言 --表记录增、改、删:
(1)增加表记录:
# 不指定字段插入:一次性插入一行,并且指定所有列
INSERT INTO 表 VALUES(值1, 值2, 值3...);
# 指定字段插入:一次性插入一行,并且指定插入列
INSERT INTO 表 (字段1, 字段2, 字段3...) VALUES(值1, 值2, 值3...);
# 不指定字段插入:一次性添加多条记录
INSERT INTO 表 VALUES(值1, 值2, 值3...), (值1, 值2, 值3...), ...;
# 指定字段插入:一次性添加多条记录
INSERT INTO 表 (字段1, 字段2, 字段3...) VALUES(值1, 值2, 值3...), (值1, 值2, 值3...)...;
(2)更新表记录:
# 更新所有行
UPDATE 表名 SET 字段名=值, 字段名=值, ...;
# 更新满足条件的行
UPDATE 表名 SET 字段名=值, 字段名=值, ... WHERE 条件;
(3)删除表记录:
# 删除表中的所有数据:主键自增序列不清零
DELETE FROM 表名;
# 清空表数据:主键自增序列清零
TRUNCATE TABLE 表名;
# 删除表中满足条件的数据 [可以用来删除行]
DELETE FROM 表名 WHERE 条件;
(4)补充:
物理删除:DELETE FROM 就是物理删除,真的将表数据删除。
逻辑删除:数据并没有真的从表中删除,而是将数据添加了一个删除标记。
DELETE与TRUNCATE删除表数据区别:
DELETE:主键自增序列不清零
TRUNCATE:主键自增序列清零
10. DQL数据查询语言:
(1)SQL简单查询:
# 查询表中的全部数据(所有行所有列的数据)
SELECT * FROM 表名;
# 查询表中的指定列数据(所有行指定列的数据)
SELECT 列1, 列2, ... FROM 表名;
(2)SQL条件查询:
SELECT * FROM 表名 WHERE 条件;
WHERE支持的条件运算符:
- 比较运算符:
=
>
>=
<
<=
!=:不等于
<>:不等于
# 示例
SELECT * FROM product WHERE price = 800;
SELECT * FROM product WHERE price > 600;
- 逻辑运算符:
AND:与
OR:或
NOT:非
# 示例
SELECT * FROM product WHERE price >= 200 AND price <= 2000;
- LIKE模糊查询:
%:表示任意多个任意字符
_:表示任意一个任意字符
# 示例
SELECT * FROM product WHERE pname LIKE '%斯';
SELECT * FROM product WHERE pname LIKE '__斯';
- 范围查询:
BETWEEN ... AND ... 表示在一个连续的范围内查询
# 示例(包含800和2000)
SELECT * FROM product WHERE price BETWEEN 800 AND 2000;
IN 表示在一个非连续的范围内查询
# 示例
SELECT * FROM product WHERE price IN (600, 800, 2000);
- 空判断:
IS NULL:判断为空
# 示例
SELECT * FROM product WHERE category_id IS NULL;
IS NOT NULL:判断不为空
# 示例
SELECT * FROM product WHERE category_id IS NOT NULL;
11.DQL数据查询语言-排序查询:
SQL排序查询:
SELECT
*
FROM 表名
# 按照指定的列对查询的结果进行排序,默认排序方式是ASC
# ASC:ascending,表示升序
# DESC:descending,表示降序
ORDER BY 列1 ASC|DESC, 列2 ASC|DESC, ...;
SELECT * FROM product ORDER BY price DESC ,category_id ASC ;
12.DQL数据查询语言-聚合函数:
聚合函数:又叫组函数,通常是对表中的数据进行统计和计算,一般结合分组(GROUP BY)来使用,用于统计和计算分组数据。
常用的聚合函数:
-
COUNT(col):表示求指定列的总记录数
-
MAX(col):表示求指定列的最大值
-
MIN(col):表示求指定列的最小值
-
SUM(col):表示求指定列的和
-
AVG(col):表示求指定列的平均值
SELECT SUM(price) FROM product WHERE category_id="C002";
SELECT AVG(price),MAX(price),AVG(price)-MAX(price) FROM product;
注意:
-
聚合函数的计算会忽略 NULL 值。
-
例如:求四个产品的价格平均值,如果有一个价格是NULL,则忽略,求其他三个商品的平均值。
13.DQL数据查询语言-分组查询:
分组查询:就是将查询结果按照指定字段进行分组,指定字段数据值相同的分为一组。
分组查询语法:
SELECT
分组字段...,
聚合函数(字段)...
FROM 表名
GROUP BY 分组字段1, 分组字段2...
HAVING 条件表达式;
-
GROUP BY 分组字段:是指按照指定列的值对数据进行分组。
-
分组之后,可以查询每一组的分组字段,或对每组的指定列进行聚合操作。
-
HAVING 条件表达式:用来过滤分组之后的数据。
-- 将所有商品按category_id分类,获取每组的平均价格大于600的所有分组
SELECT category_id,AVG(price) FROM product GROUP BY category_id HAVING AVG(price)>600;
-- 统计各个分类商品的个数,且只显示个数大于1的信息
SELECT category_id,COUNT(*) FROM product GROUP BY category_id HAVING COUNT(*)>1;
HAVING 与 WHERE 的区别:
-
HAVING 是在分组后对数据进行过滤,WHERE 是在分组前对数据进行过滤。
-
HAVING 后面可以使用聚合函数(统计函数),WHERE后面不可以使用聚合函数。
-- 注意:分组聚合操作时,SELECT之后,除了分组字段和聚合函数可以查询,其他的不能查询(会报错)
SELECT
category_id,
pid,
MAX(price)
FROM product
GROUP BY category_id;
如果出现上面的 sql 语句不报错,执行下面的sql,关闭mysql的测试模式:
SET @@global.sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'
14.DQL数据查询语言-分页查询:
分页查询语法:
SELECT
字段列表
FROM 表名
LIMIT M, N;
-
M表示开始行索引,默认是0,代表从下标M的位置开始分页
-
N表示查询条数,即提取多少条数据
示例:
-- 示例1:获取 product 表中的第一条记录
SELECT * FROM product LIMIT 0, 1;
-- 示例2:获取 product 表中下标为2记录开始的2条记录
SELECT * FROM product LIMIT 2, 2;
-- 示例4:当分页展示的数据不存在时,不报错,只不过查询不到任何数据
SELECT
*
FROM product
WHERE category_id = 'c002'
ORDER BY price
LIMIT 25, 2; -- 没有第26行,但是结果不会报错,只是没有查询结果
SELECT
...,
聚合函数
FROM 表名
WHERE 条件
GROUP BY 分组字段
HAVING 条件
ORDER BY 排序字段
LIMIT M, N;