一、什么是数据库?
- 用于存储和管理数据的仓库
- 英文单词为:DataBase,简称DB
二、数据库的好处?
- 可以持久化存储数据
- 方便存储和管理数据
- 使用了统一的方式操作数据库--SQL
三、数据库、数据表、数据的关系介绍?
数据库
- 用于存储和管理数据的仓库
- 一个库中可以包含多个数据表
数据表
- 数据库最重要的组成部分之一
- 它由纵向的列和横向的行组成类似(excel表格)
- 可以指定列名、数据类型、约束
数据
- 想要永久存储的数据
四、SQL通用语法
- SQL语句可以单行或多行书写,以分号结尾
- 可以使用空格和缩进来增强语句的可读性
- MySQL数据库的SQL语句不区分大小写,关键字建议使用大写
- 数据库的注释:单行注释 --注释内容 #注释内容(mysql特有) 多行注释:/*注释内容*/
五、SQL分类
-
DDL(Data Definition Language)数据定义语言
- 用来定义数据库对象:数据库、表、列等,关键字:create、drop、alter等
-
DML(Data Manipulation Language)数据操作语言
- 用来对数据库中表的数据进行增删改。关键字:insert、delete、update等
-
DQL(Data Query Language)数据查询语言
- 用来查询数据库中表的记录(数据)。关键字:select、where等
-
DCL(Data Control Language)数据控制语言
- 用来定义数据库的访问权限和安全级别,及创建用户,关键字:GRANT,REVOKE等
六、DDL-操作数据库
-
R(Retrieve):查询
--查询所有数据库
SHOW DATABASES;
--查询某个数据库都创建语句
SHOW CREATE DATABASE 数据库名称;
--查看mysql数据库的创建格式
SHOW CREATE DATABASE mysql;
-
C(Create):创建
--创建数据库
CREATE DATABASE 数据库名称;
--创建student数据库(重点)
CREATE DATABASE student;
--先判断数据是否存在,不存在数据库在创建(重点)
CREATE DATABASE IF NOT EXISTS student;
--先判断,在创建,同时指定字符集
CREATE DATABASE IF NOT EXISTS student CHARACTER SET utf8_mb4;
-
U(update):修改
--修改数据库的字符集
#ALTER DATABASE 数据库名称 CHARACTER SET 字符集名称
ALTER DATABASE student CHARACTER SET utf8;
-
D(Delete):删除
--删除数据库(重点)
#DROP DATABASE 数据库名称;
DROP DATABASE student;
--删除数据库(先判断存在,再删除)(重点)
#DROP DATABASE IF EXISTS 数据库名称;
DROP DATABASE IF EXISTS student;
-
使用数据库
--查询当前正在使用的数据库
SELECT DATABASE();
--使用数据库(重点)
#USE 数据库名称;
USE student;
七、DDL-操作数据表
-
C(Create):创建
--创建数据表
--CREATE TABLE 表名(
-- 列名1 数据类型1,
-- 列名2 数据类型2,
-- ......
-- 列名n 数据类型n
--);
CREATE TABLE student(
id INT,
name VARCHAR(20),
age INT,
address VARCHAR(40)
);
-
数据类型
- int: 整数类型
- double:小数类型 double(5,2)
- date:日期,只包含年月日 yyyy-MM-dd
- datetime:日期,包含年月日时分秒 yyyy-MM-dd HH:mm:ss
- timestamp:时间戳类型 包含年月日时分秒 yyyy-MM-dd HH:mm:ss
- varchar:字符串 varchar(20)
-
R(Retrieve):查询
--使用mysql数据库
USE mysql;
--查询数据库中所有的数据表
SHOW TABLES;
--查询student表结构
DESC student;
--查询表的详细信息
SHOW TABLE STATUS FROM 库名 LIKE '表名';
--查询mysql数据库中student表的详细信息
SHOW TABLE STATUS FROM mysql LIKE 'student';
-
复制表
--语法(重点)
CREATE TABLE 表名 LIKE 被复制的表名;
--复制student表到user表
CREATE TABLE student LIKE user;
-
删除表
--删除表 语法(重点)
DROP TABLE 表名;
--删除student表
DROP TABLE student;
--删除表存在则删除 语法
DROP TABLE IF EXISTS 表名;
--删除student表,如果存在则删除
DROP TABLE IF EXISTS student;
--删除一个字段 语法
ALTER TABLE 表名 DROP 列名;
--删除age字段
ALTER TABLE user DROP age;
-
U(Update):修改
--修改表名 语法
ALTER TABLE 表名 RENAME TO 新的表名;
--修改student表名为user表
ALTER TABLE student RENAME TO user;
--修改表的字符集 语法
ALTER TABLE 表名 CHARACTER SET 字符集名称;
--修改user数据表字符集为gbk;
ALTER TABLE user CHARACTER SET gbk;
--修改字段名数据类型 语法
ALTER TABLE 表名 MODIFY 列名 新数据类型;
--修改user表中sex属性
ALTER TABLE user MODIFY sex varchar(3);
--修改字段名称和数据类型 语法
ALTER TABLE 表名 CHANGE 列名 新列名 新数据类型;
--修改user表中列名为sex数据类型为Varchar 改为 列名为gender 数据类型为int
ALTER TABLE user CHANGE sex gender int;
--查看mysql数据库中user数据表字符集
SHOW TABLE STATUS FROM mysql LIKE 'user';
-
添加
--添加一列 语法
ALTER TABLE 表名 ADD 列名 数据类型;
--给user数据表添加一列
ALTER TABLE user ADD sex VARCHAR(4);
八、DML-(INSERT,UPDATE、DELETE语句)
-
新增表数据语法
--给指定列添加数据 语法
INSERT INTO 表名(列名1,列名2,....) VALUES (值1,值2,....);
--向user表添加指定列数据
INSERT INTO user(id,name,age,sex) VALUES (1,'苏苏',18,'女孩');
--默认给全部列添加数据 语法
INSERT INTO user values (值1,值2,值3,...);
--向user表中添加数据
insert into user values (1,'火灵儿',18,'女孩');
--向user表中添加多条数据
insert into user values (1,'火灵儿',18,'女孩'),(1,'涂山红红',18,'女孩');
--查看表中所有数据 语法
SELECT * FROM 表名;
--查看user表中所有数据
select * from user;
-
修改表数据语法
--修改表数据语法
UPDATE 表名 SET 列名1 = 值1,列名2 = 值2,...[where 条件];
--修改id为1的学生性别为女孩
update user set sex='女孩' where id = 1;
--不写where条件就是修改表中所有数据
-
删除表数据语法
--语法
DELETE FROM 表名 [WHERE 条件];
--删除user表中的19岁的信息
delete from user where age = 19;--注意删除语句必须加条件,如果不加条件则将所有数据删除
九、DQL-单表查询
-
查询语法
select
字段列表
from
表名列表
where
条件列表
group by
分组字段
having
分组之后的条件
order by
排序
limit
分页限定
-
表查询
#查询语法(查询user表所有数据)
select * from user;
#多字段查询
select id,name,age from user;
-
去除重复查询(注意只有全部重复的才可以去除)
#去除重复查询 DISTINCT:去重
SELECT DISTINCT name,age FROM user;
-
计算列的值(四则运算)
/*
计算列的值
标准语法:
SELECT 列名1 运算符(+ - * /) 列名2 FROM 表名;
如果某一列为null,可以进行替换
ifnull(表达式1,表达式2)
表达式1:想替换的列
表达式2:想替换的值
*/
#在学生原有年龄上+10
SELECT id,name,age+10,sex,stu_time FROM user;
#IFNULLIFNULL(age,0) 对age判断null,如果age值有null就为0
select id,name,IFNULL(age,0)+10,sex,stu_time FROM user;
-
起别名
#标准语法
SELECT 列名1,列名2,... AS 别名 FROM 表名;
#起别名
SELECT
id AS 学生id,
name AS 姓名,
age AS 年龄,
sex AS 性别,
stu_time AS 出生日期
FROM
user;
-
条件查询
-
条件分类
符号 功能 > 大于 < 小于 >= 大于等于 <= 小于等于 = 等于 <> 或 != 不等于 BETWEEN ... AND ... 在某个范围之内(都包含) IN(...) 多选一 LIKE 占位符 模糊查询 _单个任意字符 %多个任意字符 IS NULL 是NULL IS NOT NULL 不是NULL AND 或 && 并且 OR 或 || 或者 NOT 或 ! 非,不是
2.条件查询语法
#标准语法
SELECT 列名 FROM 表名 WHERE 条件;
#查询年龄在大于18的
SELECT * FROM user WHERE age > 18;
#查询姓名为苏沐橙的
SELECT * FROM user WHERE name = '苏沐橙';
#查询年龄在18到20之间的
SELECT * FROM user WHERE age >= 18 AND age <= 20;
SELECT * FROM user WHERE age BETWEEN 18 AND 20;
#查询学生id为1,2,4,6的学生数据
SELECT * FROM user WHERE id=1 OR id=2 OR id=4 OR id=6;
SELECT * FROM user WHERE id IN(1,2,4,6);
#查询age为null的
SELECT * FROM user WHERE age IS NULL;
#查询age不为null的
SELECT * FROM user WHERE age IS NOT NULL;
#查询以叶开头的学生信息 %是不限定字符数量 _是限定一个字符
SELECT * FROM user WHERE name LIKE '叶%';
#查询姓名第二个字是沐的
SELECT * FROM user WHERE name LIKE '_沐%';
#查询姓名为两个字的学生信息
SELECT * FROM user WHERE name LIKE '__';
#查询姓名包含灵的学生信息
SELECT * FROM user WHERE name LIKE '%灵%';
-
聚合函数(将一列数据作为一个整体,进行纵向的计算 ) 聚合函数分类
函数名 功能 count(列名) 统计数量(一般选用不为null的列) max(列名) 最大值 min(列名) 最小值 sum(列名) 求和 avg(列名) 平均值
-
聚合函数语法
-- 标准语法
SELECT 函数名(列名) FROM 表名 [WHERE 条件];
#计算user表中总记录条数
SELECT COUNT(*) FROM user;
SELECT COUNT(1) FROM user;
SELECT COUNT(name) FROM user;
#获取最高年龄
SELECT MAX(age) FROM user;
#获取最高年龄的学生姓名
SELECT name,
age
FROM
USER
WHERE
age = ( SELECT MAX( age ) FROM USER );
#获取最低年龄
SELECT MIN(age) FROM user;
#获取最底年龄的学生姓名
SELECT name,age FROM user WHERE age=(SELECT MIN(age) FROM user);
#获取总年龄
SELECT SUM(age) FROM user;
#获取女孩的总年龄
SELECT SUM(age) FROM user WHERE sex='女孩';
#获取学生的平均年龄
SELECT AVG(age) FROM user;
#获取女孩学生的平均年龄
SELECT AVG(age) FROM user WHERE sex='女孩';
-
排序查询
1、排序分类(注意:多个排序条件,当前边的条件值一样时,才会判断第二条件 )
关键词 功能 ORDER BY 列名1 排序方式1,列名2 排序方式2 对指定列排序,ASC升序(默认的) DESC降序
2、排序语法
-- 标准语法
SELECT 列名 FROM 表名 [WHERE 条件] ORDER BY 列名1 排序方式1,列名2 排序方式2;
#按照年龄升序
SELECT * FROM user ORDER BY age ASC;
#查询性别为女孩的学生,按照年龄降序排序
SELECT * FROM user WHERE sex='女孩' ORDER BY age DESC;
#查询姓名中包含灵的学生信息,按照年龄降序排序
SELECT * FROM user WHERE name LIKE '%灵%' ORDER BY age DESC;
-
分组查询
-- 标准语法
SELECT 列名 FROM 表名 [WHERE 条件] GROUP BY 分组列名 [HAVING 分组后条件过滤] [ORDER BY 排序列名 排序方式];
#按照性别分组,获取每组总年龄
SELECT sex,SUM(age) FROM user GROUP BY sex;
#对年龄大于16的学生信息,按照性别分组,获取每组的总年龄,只显示总年龄大于50的
SELECT sex,SUM(age) AS 年龄 FROM user WHERE age > 16 GROUP BY sex HAVING 年龄 > 50;
#对年龄大于16的学生信息,按照性别分组,获取每组的总年龄,只显示总年龄大于40的,并且按照总年龄升序
SELECT sex,SUM(age) AS 年龄 FROM user WHERE age > 16 GROUP BY sex HAVING 年龄 > 40 ORDER BY 年龄 ASC;
-
分页查询
-- 标准语法
SELECT 列名 FROM 表名 [WHERE 条件] GROUP BY 分组列名 [HAVING 分组后条件过滤] [ORDER BY 排序列名 排序方式] LIMIT 开始索引,查询条数;
-- 公式:开始索引 = (当前页码-1) * 每页显示的条数
#每页显示两条信息
SELECT * FROM user LIMIT 0,2; -- 第一页 开始索引=(1-1) * 2
SELECT * FROM user LIMIT 2,2; -- 第二页 开始索引=(2-1) * 2
SELECT * FROM user LIMIT 4,2; -- 第三页 开始索引=(3-1) * 2
SELECT * FROM user LIMIT 6,2; -- 第四页 开始索引=(4-1) * 2
十、约束
-
约束的概念
1、对表中的数据进行限定,保证数据的正确性,有效性,完整性。
-
约束的分类
约束 说明 PRIMARY KEY 主键约束 PRIMARY KEY AUTO_INCREMENT 主键、自动增长 UNIQUE 唯一约束 NOT NULL 非空约束 FOREIGN KEY 外键约束 FOREIGN KEY ON UPDATE CASCADE 外键级联更新 FOREIGN KEY ON DELETE CASCADE 外键级联删除
-
主键约束
1、主键约束特点
1.主键约束包含:非空和唯一两个功能
2.一张表只能有一个列作为主键
3.主键一般用于表中数据的唯一标识
-
添加主键约束
-- 标准语法
CREATE TABLE 表名(
列名 数据类型 PRIMARY KEY, #PRIMARY KEY 主键
列名 数据类型,
....
);
-- 创建stu表主键默认唯一,默认非空
CREATE TABLE stu(
id INT PRIMARY KEY, -- 给id添加主键约束
name VARCHAR(6),
age INT
);
-- 在表外添加主键
-- 标准语法
ALTER TABLE 表名 MODIFY 列名 数据类型 PRIMARY KEY;
-- 添加主键
ALTER TABLE stu MODIFY id INT PRIMARY KEY;
-
删除主键
-- 标准语法
ALTER TABLE 表名 DROP PRIMARY KEY;
-- 删除主键
ALTER TABLE stu DROP PRIMARY KEY;
-
添加外键
-- 表里外键约束
CREATE TABLE user(
id INT auto_increment PRIMARY KEY,
name VARCHAR(6),
sex VARCHAR(4),
age INT,
sid INT
);
-- 表外外键约束
ALTER TABLE user ADD CONSTRAINT sfid FOREIGN KEY (sid) REFERENCES stu(id);
-
删除外键约束
-- 删除外键约束 语法
ALTER TABLE 表名 DROP FOREIGN KEY 外键名;
ALTER TABLE user DROP FOREIGN KEY sfid;
-
外键的级联更新和级联删除
1、什么是级联更新和级联删除
当我想把user用户表中的某个用户删掉,我希望该用户所有的订单也随之被删除
当我想把user用户表中的某个用户id修改,我希望订单表中该用户所属的订单用户编号也随 之修改
-
添加级联更新和级联删除
-- 添加外键约束,同时添加级联更新 标准语法 ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主键列名) ON UPDATE CASCADE; -- 添加外键约束,同时添加级联更新 ALTER TABLE user ADD CONSTRAINT sfid FOREIGN KEY (sid) REFERENCES stu(id) ON UPDATE CASCADE; -- 添加外键约束,同时添加级联删除 标准语法 ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主键列名) ON DELETE CASCADE; ALTER TABLE user ADD CONSTRAINT sfid FOREIGN KEY (sid) REFERENCES stu(id) ON DELETE CASCADE; -- 添加外键约束,同时添加级联更新和级联删除 标准语法 ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主键列名) ON UPDATE CASCADE ON DELETE CASCADE; ALTER TABLE user ADD CONSTRAINT sfid FOREIGN KEY (sid) REFERENCES stu(id) ON UPDATE CASCADE ON DELETE CASCADE;
十一、多表设计
- 一对一(人和身份证。一个人只有一个身份证,一个身份证只能对应一个人 )
- 实现原则 (在任意一个表建立外键,去关联另外一个表的主键 )
- 一对多(用户和订单。一个用户可以有多个订单! )
- 实现原则 (在多的一方,建立外键约束,来关联一的一方主键 )
- 多对多(学生和课程。一个学生可以选择多个课程,一个课程也可以被多个学生选择! )
- 实现原则 (需要借助第三张表中间表,中间表至少包含两个列,这两个列作为中间表的外键,分别关联两张表的主键 )
十二、多表查询
-
内连接查询
内连接查询的是两张表有交集的部分数据(有主外键关联的数据)
-- 标准语法
SELECT 列名 FROM 表名1 [INNER] JOIN 表名2 ON 条件;
-- 显示内连接
SELECT * FROM user INNER JOIN stu ON `user`.id = stu.id;
-- 标准语法
SELECT 列名 FROM 表名1,表名2 WHERE 条件;
-- 隐式内连接
SELECT s.name,s.age,s.sex,o.name FROM stu s,`user` o WHERE s.id = o.id;
-
外连接查询
-- 标准语法 左外连接 SELECT 列名 FROM 表名1 LEFT [OUTER] JOIN 表名2 ON 条件; -- 左连接 OUTER 可要/不要 SELECT * FROM stu s LEFT OUTER JOIN user u ON s.id = u.id; --标准语法 右外连接 SELECT 列名 FROM 表名1 RIGHT [OUTER] JOIN 表名2 ON 条件; -- 右连接 SELECT s.`name`,s.sex,u.`name`,u.sex FROM stu s RIGHT OUTER JOIN user u ON s.id=u.sid;
-
多表查询-子查询(查询语句中嵌套了查询语句。我们就将嵌套查询称为子查询 )
-- 标准语法
SELECT 列名 FROM 表名 WHERE 列名=(SELECT 聚合函数(列名) FROM 表名 [WHERE 条件]);
#查询user表中年龄最高,查询姓名,性别,年龄
SELECT `name`,sex,age FROM user WHERE age = (SELECT MAX(age) FROM user);
#查询年龄大于19的stu表和user表的信息
SELECT * FROM user u JOIN (SELECT * FROM stu WHERE age > 19) s WHERE u.sid = s.id;