目录
一. 数据库(DataBase)
1.定义:
2. 常见的数据库产品:
3. MySQL数据库
(1). 介绍 :
(2). cmd命令行方式连接 MySQL
(3). MySQL的常用命令
二. MySQL数据库 环境安装及配置
三. SQL
1.定义 :
2. DDL
(1)数据库
(2)数据表
1. 字段(列)和记录(行)
2. 表特征
3. 数据类型
4. 创建 删除 修改 表数据
5. 约束和其他
3.DML
4. DQL
(1). 基础查询
(2). 函数处理
1.单行函数:
a. 字符函数
b. 逻辑处理
c. 数学函数
d. 日期函数
2.分组函数:
(3). 条件查询
(4). 查询合并
(5). 查询排序
(6). 数量限制
在程序开发时,为了解决数据存储问题,我们使用专业的数据存储软件(数据库软件)进行存储,
数据库软件专门提供了一种编程语言 来管理数据库中的数据
一. 数据库(DataBase)
1.定义:
为了方便数据的存储和管理,将数据按照特定的规则存储在磁盘上,是一个存储和管理数据的仓库
2. 常见的数据库产品:
3. MySQL数据库
(1). 介绍 :
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发 , 现被 Oracle公司收购 MySQL数据库服务器具有快速 可靠和易于使用的特点 且 使用标准的sql语言 , 并且支持多种操作系统,支持多种语言连接. 具有商业版(收费 受维护)与社区版(免费 不受维护)
(2). cmd命令行方式连接 MySQL
登录:mysql [-h127.0.0.1 -P3306](本机可省略) -uroot -p密码
-h:主机名 -P:端口号 -u:用户名 -p:密码 退出:exit
(3). MySQL的常用命令
查看当前所有的数据库:show databases;
选择指定的库:use 库名
查看当前的所有表:show tables;
查看其他库的所有表:show tables from 库名;
查看mysql版本: select version()
二. MySQL数据库 环境安装及配置
1. 下载数据库地址
https://dev.mysql.com/downloads/mysql/
2. 下载到指定目录
一般下载到 development 中
3. 配置环境变量
复制mysql安装包下的bin目录地址( D:\development\mysql-8.0.22-winx64\bin )
此电脑右击---属性---高级系统设置---环境变量---Path---编辑---新建---粘贴bin目录地址---确定
4. 初始化MySQL
在管理员命令提示符中输入
mysqld --initialize-insecure
5. 安装MySQL服务
cmd输入指令:
mysqld install
6. 启动MySQL服务
cmd输入指令:
net start mysql
7. 为root账号设置密码
cmd输入指令:
mysql -uroot -p
注意 : 初次设置 默认密码为空 , 直接回车就行
cmd输入指令:
alter user 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';
注意 : (1) 此处设置的密码为 root , 可以自愿更改
(2) 由于在cmd命令行中进行数据库编写不方便,我们可以安装可视化的客户端工具
(以SQLyog为例,详细的下载流程可以参考其他大佬的博客)
(3) 如果下载时出现问题,有可能是因为电脑系统中缺少东西,需要下载下面软件 (自行下载)
(4)如果启动时出现问题,可能是由于MySQL没有启动 按照下列方式启动
三. SQL
1.定义 :
结构化查询语言SQL(Structured Query Language) , 是一种数据库程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统. 几乎所有关系型数据库都支持SQL , 简单易学,灵活使用可以进行复杂和高级的数据库操作
2. DDL
数据(结构)定义语言DDL(Data Definition Language) : 用于创建和修改数据库表结构的语言
常用的语句:create , alter , drop , rename
(1)数据库
创建数据库并设置编码格式
CREATE DATABASE [if not exists] 数据库名 [ CHARSET utf8]
删除数据库
DROP DATABASE 数据库名 / [IF EXISTS数据库名];
修改字符集
ALTER DATABASE 数据库名 CHARSET gbk;
-- 创建数据库
create database if not exists schooldb charset utf8
-- 删除数据库
drop database schooldb
-- 修改数据库字符编码
alter database schooldb charset utf8
-- 注意:MySQL数据库名字创建后不支持修改
(2)数据表
表(table) : 构成关系型数据库的基本元素 , 是由行和列组成 .
1. 字段(列)和记录(行)
字段 : 是表里的一列(column),用于保存每条记录的特定信息。
例如 : 学生表的字段包括 学号, 姓名, 性别, 生日 , 电话 , 身高, 注册时间等
记录 : 是表里的一行(row)数据
2. 表特征
表名----表中的字段(列)----字段的数据类型和长度----约束
3. 数据类型
4. 创建 删除 修改 表数据
-- 创建数据表student(表名)
create table student(
num int,
name varchar(8),
gender char(1),
phone char(11),
birthday date,
height decimal(3,2),
regtime datetime
)-- 删除数据表
drop table student-- 修改数据表名
rename table student to stu
5. 约束和其他
约束: 主键约束----唯一约束----非空约束----检查约束----外键约束
主键约束: primary key 一个表中只能有一个主键约束 , 不能为空 , 不能重复
唯一约束: unique
非空约束: not null
检查约束: 值需要满足设置的条件
外键约束:
其他:
默认值: default'男'
字段注释: comment'学号'
自动增长: auto_increment (只有整数类型可以自动增长)
-- 创建添加约束的表
create table student(
id int primary key auto_increment ,
num int comment'学号',
name varchar(8) not null,
gender char(1) default'男',
phone char(11) unique not null,
birthday date,
height decimal(3,2) check(height<2.55),
regtime datetime not null
)
3.DML
数据操纵语言DML(Data Manipulation Language) 常用语句: insert , delete , update
-- DML 数据操纵语言-- insert
-- 方式1: INSERT INTO 表名(列1,列2……,列n) VALUES(值1,值2…..,值n);
INSERT INTO student(num,NAME,gender,phone,birthday,height,regtime)VALUE(100,'张三',"男",'152222222','2005-03-05',1.88,NOW())
-- 方式2: INSERT INTO 表名 set 列名1=值1,..列名n=值n;
INSERT INTO student SET num=101,NAME='李四',gender='女',phone='1522222223',regtime=NOW()
-- 方式3(批量插入): INSERT INTO 表名(列1,列2……,列n) VALUES(值1,值2…..,值n),(值1,值2…..,值n);
INSERT INTO student(num,NAME,phone,regtime)VALUES(102,'jim','11111',NOW()),(103,'tom','222',NOW()),(104,'jery','3333',NOW())-- delete
DELETE FROM student WHERE id = 8
DELETE FROM student -- update
UPDATE student SET birthday='2008-8-8',height=1.89 -- 这是没有条件的修改,没有条件会修改表中所有数据
UPDATE student SET birthday='2008-9-8',height=1.79 WHERE id=8 -- 这是有条件的修改
4. DQL
DQL(Data Query Language)数据查询语言 , 可以从单个表中查询数据,也可以从多个表中查询
注意: 查询语句是不会影响数据库中的数据的,查询的结果是临时备份
基本语法结构 : selet 要查询的列 from 表名 where 条件 排序 分组 数量限制...
(1). 基础查询
查询指定列 所有列 和 设置别名---as
-- 基础查询
SELECT num,NAME,gender FROM student
-- 条件查询
SELECT num,NAME,gender FROM student WHERE gender = '男'
-- 查询所有列的数据
SELECT * FROM student WHERE gender = '男'
-- as 别名
SELECT num,NAME AS na FROM student
(2). 函数处理
1.单行函数:
函数会对每行查询的数据进行处理 (注意: sql + - * / 只能用作算术运算)
a. 字符函数
-- 字符函数-- length(列名) 返回字节长度,一个中文占3个字节,英文字符一个占一个字节
-- CHAR_LENGTH(列名) 返回字符长度
SELECT NAME,LENGTH(NAME)AS nl,CHAR_LENGTH(NAME)AS nll FROM student-- concat(....) 连接多个字符串
SELECT CONCAT(num,':',NAME)AS NAME FROM student-- UPPER(NAME)转大写 , LOWER(NAME)转小写
SELECT UPPER(NAME),LOWER(NAME) FROM student-- substring(列,开始的位置,截取长度) 注意开始的位置从1开始SELECT SUBSTRING(NAME,1,1) FROM student-- trim(列) 默认是取出前后的空格
SELECT NAME,CHAR_LENGTH(TRIM(NAME)) FROM student -- TRIM('#' FROM NAME) 去掉前后指定的子串
SELECT TRIM('#' FROM NAME)FROM student -- replace(列,old,new)
SELECT REPLACE(NAME,'i','I')FROM student
b. 逻辑处理
case when 条件 then 条件成立执行 else 条件不成立 end (注意:可以有多个when)
-- 逻辑处理
-- case when 条件 then 条件成立执行 else 条件不成立 end (注意:可以有多个when)
SELECT num,NAME,(CASE WHEN height>=1.80 THEN '高个子' ELSE '非高个子' END)AS heightFROM studentSELECT num,NAME,(CASE WHEN height>=1.80 THEN '高个子'WHEN height>=1.60 THEN '正常' ELSE '低个子' END)AS heightFROM student-- ifnull(列,'默认值') 检测指定列的值是否为空,如果为空显示默认值
SELECT num,NAME,IFNULL(birthday,'暂未录入信息')AS birthday FROM student-- if(条件,结果1,结果2)
SELECT num,NAME,IF(height>=1.80,'高个子','非高个子')AS height FROM student
c. 数学函数
round(数值):四舍五入 返回整数
ceil(数值):向上取整,返回>=该参数的最小整数
floor(数值):向下取整,返回<=该参数的最大整数
truncate(数值,保留小数的位数):截断,小数点后截断到几位 ,不会进行四舍五入
mod(被除数,除数):取余,被除数为正,则为正;被除数为负,则为负
-- 数学函数
SELECT num,NAME,ROUND(height),TRUNCATE(height,1) FROM student
d. 日期函数
now(): 返回当前系统时间(年月日时分秒)
curdate(): 返回当前系统日期(年月日)
date_format(日期列,格式): 将日期转换为指定格式
datediff(big,small): 返回两个日期相差的天数
-- now():返回当前系统时间(年月日时分秒)
-- curdate():返回当前系统日期(年月日)
SELECT num,NAME,NOW(),CURDATE() FROM student-- date_format(日期列,格式):将日期转换为指定格式
SELECT num,NAME,DATE_FORMAT(birthday,'%Y') FROM student
SELECT num,NAME FROM student WHERE DATE_FORMAT(birthday,'%Y-%m') = '2005-03'-- datediff(big,small):返回两个日期相差的天数
SELECT num,NAME,DATEDIFF(CURDATE(),birthday) FROM student
select datediff(curdate(),'2025-03-20') from student
日期格式:
2.分组函数:
用作统计使用,又称为聚合函数或统计函数 .
多行查询完之后,变为一行结果 . 分组函数一般和group by语句组合使用 , 分组统计
常用函数 : sum() avg() max() min() count()
-- sum(列,只能对数值类型求和)
SELECT SUM(height) FROM student-- avg(列) 求平均值
SELECT AVG(height) FROM student-- max(列) 返回该列中最大值 min(列) 返回该列最小值
SELECT MAX(height),MIN(height) FROM student-- count(列) 统计该列总数 值如果为null,不计算
SELECT COUNT(birthday) FROM student-- 如果统计所有的数据,一般用主键列, *
SELECT COUNT(*) FROM student
SELECT COUNT(id) FROM student
-- 查询出学生中身高最高的学信息
SELECT num,NAME FROM student WHERE height = (SELECT MAX(height) FROM student)-- 查询身高大于平均身高的学生
SELECT num,NAME FROM student WHERE height > (SELECT AVG(height) FROM student)
(3). 条件查询
2.常用方法:
a. 比较 : = , != , > , < , >= , <= (between and 两者之间,包含临界值)
b. 逻辑运算 : and与----or或----- not非
-- and 并且 与
SELECT * FROM student WHERE gender = '男' AND height>=1.80
-- or 或
SELECT * FROM student WHERE gender = '男' OR height>=1.80
SELECT * FROM student WHERE num=101 OR num =103 OR num = 105 SELECT * FROM student WHERE height>=1.70 AND height <=2.0
SELECT * FROM student WHERE height>1.70 AND height <2.0-- 在两个值之间, 包含边界值
SELECT * FROM student WHERE height BETWEEN 1.70 AND 2.0
c.模糊查询
模糊查询 like '张%' 以张开头,向右匹配任意位字符
-- 模糊查询 like '张%' 以张开头,向右匹配任意位字符
SELECT * FROM student WHERE NAME LIKE '张%'
SELECT * FROM student WHERE NAME LIKE '%丰%'
in 判断某字段的值是否属于in列表中的某一项
not in判断某字段的值是否不属于in列表中的某一项
IS NULL(为空的)
IS NOT NULL(不为空的)
-- in 在给定的数据集中的
SELECT * FROM student WHERE num IN(101,103,105)
SELECT * FROM student WHERE num=101 OR num =103 OR num = 105 -- not in 不在给定的数据集中的
SELECT * FROM student WHERE num NOT IN(101,103,105)-- is null 为空的
SELECT * FROM student WHERE birthday IS NULL-- is not null 不为空的
SELECT * FROM student WHERE birthday IS NOT NULL
(4). 查询合并
UNION ,UNION ALL 合并多个查询的结果, 合并时,多条sql列的数量和类型需要一致
-- union 合并时,可以去除多条语句查询出的重复数据
SELECT num,NAME,gender FROM student UNION
SELECT num,NAME,height FROM student WHERE gender = '女'-- UNION ALL 只是简单的合并,不能去除重复数据
SELECT num,NAME,gender FROM student UNION ALL
SELECT num,NAME,gender FROM student WHERE gender = '女'
(5). 查询排序
order by 列名 asc(升序) / desc(降序)
-- 排序 order by 列名 asc(升序)/desc(降序)
SELECT * FROM student WHERE num>1 ORDER BY height ASCSELECT * FROM student ORDER BY height ASCSELECT * FROM student ORDER BY regtime DESCSELECT * FROM student ORDER BY height DESC,regtime ASC
(6). 数量限制
-- 数量限制 limit 开始的位置,每次查询的数量
SELECT * FROM student WHERE num>1 ORDER BY id ASC LIMIT 0,2 -- 第一页SELECT * FROM student WHERE num>1 LIMIT 2,2 -- 第二页SELECT * FROM student LIMIT 4,2 -- 第三页-- mysql分页公式 limit (n-1)*每页大小,每页大小
(7)分组查询
group by 分组的列 , 用哪个列作为分组条件, 会把该列中相同的数据分到一组处理
where 是对原始表中的数据进行筛选 , 而 HAVING 是对分组后的结果进行筛选
-- 分组查询
-- 统计男女人数 统计出男生各有多少人
-- group by 分组的列 , 用哪个列作为分组条件, 会把该列中相同的数据分到一组处理SELECT gender,COUNT(*) FROM student WHERE num>1 GROUP BY gender-- 统计姓名重复的学生 只显示重复的数据-- where 是对原始表中的数据进行筛选-- HAVING 是对分组后的结果进行筛选 SELECT NAME,COUNT(*)AS c FROM student WHERE num>1 GROUP BY NAME HAVING c>1SELECT NAME,COUNT(*)AS c FROM student WHERE num>1 GROUP BY NAME HAVING c=1