1 数据库介绍
数据库就是存储数据的仓库,其本质是一个文件系统,按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作。
随着互联网的高速发展,大量的数据在不断的产生,伴随而来的是如何高效安全的存储数据和处理数据,而这一问题成为了信息时代的一个非常大的问题,而使用数据库可以高效的有条理的储存数据。 可以结构化存储大量的数据; 可以有效的保持数据的一致性、完整性; 读写效率极高。
2 数据库分类
数据库又分为关系型数据库和非关系型数据库
2.1关系型数据库:指采用了关系模型来组织数据的数据库。 关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。
2.2非关系型数据库:又被称为NoSQL(Not Only SQL ),意为不仅仅是SQL,对NoSQL 最普遍的定义是“非关联型的”,强调 Key-Value 的方式存储数据。
3 sql语句
3.1 概念
sql语句是结构化查询语言, 操作关系型数据库的语言
3.2 分类
-
DDL: 定义语言 创建库,表,修改表结构
-
DML: 操作语言 对表数据进行增删改操作
-
DQL: 查询语言 计算数据(计算指标) ※※※
-
DCL: 控制语言 运维人员或主管操作 创建用户,修改用户权限
3.3 通用语法
-
可以单行或多行书写, 以分号;结尾
-
使用缩进和空格来规范书写, ctrl + atl + l
-
关键字可以大写和小写, 建议大写
-
关键字就是有特殊含义特殊作用的词 insert drop update
-
-
注释: 解释说明的内容, 被注释的内容是不会被执行的(中文,英文,特殊字符)
-
单行注释: ctrl + /
-
多行注释: ctrl + shift + /
-
3.4 数据类型
规定mysql表的列数据的存储要求
-
数值类型
-
整数类型
-
tinyint 小整数 0/1
-
int 大整数 满足大多数的正数
-
bigint 超大整数
-
-
浮点类型 带有小数点
-
float
-
double
-
decimal(m, d): m代表数值的位数, d代表小数位数 使用较多
-
-
-
日期时间类型 表中基本都会有日期时间字段(更新时间, 添加时间)
-
date: 年月日
-
time: 时分秒
-
datetime: 年月日时分秒
-
timestamp: 时间戳 当前时间减去1970-01-01 00:00:00的差值(到秒的差值)
-
-
字符串类型 存储文本,英文
-
char: 定长字符串, 指定数据的长度 char(3)
a__
手机号 身份证号 -
varchar: 变长字符串, varchar(3)
a
-
text: 长文本 文章内容
-
4 DDL语言
4.1 数据库
# 创建数据库
# create database 库名;
CREATE DATABASE bigdata_db;
# 创建数据库时,指定字符集
# 字符集: utf8 utf-8(万国码) gbk(中文)
CREATE DATABASE bigdata_db CHARSET='utf8';
CREATE DATABASE bigdata_db CHARACTER SET 'utf8';
# 如果创建的数据库存在,不需要再创建
CREATE DATABASE IF NOT EXISTS bigdata_db CHARACTER SET 'utf8';
# 查看所有数据库
SHOW DATABASES;
# 选择数据库
USE bigdata_db;
# 查看当前使用的数据库
# database():函数, 实现特定功能的代码段
SELECT database();
# 删除数据库
DROP DATABASE bigdata_db;
4.2 数据表
-
基本操作
# 创建表 create table 表名(字段名1 类型 约束1 约束2 ..., 字段名2 类型 约束1 ...)
# 注意点: 一定要指定类型,类型只有一个; 约束可有(可以有多个)可无
# COMMENT: 解释字段
# bigdata_db.category: 指定数据库中的表
USE bigdata_db;
CREATE TABLE IF NOT EXISTS bigdata_db.category
(
cid INT PRIMARY KEY COMMENT '主键id',
cname VARCHAR(30) COMMENT '类别名称'
);
# 查看所有表
SHOW TABLES;
# 查看表结构
DESC category;
# 删除表
DROP TABLE category;
-
表结构
语法:
alter table 表名 关键字 列名 类型 约束
关键字:
-
add 添加字段
-
change/modify 修改字段
-
drop 删除字段
-
rename to 重命名
-
# 添加表字段
# 注意点: 字段名和关键字重名, 需要使用 `字段名`; 如果是普通的字段名,就直接写
# 在category添加一个desc字段
ALTER TABLE category ADD `desc` VARCHAR(50);
# 在category添加一个num字段
ALTER TABLE category ADD num VARCHAR(30);
# 修改表字段
# change 旧列名 新列名 类型 约束
ALTER TABLE category CHANGE `desc` description VARCHAR(100) NOT NULL;
DESC category;
# modify 修改字段的类型约束
ALTER TABLE category MODIFY num VARCHAR(50);
# 删除表字段
# drop 字段名
ALTER TABLE category DROP description;
# 修改表名
ALTER TABLE category RENAME TO category2;
RENAME TABLE category2 TO category;
5 DML语言
5.1 插入表数据
# 插入数据 insert into
# 向指定字段中插入数据
# insert into 表名(列名1, 列名2, ...) value (值1, 值2, ...)
INSERT INTO
category (cid, cname) VALUE (1, '手机');
# 向所有字段中插入数据
INSERT INTO
category
VALUES
(2, '电脑', 10);
# 一次性插入多条数据
INSERT INTO
category (cid, cname) VALUE (3, '服装'), (4, '书籍');
INSERT INTO
category
VALUES
(5, '帽子', '100'),
(6, '水果', 'c200');
5.2 更新表数据
# update 表名 set 字段名1=新值,字段名2=新值,... where 条件
# 对cname列实现更新操作
# 如果没有where语句,是对表中cname列中的所有行值进行更新
UPDATE category
SET
cname='家电'; # 不使用
UPDATE category
SET
cname = '手机',
num = 1000
WHERE
cid = 4; # 经常使用
5.3 删除表数据
# delete from 表名 where 条件 删除满足条件的数据
# 删除cid=1数据
DELETE
FROM
category
WHERE
cid = 1;
# 删除表中所有数据, 表还会存在
# delete from 表名
# 主键自增序列不清零, 从之前最大的序列值继续递增
DELETE FROM category;
# truncate [table] 表名
# 主键自增序列清零, 又从1开始递增
TRUNCATE TABLE category;
6 sql约束
6.1 主键约束
/*
主键约束:
primary key
唯一不重复
不能包含null值
表中都会一个主键字段, 可以没有
*/
CREATE TABLE person
(
id INT PRIMARY KEY,
last_name VARCHAR(20),
first_name VARCHAR(20),
address VARCHAR(255)
);
DESC person;
# 唯一不重复 Duplicate entry '1' for key 'PRIMARY'
INSERT INTO person(id, address) VALUES (1, '昌平');
# 不能包含null值 Column 'id' cannot be null
INSERT INTO person(id, address) VALUES (NULL, '海淀');
6.2 自增约束
/*
自增约束
auto_increment
一般都是跟着主键约束后边, 自增列的数据类型是整数类型
自增列不插入数据值,会自动维护值
如果插入实际值,以插入值为准
*/
CREATE TABLE person2
(
id INT PRIMARY KEY AUTO_INCREMENT,
last_name VARCHAR(20),
first_name VARCHAR(20),
address VARCHAR(255)
);
DESC person2;
# 主键自增列,插入null值,会自动维护值, 以表中最大的值进行递增
INSERT INTO
person2 (id, address)
VALUES
(NULL, '昌平');
# 如果主键自增列有插入值,以插入值为准
INSERT INTO
person2 (id, address)
VALUES
(4, '海淀');
INSERT INTO
person2 (id, address)
VALUES
(NULL, '房山');
# 如果主键自增列没有插入值,会自动维护
INSERT INTO
person2 (last_name, first_name)
VALUES
('三', '张');
# 验证truncate清空表会清空自增序列, 从1开始
TRUNCATE person2;
INSERT INTO
person2 (last_name, first_name)
VALUES
('三', '张');
# 验证delete from 清空表不会清空自增序列, 从上次表中最大的序列值递增
DELETE FROM person2;
INSERT INTO
person2 (last_name, first_name)
VALUES
('三', '张');
6.3 非空约束
当列中不允许出现null时,需要设置非空约束; 收集一些重要的信息时
/*
非空约束
not null
非空列中的数据是不能插入null值,或者是不能不插入值(默认插入null值)
*/
CREATE TABLE person3
(
id INT PRIMARY KEY AUTO_INCREMENT,
last_name VARCHAR(20) NOT NULL, -- 非空约束
first_name VARCHAR(20) NOT NULL, -- 非空约束
address VARCHAR(255)
);
DESC person3;
# 插入null值 Column 'last_name' cannot be null
INSERT INTO person3 VALUES (1, NULL, null, NULL);
# 不插入值 Field 'last_name' doesn't have a default value
INSERT INTO person3(id, address) VALUES (2, '昌平');
INSERT INTO person3 VALUES (1, '明', '小', NULL);
# '':表示空字符串
INSERT INTO person3 VALUES (2, '红', '小', '');
6.4 唯一约束
/*
唯一约束 手机号 身份证号
unique
表中可以设置多个唯一约束
主键约束自带唯一约束, 表中只能有一个主键约束
*/
CREATE TABLE person4
(
id INT PRIMARY KEY AUTO_INCREMENT,
last_name VARCHAR(20) UNIQUE , -- 非空约束
first_name VARCHAR(20) UNIQUE , -- 非空约束
address VARCHAR(255)
);
DESC person4;
# 数据值不能重复 Duplicate entry '明' for key 'last_name'
INSERT INTO person4 VALUES (1, '明', '小', '昌平');
INSERT INTO person4 VALUES (2, '红', '大', '昌平');
6.5 默认值
/*
默认值约束
default
当不插入数据值时,是以默认值进行插入; 如果插入数据值时,就以实际值进行插入
*/
CREATE TABLE person5
(
id INT PRIMARY KEY AUTO_INCREMENT,
last_name VARCHAR(20),
first_name VARCHAR(20),
address VARCHAR(255) DEFAULT '昌平'
);
DESC person5;
INSERT INTO person5 VALUES (1, '明', '小', NULL);
INSERT INTO person5 (id, last_name, first_name) VALUES (2, '明', '小');
INSERT INTO person5 (id, last_name, first_name, address) VALUES (3, '明', '小', '海淀');