数据库
概述
-
数据库(DataBase)为了方便数据的存储和管理,它将数据按照特定的规则存储在磁盘上,就是一个存储数据的仓库。通过数据库管理系统,可以有效的组织和管理存储在数据库中的数据。
-
数据库的相关概念
- DB:数据库(DataBase)
存储数据的容器,它保存了一系列有组织的数据。 - DBMS:数据库管理系统(DataBase Management System)
又称为数据库软件或数据库产品,用于创建或管理DB。 - SQL:结构化查询语言(Structure Query Language)
用于和数据库通信的语言,不是某个数据库软件特有的,而是几乎所有的
主流数据库软件通用的语言
- DB:数据库(DataBase)
-
数据库的划分:
数据库根据不同的存储类型可以分为:
-
关系型数据库
关系型数据库管理系统称为RDBMS,R指Relation
Oracle:功能强大,收费. MySQL 快捷、可靠 开源、免费
SQL Server(微软): 只能安装在Windows操作系统
DB2 (IBM):适合处理海量数据,收费. -
非关系型数据库
MongdoDB
Redis
-
Mysql数据库
安装SQLyog 可视化客户端工具
-
MYSQL语法规范
- 不区分大小写,建议关键字大写,表名,列名小写
- 每句话用 ;
-
注释:
● 单行注释:#注释文字
● 单行注释:-- 注释文字(要有空格)
● 多行注释:/* 注释文字 */
SQL
- 结构化查询语言(Structured Query Language)简称SQL,是一种特殊
目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以
及查询、更新和管理关系数据库系统。 - SQL优点:
不是某个特定数据库供应商专有的语是言,几乎所有DBMS都支持SQL
简单易学
实际上强有力的语言,灵活使用可以进行非常复杂和高级的数据库操作
DDL
数据(结构)定义语言DDL(Data Definition Language),是用于创
建和修改数据库表结构的语言。
-
常用的语句:create ,alter,drop,rename
-
创建,删除数据库
创建数据库并设置编码格式
CREATE DATABASE [if not exists] 数据库名 [ CHARSET utf8]
删除数据库
DROP DATABASE 数据库名 / [IF EXISTS数据库名]
修改字符集
ALTER DATABASE 数据库名 CHARSET gbk
-- 注释
-- 创建数据库 并设置字符集编码
CREATE DATABASE schooldb CHARSET utf8
-- 创建数据库 并判断是否存在 设置字符集
CREATE DATABASE IF NOT EXISTS schooldb CHARSET utf8
-- 删除数据库
DROP DATABASE schooldb
-- 修改数据库字符集 注意mysql中不支持修改数据库名
ALTER DATABASE schooldb CHARSET utf8
-- 设计并创建表
-- 确定表名 学生信息表
-- 确定列名 学号,姓名,性别,生日,身高,电话,地址,注册时间
-- 字符类型是需要给定长度的
-- 数据类型 char(4) 定长(长度是固定的 例如给定长度是4,即使存储了一个字符,仍占4个长度)
-- varchar(4) 最大存储4个字符,如果只存储了1个字符,那么就占1个长度
-- date 年月日
-- datetime 年月日 时分秒
-- 整数 5 TINYINT 1 SMALLINT 2 MEDIUMINT 3 INT 4 BIGINT 8
-- 浮点数 float 4 double 8
-- BLOB(大容量可以用来存储图片) text(大容量的字符串)例如新闻,小说
-- 创建一个基本的没有任何约束的表结构
CREATE TABLE student(
NO INT,
NAME VARCHAR(6),
gender CHAR(1),
birthday DATE,
height FLOAT(3,2),
phone VARCHAR(15),
address VARCHAR(30),
reg_time DATETIME
)
数据库存储数据的特点
- 将数据放入表中,表放到库中
- 一个数据库中可以有多个表,每个表都有一个名字,用来标识自己。表名具有唯一性。
- 表具有一些特性,这些特性定义了数据在表中如何存储,类似java中的“类” 的设计。
- 表由列组成,我们也称列为字段。所有表都由一个或多个列组成,每一列类似java中的“属性”
- 表中的数据是按行存储,每一行类似java中的"对象"
设计表
-
对于具体的某一个表,在创建之前,需要确定表的以下特征:
-
表名(表信息)
-
表中的字段
-
字段的数据类型和长度
-
哪些约束
数据类型
- 整数类型
类型 字节 最小值 最大值
TINYINT 1 -128 127
SMALLINT 2 -32768 32767
MEDIUMINT 3 -8388608 8388607
INT 4 -2147483648 2147483647
BIGINT 8 -9223372036854775808 9223372036854775807
- 浮点
类型 字节
float 4
double 8
数据类型(M,D)
M : 精度 , 数据的总长度
D : 标度 , 小数点后的长度
Float(6,2)、 Double(6,2)
-
BLOB是一个二进制大对象,可以容纳可变数量的数据,用于存储图片视频信息. 有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们只是可容纳值的最大长度不同。
-
TEXT列字符字符串
有4种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。
它们(TEXT和BLOB同)的长度:- Tiny:最大长度255个字符(2^8-1)
- BLOB或TEXT:最大长度65535(2^16-1)
- Medium:最大长度16777215(2^24-1)
- Long 最大长度4294967295(2^32-1)
-
主键:
在一张表中代表唯一的一条记录,不能为空,不能重复
-
约束:
PRIMARY KEY 设置主键约束 NOT NULL 不能为空约束 UNIQUE 唯一性约束 检查约束 设置条件 外键约束 主键自动增长 AUTO_INCREMENT 默认值 DEFAULT default_value 字段注释: comment '注释'
- 创建表语法:
-- 创建表,并为表添加约束 -- 主键约束: 每张表可以添加一个主键约束,不能为空,不能重复,可以表示表中唯一的一条记录 -- 不能为空约束: 值不能为空 主键一张表只能有一个 不能为空,不能重复可以是多个列 -- 唯一约束: 值不能重复 -- 检查约束(自定义条件) -- 外键约束(多表关联) -- mysql 支持主键自动增长AUTO_INCREMENT 要设置自增,必须是整数类型 CREATE TABLE student( NO INT PRIMARY KEY AUTO_INCREMENT COMMENT "学号主键", NAME VARCHAR(6) NOT NULL COMMENT '姓名', gender CHAR(1) DEFAULT '男', birthday DATE COMMENT '生日', height FLOAT(3,2) CHECK(height<2.5), phone VARCHAR(15) NOT NULL UNIQUE COMMENT '电话', address VARCHAR(30), reg_time DATETIME ) -- 删除表 删除表结构,表中数据也就没有了 DROP TABLE IF EXISTS student -- 修改表名 RENAME TABLE stu TO student -- 复制表结构 数据进行备份的时候创建一个相同结构的临时表 CREATE TABLE stu LIKE student
DML
● 数据操纵语言DML(Data Manipulation Language)
● 常用语句: insert,delete,updat
插入数据
- 方式1: INSERT INTO 表名(列1,列2……,列n) VALUES(值1,值2……,值n);
- 方式2: INSERT INTO 表名 set 列名1=值1,…列名n=值n;
- 方式3: INSERT INTO 表名(列1,列2……,列n) VALUES(值1,值2……,值n),(值1,值2……, 值n);
- 方式4:INSERT INTO 表名(列1,列2……,列n) 查询语句(查询的列数与插入列数匹配)
-- 向数据库插入数据 no是自动增长的,不需设置值
INSERT INTO student(NAME,gender,birthday,height,phone,address,reg_time)
VALUE('赵六','男','2000-1-1',1.77,'15666663333','西安',NOW())
INSERT INTO student SET NAME='丽丽',gender='女',phone='1893333000',reg_time=NOW()
INSERT INTO student(NAME,gender,birthday,height,phone,address,reg_time)
VALUES('jim','男','2000-1-1',1.57,'15666663322','西安',NOW()),
('tom','男','2000-1-1',1.67,'15666663366','西安',NOW())
-- 将查询中的结果插入到指定的表中
INSERT INTO stu(NO,NAME,gender,phone) SELECT NO,NAME,gender,phone FROM student
修改数据
UPDATE 表名 SET 列名 = ‘新值’WHERE 条件
UPDATE stu SET birthday='2001-2-2',height='1.55',address='陕西'
UPDATE student SET birthday='2001-2-2',height='1.55',address='陕西' WHERE NO=6
删除数据
DELETE FROM 表名 WHERE 条件
TRUNCATE TABLE 表名;清空整张表
DELETE FROM stu -- 删除表中的数据
DROP TABLE stu -- 删除表结构
DQL
- DQL(Data Query Language)数据查询语言查询是使用频率最高的一个操作可以从一个表中查询数据,也可以从多个表中查询数据
基础查询
- select 查询列表 from 表名;
查询列表可以是:表中的字段、常量、表达式、函数
查询的结果是一个虚拟的表格
-
查询结果处理:
-
查询常量值 select 100;
-
查询表达式 select 100*98
-
查询函数: select 函数/ 例如:version()
特定列查询: select column1 , column2 from table
全部列查询:select * from table
排除重复行:select distinct column1 , column2 from table
算数运算符: ±*/
-- 基本查询语法 -- select 查询的列 from 表名 where 条件 分组 分组后条件 排序 行数限制 -- 子查询 -- 查询学生表中所有的学生信息 SELECT * FROM student -- 查询所有学生学号,姓名,性别 SELECT NO,NAME,gender FROM student -- 查询的结果是一个虚拟的表格,是不能对它进行操作的 -- 查询结果进行处理 查询所需要的列名(建议) 一般不建议使用* 与查询效率是相关的 SELECT NO,NAME,gender FROM student SELECT 100,NO,NAME FROM student SELECT 100,NO+100,NAME FROM student -- 查询结果中可以出现常量,可以进行算数运算, 注意+ 不能用作字符串连接 SELECT 100,NO+100,CONCAT('姓名:',NAME) FROM student -- 去除重复数据(结果中所有的列都相同才是重复) SELECT DISTINCT NAME,gender FROM student
-
函数:类似java中的方法,将一组逻辑语句事先在数据库中定义好,可以直接调用,可以隐藏事先细节,提高代码的重用性
select 函数名(实参列表)[from 表]
-
分类:
- 单行函数:如concat、length、ifnull等
- 分组函数:做统计使用,又称为统计函数、聚合函数、组函数
-
单行函数
-- 查询结果处理--单行函数(会对查询的每一行进行处理)
-- 字符函数
-- length(列名)-以字节为单位 CHAR_LENGTH(列名)-- 字符为单位
SELECT LENGTH(NAME),CHAR_LENGTH(NAME) FROM student
-- CONCAT(str1,str2,...) 连接多个字符串
SELECT CONCAT(NAME,":",gender) FROM student
-- 转大写 转小写
SELECT UPPER(NAME),LOWER(NAME) FROM student
-- substring(列,开始位置,长度) 开始位置最小是1
SELECT SUBSTRING(NAME,1,2)FROM student
-- instr(列名,'查找的字符') 查找指定字符首次出现的位置
SELECT INSTR(NAME,'i') FROM student
-- trim(列名)去除前后空格 trim(子串 from 列名) 去掉前后指定的子串
SELECT CHAR_LENGTH(TRIM(NAME)) FROM student
SELECT TRIM('a' FROM NAME) FROM student
-- lpad(列,长度,填充内容)
SELECT LPAD(NAME,5,'a'), RPAD(NAME,5,'b')FROM student
-- repalce(列名,'old','new')
SELECT REPLACE(NAME,'i','M')AS NAME FROM student
-- 逻辑函数
SELECT NO,
NAME,
gender,
(CASE WHEN height>=1.70 THEN '高个子' ELSE '非高个子' END)AS height
FROM student
-- (case when 条件 then 条件成立执行 else 不成立执行 end) as 别名
-- (case when 条件1 then 条件1成立执行 when 条件2 then 条件2成立执行 else 不成立执行 end) as 别名
SELECT NO,
NAME,
gender,
(CASE WHEN height>=1.80 THEN '大高个子'
WHEN height>=1.70 THEN '高个子'
ELSE '非高个子' END)AS height
FROM student
-- IFNULL(列,'默认值') 列为null时,给予默认值
SELECT
NO,
NAME,
gender,
IFNULL(height,'暂未录入')height
FROM
student
SELECT
NO,
NAME,
gender,
IF(height>=1.70,'高个子','非高个子')height
FROM
student
-- 数学函数
SELECT ROUND(height)height FROM student -- 四舍五入
SELECT CEIL(height)height,FLOOR(height) FROM student -- floor 向下取整 cell向上取整
-- truncate(列,位数) 截断 保留指定的位数 不会进位,舍去
SELECT TRUNCATE(height,1)height FROM student
-- mod(被除数,除数)取余 rand() 返回0-1之间的随机数
SELECT MOD(10,3),RAND() FROM student
-- 日期函数
-- NOW()年月日时分秒,CURDATE(年月日,CURTIME()时分秒
SELECT NAME,gender,NOW(),CURDATE(),CURTIME() FROM student
SELECT NAME,gender,YEAR(reg_time),MONTH(reg_time),DAY(reg_time) FROM student
-- 字符串转日期
SELECT STR_TO_DATE('2001-10-10','%Y-%m-%d') FROM student
-- 日期格式为指定格式的字符串
SELECT DATE_FORMAT(reg_time,'%Y')FROM student
SELECT DATE_FORMAT(reg_time,'%Y-%m')FROM student
-- 计算两个日期之间相差的天数
SELECT DATEDIFF(NOW(),'2022-1-1') FROM student
-- 分组函数(往往和分组函数一同使用) 统计函数/聚合函数(多变一)
-- sum 求和、avg 平均值、max 最大值、min 最小值、count计数(非空)
-- 统计数据量
SELECT COUNT(*) FROM student
-- 求和 只能处理数值型
SELECT SUM(height) FROM student
-- 平均值 只能处理数值型
SELECT AVG(height) FROM student
-- max(列) min(列)
SELECT MAX(height),MAX(NAME),MIN(height),MIN(NAME) FROM student
分组函数
-- 查询条件
-- select * from student where 条件
SELECT * FROM student WHERE gender = '男'
SELECT * FROM student WHERE gender != '男'
SELECT * FROM student WHERE gender <> '男' -- <>不等于
SELECT * FROM student WHERE height>1.60
-- and 且 多个条件同时成立
SELECT * FROM student WHERE gender = '男' AND height>1.70
-- or 或 成立一个条件即可
SELECT * FROM student WHERE gender = '男' OR height>1.70
SELECT * FROM student WHERE height IN(1.79,1.90)
SELECT * FROM student WHERE height IS NOT NULL
-- like '基本字符%' %模糊匹配任意位数
SELECT * FROM student WHERE NAME LIKE '%三%'
-- like '基本字符_' _匹配单个字符 __
SELECT * FROM student WHERE NAME LIKE '张__'
SELECT * FROM student WHERE height >= 1.60 AND height<=1.90
SELECT * FROM student WHERE height BETWEEN 1.60 AND 1.90
-- union 合并多条查询的结果,会去除重复数据
-- union all 合并多条查询的结果 不会去除重复的数据 效率高
SELECT * FROM student WHERE gender = '男'
UNION
SELECT * FROM student WHERE height>1.50
SELECT * FROM student WHERE gender = '男'
UNION ALL
SELECT * FROM student WHERE height>1.50
-- 排序 默认主键 升序排序
SELECT * FROM student
-- order by 列名 默认是升序排序
SELECT * FROM student ORDER BY reg_time
-- order by 列名 desc 降序排序 asc 升序排序
SELECT * FROM student ORDER BY reg_time DESC,height ASC
-- 数量限制 limit 开始的位置从0开始,数量
-- 实现分页功能
SELECT * FROM student LIMIT 0,4
SELECT * FROM student LIMIT 4,4
SELECT
*
FROM
student
WHERE gender = '男'
ORDER BY reg_time DESC
LIMIT 0, 1
-- 分组查询 把条件相同数据分到一个组中
-- 查询男生和女生分别有多少人 需要按性别进行分组 然后统计数量
SELECT gender,COUNT(*),SUM(height) FROM student GROUP BY gender
SELECT birthday,COUNT(*) FROM student GROUP BY birthday
-- 分组后的条件查询
-- where 条件 对原始表中的数据进行条件筛选
-- having 条件 对分组后的数据进行条件筛选
SELECT
gender,
COUNT(*) AS c
FROM
student
WHERE NO >= 1
GROUP BY gender
HAVING c > 2
子查询
/*
子查询
出现在其他语句中的select语句 称为子查询/内查询
按子查询出现的为:
select 语句中子查询 只支持标量查询 使用的较少
form 语句中子查询 表子查询
where 语句中子查询 标量子查询,列子查询,行子查询
按功能、结果集的行列数不同:
标量子查询(结果集只有一行一列)
列子查询(结果集只有一列多行)
行子查询(结果集有一行多列)(较少)
表子查询(结果集一般为多行多列)
*/
-- 在select后面 使用子查询
SELECT NO,gender,(SELECT NAME FROM student st WHERE st.no = s.no ) FROM student s
-- 在from后面使用子查询 把一个查询的结果可以当做一张表 继续作为数据源查询
SELECT * FROM (SELECT gender,COUNT(*)AS c FROM student GROUP BY gender)AS t
WHERE t.c>2
-- 在where后面使用子查询 标量子查询
-- 查询身高大于平均身高的学生 平均身高?
SELECT * FROM student WHERE height > (SELECT AVG(height) FROM student)
-- 在where后面使用子查询 列子查询
SELECT * FROM student WHERE NO IN(SELECT NO FROM student WHERE height>1.60)
-- 在where后面使用子查询 行子查询
SELECT * FROM student WHERE (NO,height) = (SELECT MAX(NO),MAX(height) FROM student)