一、初识MySQL数据库
1.什么是数据库
数据库,简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、查询、更新、删除等操作。 所谓“数据库”是以一定方式储存在一起、能予多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合
数据库管理系统: 数据库管理系统(英语:Database Management System,简称DBMS)是为管理数据库而设计的电脑软件系统,一般具有存储、截取、安全保障、备份等基础功能。数据库管理系统可以依据它所支持的数据库模型来作分类,例如关系式、XML;或依据所支持的计算机类型来作分类,例如服务器群集、移动电话;或依据所用查询语言来作分类,例如SQL、XQuery;或依据性能冲量重点来作分类,例如最大规模、最高运行速度;亦或其他的分类方式。不论使用哪种分类方式,一些DBMS能够跨类别,例如,同时支持多种查询语言。
2.数据库分类与常见的数据库
关系型数据库: 指采用了关系模型来组织数据的数据库。 关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。
关系模型中常用的概念:
关系:一张二维表,每个关系都具有一个关系名,也就是表名
元组:二维表中的一行,在数据库中被称为记录
属性:二维表中的一列,在数据库中被称为字段
域:属性的取值范围,也就是数据库中某一列的取值限制
关键字:一组可以唯一标识元组的属性,数据库中常称为主键,由一个或多个列组成
关系模式:指对关系的描述。其格式为:关系名(属性1,属性2, ... ... ,属性N),在数据库中成为表结构
常见的关系型数据库: MySQL 、Microsoft SQL Server、Oracle数据库、DB2、Percona Server(MySQL的代替品)、PostgreSQL、Microsoft Access
Oracle公司的产品 产品免费、服务收费
SQL Server针对不同用户群体的多个版本 易用性好
Mysql开放源代码 网站应用广泛
非关系型数据库
非关系型数据库的特性
1、使用键值对存储数据;
2、分布式;
3、一般不支持ACID特性;
4、非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合。
非关系型数据库的优点:
1、无需经过sql层的解析,读写性能很高;
2、基于键值对,数据没有耦合性,容易扩展;
3、存储数据的格式:nosql的存储格式是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,而关系型数据库则只支持基础类型。
非关系型数据库的缺点:
1、不提供sql支持,学习和使用成本较高;
2、无事务处理,附加功能bi和报表等支持也不好;
常见的非关系型数据库:
NoSql 、MongoDB 、redis、 HBase
3.结构化查询语句SQL
名称 | 解释 | 命令 |
---|---|---|
DDL(数据定义语言) | 定义和管理数据对象,如数据库,数据表等 | CREATE、DROP、ALTER |
DML(数据操作语言) | 用于操作数据库对象中所包含的数据 | INSERT、UPDATE、DELETE |
DQL(数据查询语言) | 用于查询数据库数据 | SELECT |
DCL(数据控制语言) | 用来管理数据库的语言,包括管理权限及数据更改 | GRANT、COMMIT、ROLLBACK |
4.MySQL常用的数据类型
列类型 规定数据库中该列存放的数据类型
数值类型
字符串类型
日期和时间型数值类型
NULL值
数值类型
类型 | 说明 | 存储需求 |
---|---|---|
tinyint | 非常小的数据 | 1字节 |
int | 标准整数 | 4字节 |
bigint | 较大的整数 | 8字节 |
float | 单精度浮点数 | 4字节 |
double | 双精度浮点数 | 8字节 |
decimal | 字符串形式的浮点数 | decimal(m, d) m字节 保留d位小数 |
字符串类型
类型 | 说明 | 存储需求 |
---|---|---|
varchar | 可变字符串 | 变长度 |
text | 文本 | 2的16次方–1字节 |
日期和时间型数值类型
类型 | 说明 |
---|---|
DATE | YYYY-MM-DD |
DATETIME | YY-MM-DD hh:mm:ss |
TIMESTAMP | YYYYMMDDhhmmss格式表示的时间戳 |
NULL值 特别注意
5.MySQL的数据表的类型
MyISAM、InnoDB 、HEAP、BOB、CSV等
名称 | MyISAM | InnoDB |
---|---|---|
事务处理 | 不支持 | 支持 |
数据行锁定 | 不支持 | 支持 |
外键约束 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
表空间大小 | 较小 | 较大约2倍 |
6.修改数据表(ALTER TABLE)
//修改表名
ALTER TABLE 旧表名 RENAME AS 新表名//添加字段
ALTER TABLE 表名 ADD 字段名 列类型 [属性] //修改字段
ALTER TABLE 表名 MODIFY 字段名 列类型 [属性]
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 列类型 [属性]//删除字段
ALTER TABLE 表名 DROP 字段名
二、MySQL数据管理
1.DML(数据操作语言)
a.INSERT (添加数据)
单个插入
insert into student(id,name,money) values (1,'张三',3.9)
多条插入
insert into student(id,name,money) values (3,'张三',3.9),(2,'张三',3.9)
b.UPDATE (修改数据)
语法:
UPDATE 表名 SET 列1 = 值1,列2 = 值2... [ WHERE 条件 ];
//修改ID为1的学生名字与money
update student set name = '李四' , money = 3.6 where id = 1;
//将数据表subject中的ClassHour大于110且GradeID为1的课时都减少10update subject set ClassHour = ClassHour+10
where ClassHour>110 and GradeID = 1;
c.DELETE (删除数据)
delete from 表名 [where 条件]
delete from student where StudentNo =10066;
d.SELECT (查询数据)
select [列1,列2...| * ] from 表名 [where 条件];
注意:*代表所有列
as 别名:表别名 和列别名
select * from student
where GradeID = 1 and Sex = 1;
e.DISTINCT(去重)
select distinct a.StudentName,a.LoginPwd from student a;
#student a | student as a:给student起表名 a
#as可以省略
f.逻辑操作符
名称 | 语法 |
---|---|
AND或&& | a AND b 或 a && b |
OR或|| | a OR b 或 a||b |
NOT或! | NOT a 或 !a |
比较操作符
名称 | 语法 |
---|---|
IS NULL | a IS NULL |
IS NOT NULL | a IS NOT NULL |
BETWEEN | a BETWEEN b AND c |
LIKE | a LIKE b |
IN | a IN (a1,a2,a3,….) |
注意 :
1、数值数据类型的记录之间才能进行算术运算
2、相同数据类型的数据之间才能进行比较
like:
% 匹配多位
_ 匹配一位
#查询1900年到2000年出生的学生信息
select * from student a
where
a.BornDate BETWEEN "1900-01-01 00:00:00" and "2000-12-31 23:59:59";
#in 匹配多个值
select * from student a
where a.GradeID in (1,2);
#like 模糊查询
# % 匹配多位
# _ 匹配一位
# 查询姓李的学生
select * from student
where StudentName like "李%"; #李某 李某某
# where StudentName like "%文%"; #名字带文的
# where StudentName like "李_"; #李某
# where StudentName like "李__"; #李某某
#获得成绩大于等于60且小于等于80的
select * from result a
where
a.StudentResult >= 60 and a.StudentResult <= 80;
select * from result a
where
a.StudentResult between 60 and 80;
#获得姓名为空的学生信息
select * from student a
where a.StudentName= "";
#获得姓名不为空的学生信息
select * from student a
where a.StudentName is not null;
#获得1年级以外的所有学生
select * from student a where a.GradeID != 1;
#查询高等数学-1考试成绩 并+10分
select (a.StudentResult + 10) as re
from result a where a.SubjectNo = 1;
#DISTINCT 结果去重
select DISTINCT
a.StudentName,a.LoginPwd from student a;
# as (可以省略) 别名
# 列别名
select a.* from student a;
#表别名
select a.StudentNo,a.StudentName
form student as a where a.Sex = 1;
2.DQL(数据查询语言)
DQL(Data Query Language,数据查询语言)
a.SELECT语法
SELECT [ALL | DISTINCT] {* | table.*|[ table.field1 [ as alias1] [,table.field2 [as alias2]][, …]] }
FROM table_name [ as table_ alias ][ left|out|inner join table_name2] #联合查询[ WHERE … ] #指定结果需满足的条件[ GROUP BY …] #指定结果按照哪几个字段来分组[ HAVING …] #过滤分组的记录必须满足的次要条件[ ORDER BY… ] #指定查询记录按一个或者多个条件排序[ LIMIT{[ offset,] row_count | row_count OFFSET offset }] ; #指定查询的记录从哪条至哪条
AS子句作用
可给数据列取一个新别名
可给表取一个新别名
可把经计算或总结的结果用另外一个新名称来代替
b.连接查询(多表查询)
连接查询
如需要多张数据表的数据进行查询,则可通过连接运算符实现多个查询
分类包括
内连接 ( inner join)
等值和非等值的连接查询
自身连接查询
外连接 ( out join )
左连接(LEFT JOIN)
右连接 ( RIGHT JOIN)
内连接查询
INNER JOIN内连接
在表中至少一个匹配时,则返回记录
SELECT 字段1,字段2,… FROM table_1
INNER JOIN table_2
ON table_1.字段x = table_2.字段y;
# INNER JOIN 与JOIN 是相同的;
# 如table_1中的行在table_2中没有匹配,则不返回;
#从subject和grade数据表查询课程名称和所属年级名称
SELECT SubjectName,GradeName FROM subject
INNER JOIN grade
ON subject.GradeID = grade.GradeID;
等值和非等值的连接查询
与单表查询类似,都是SELECT语句
把多个表放到FROM后,并用逗号隔开
可使用AS关键字取别名,便于引用
如无重名查询字段则可省略数据表的指定
#从subject和grade数据表查询课程名称和所属年级名称 #非等值连接查询 SELECT SubjectName,GradeName FROM subject,grade; #等值查询 SELECT SubjectName,GradeName FROM subject,grade WHERE subject.GradeID = grade.GradeID;
外连接查询
左外连接(LEFT JOIN)
从左表(table_1)中返回所有的记录,即便在右(table_2)中没有匹配的行
SELECT 字段1,字段2,… FROM table_1 LEFT [OUTER] JOIN table_2 ON table_1.字段x = table_2.字段y;
右外连接(RIGHT JOIN)
从右表(table_2)中返回所有的记录,即便在左(table_1)中没有匹配的行
SELECT 字段1,字段2,… FROM table_1 RIGHT [OUTER] JOIN table_2 ON table_1.字段x = table_2.字段y;
JOIN对比
操作符名称 | 描述 |
---|---|
INNER JOIN ( JOIN ) | 如果表中有至少一个匹配,则返回行 |
LEFT JOIN | 不论右表是否有匹配,都会返回左表的所有行 |
RIGHT JOIN | 不论左表是否有匹配,都会返回右表的所有行 |
自连接查询
数据表与自身进行连接
#从一个包含栏目ID,栏目名称和父栏目ID的表中,查询父栏目名称和其子栏目名称
#表结构语句
CREATE TABLE IF NOT EXISTS category(categoryId int(10) auto_increment primary key,categoryName varchar(32) not null ,pid int(10)
);
3.ORDER BY排序查询
对SELECT语句查询得到的结果,按某些字段进行排序
默认为ASC(升序,从小到大), DESC(降序,从大到小)
select * from 表名 where 条件 order by 列名; #默认为升序asc
select * from 表名 where 条件 order by 列名 desc; #降序desc
4.LIMIT
LIMIT [m,]n 或 LIMIT n OFFSET m
限制SELECT返回结果的行数
m 制定第一个返回记录行的偏移量
n 制定返回记录行的最大数目
注意:
m不指定则偏移量为0,从第一条开始返回前n条记录
LIMIT 常用于分页显示
SELECT * FROM `result` LIMIT 5 #返回前5条记录
SELECT * FROM `result` LIMIT 5,10 #返回6-15条记录
5.子查询
在查询语句中的WHERE条件子句中,又嵌套了另外一个查询语句
注意:
嵌套查询可由多个子查询组成,求解的方式是由里及外
子查询返回的结果一般都是集合,故而建议使用 IN 关键字
where条件中嵌套
要求:查询课程为《高等数学-2》且分数不小于80分的学生的学号和姓名
select a.StudentNo,a.StudentName
from student a
where a.StudentNo in (select b.SubjectNo from `subject` b LEFT JOIN result c on b.SubjectNo=c.StudentNowhere b.SubjectName = '高等数学-2' and c.StudentResult>80);
分析:条件课程名与分数均不在student表中,也没有外键,表连接无法使用。
1.以学号为条件,使用in ,因为可能存在多名学生
2.课程表与成绩表存在外键,所以子查询使用表连接
3.写出课程表语成绩表中两个条件
4.返回满足的学生学号
6.GROUP BY 分组
使用GROUP BY关键字对查询结果分组
对所有的数据进行分组统计
分组的依据字段可以有多个,并依次分组
与HAVING结合使用,进行分组后的数据筛选
SELECT 列名1,列名2 FROM 表名 [WHERE 条件] [ GROUP BY 字段]
select s.s_id,s.s_name from student s GROUP BY s.s_id, s.s_name
7.MySQL的函数
统计函数
函数名称 | 描述 |
---|---|
COUNT( ) | 返回满足SELECT条件的记录总和数,如 SELECT COUNT(*)… |
SUM( ) | 返回数字字段或表达式列作统计,返回一列的总和 |
AVG( ) | 通常为数值字段或表达列作统计,返回一列的平均值 |
MAX( ) | 可以为数值字段、字符字段或表达式列作统计,返回最大的值 |
MIN( ) | 可以为数值字段、字符字段或表达式列作统计,返回最小的值 |
字符串函数
#将字符串转换为全小写
select lower("SQL Course");
#将字符串转换为全大写
select upper("SQL Course");
#将多个字符串参数首尾相连后返回
select concat("abc","www");
#如果有任何参数为null,则函数返回nul
select concat('My',null,'QL');
#如果参数是数字,则自动转换为字符串
select concat(14.3,'mysql');
#将多个字符串参数以给定的分隔符separator首尾相连后返回
select concat_ws(';','First name','Second name','Last name');
#从源字符串str中的指定位置pos开始取一个字串并返回
select substr("hello world!",6);
#从源字符串中指定位置开始,截几个
select substr("hello world!",7,2);
#len为负值表示从源字符串的尾部开始取起
select substr("hello world!",-6);
#返回字符串的存储长度
select length("hello");
#返回字符串的字符个数
select char_length("hello world");
#从源字符串中返回字串第一次出现的位置
select instr("fooba","o");
#在源字符串的左边填充给定的字符padstr到
#指定的长度len,返回填充后的字符串
select lpad("hi",5,"??");
select rpad("hi",5,"??");
#去掉字符串两边的空格
select trim(" abc ");
#去掉字符串的左边或右边的空格(左对齐、右对齐)
select ltrim(" abc ");
select rtrim(" abc ");
#将字符串重复count次后返回
select repeat("mysql",3);
#以格式‘#,###,###.##’格式化数字X
select format(123.15,1);
#返回由N个空格构成的字符串
select space(3);
#返回最左边的len长度的子串
select left("charcater",4);
select right("charcter",5);
#如果两个字符串是一样的则返回0;
#如果第一个小于第二个则返回-1;否则返回1
select strcmp("abc","abcd");
日期函数
函数 | 描述 |
---|---|
NOW() | 返回当前的日期和时间 |
CURDATE() | 返回当前的日期 |
CURTIME() | 返回当前的时间 |
DATE() | 提取日期或日期/时间表达式的日期部分 |
EXTRACT() | 返回日期/时间按的单独部分 |
DATE_ADD() | 给日期添加指定的时间间隔 |
DATE_SUB() | 从日期减去指定的时间间隔 |
DATEDIFF() | 返回两个日期之间的天数 |
DATE_FORMAT() | 用不同的格式显示日期/时间 |
#获得当前时间
select now();
#日期转换函数
select date_format("2024-07-30 09:45:30","%Y%m%d%H%i%s");
#MySQL 日期时间计算函数
set @dt = now();
#为日期增加一个间隔 date_add()
select date_add(@dt, interval 1 day); -- add 1 day
select date_add(@dt, interval 1 hour); -- add 1 hour
#为日期增加一个间隔 date_sub()
select date_sub("2024-07-30 09:52:30",interval "1 1:1:1" day_second);