数据库是一个用来存储和管理数据的集合,它可以以结构化的方式存储数据,并且可以被多个用户或应用程序访问和操作。
常见的数据库有两种:关系型数据库和非关系型数据库。
关系型数据库(RDBMS)是指采用关系模型来存储和管理数据的系统。在关系型数据库中,数据使用二维表格的形式进行存储,其中表格中的每一行数据即为一条记录,表格可有自定义的多个列(字段),用来描述一个实体的相关特性。
关系型数据库使用结构化查询语言(SQL)来进行数据操作和查询。常用的关系型数据库有:Oracle、MySQL、SQL Server等。
非关系型数据库(NoSQL)是指不局限于传统的关系型数据库模型的各种数据库系统,它不规定基于SQL实现。非关系型数据库中基于键值对实现(Key-Value):如memcached、redis等;基于文档型:如mongodb;基于图型:如 neo4j。
什么是SQL?
SQL是一种用于管理关系型数据库系统的标准化查询语言。SQL可被用于数据库的创建、访问、操作和管理。
SQL的基本命令包括:(注:sql语句中的关键字不区别大小写,该文章均使用小写)
在本文中,将对DML和DQL着重进行叙述。
在一个关系型数据库服务器中,数据一般由多个二维表格来组织,而表又存在于数据库中。其中每个表可以独立存在,也可以通过一定的约束建立联系。
因此在创建表前我们需要创建存放表的数据库。
语法:
create database (if not exists) 数据库名 (charset = 字符集名称) ;
注意:
创建好的数据库后需要选中才能进行接下来的数据操作。
语法:
use 数据库名;
语法:
drop database 数据库名;
注意:删除数据库是一项很“刑”的操作,平时也应该谨慎进行,切勿做那个“从删库到跑路”的人。
语法:
show databases;
语法:
创建表:
create table 表名 (
列名1 数据类型,
列名2 数据类型,
…
);
查看表结构:
desc 表名;
删除表:
drop table 表名;
语法:
形式一:指定列插入
insert into 表名 (指定列1,指定列2, …) values
(指定列1的数值, 指定列2的数值, …),
(记录二),
(记录三) ,… ;
形式二:全列插入
insert into 表名 values (所有列对应数值), (记录二), (记录三),… ;
注意:
语法:
select * from 表名;
例子如下:
语法:
select 列名1, 列名2, … from 表名;
语法:
select 多个列组成的表达式 [如:列1 + 列2] from 表名;
注意:
[ ]表示举例,可根据实际需要填写。
若存在以下 score 表结构和表数据:
则查询字段为表达式的例子如下:
语法:
select 查询字段 as 别名 from 表名;
注意:
语法:
select distinct 字段名 from 表名;
注意:
若要使用 DISTINCT 关键字进行去重,则查询的列只能有一个。
若存在以下 score 表:
使用 distinct 进行去重操作后:
语法:
select 列名1, 列名2, … from 表名 order by 列名 desc (asc);
注意:
语法:
select 字段1, 字段2, … from 表名 where 查询条件;
比较运算符:>, >=, <, <=, =, <=>, != , <>(比较字段的大小关系)
示例如下:
比较运算符:BETWEEN a0 AND a1(寻找字段大小介于 a0 ~ a1 的记录,包含边界值)
示例如下:
比较运算符:IN(寻找所有包含在列举值的字段的记录)
示例如下:
比较运算符:IS NULL, IS NOT NULL
示例如下:
比较运算符:LIKE
LIKE的常见用法:
查询字段前 n 个字符为指定字符的字段:如 name like ‘孙%’
查询包含指定字符的字段:如 name like ‘%三%’
查询字段后 n 个字符为指定字符的字段:name like ‘%空’
查询包含特定字符数的字段,且字段查询规则为自定义:name like ‘孙_’
语法:
形式一:
select 字段 from 表名 limit 数字(代表此次查询记录的条数)
形式二:
select 字段 from 表名 limit num1 offset num2;(表示从表的第一条记录偏移量为 num2 的记录开始,查询 num1 条记录)
形式三:
select 字段 from 表名 limit num1, num2; (表示从表的第一条记录偏移量为 num1 的记录开始, 查询 num2 条记录)
语法:
UPDATE 表名 SET 列名1 = 即将更新的值 [, 列名2 = 即将更新的值] [, …] [WHERE 判断条件] [ORDER BY …] [LIMIT …];
注意:
[ ] 表示可根据需要进行添加。
语法:
DELETE FROM 表名 [WHERE 判断条件] [ORDER BY …] [LIMIT …];
注意:
[ ] 表示可根据需要进行添加。
聚合函数可以实现常见的统计总数、计算平局值等操作。常见的聚合函数有:
在 select语句中使用 GROUP BY 子句可以对指定字段进行分组查询。
在一张表中使用 GROUP BY 进行分组查询时需满足:select 指定的查询字段必须是通过GROUP BY子句指定的“分组依据字段”,其他字段若想出现在查询结果中,则必须以聚合函数的形式包含在 select 语句中。
语法:
SELECT 字段1 [, 聚合函数] … FROM 表名 GROUP BY 字段1, 字段2…
注意:聚合函数通常需要配合GROUP BY 子句使用。
例如:有一张职员表 emp ,该表包含这些字段:id、姓名(name)、职位(role)、薪水(salary)。
若想知道职员表 emp 中有何种职位,可以使用 GROUP BY 对职位 role 进行分组。示例如下:
若想知道职员表 emp 各个不同职位的平均工资情况,使用使用 GROUP BY 按职位 role 进行分组,并在 SELECT 中使用 聚合函数 AVG 得到职位的平均工资。示例如下:
使用 GROUP BY 子句对数据进行分组后,若需要过滤部分分组后的记录,则可以使用 HAVING 对记录进行过滤,而不能使用 WHERE。
语法:
SELECT 查询字段 FROM 表名 GROUP BY 分组字段 HAVING 逻辑条件;
注意:
示例一:查询职员表 emp 各个不同职位的平均工资情况,但过滤职位为 “董事长”的记录。
示例二:查询职员表 emp 各个不同职位的平均工资情况,使用 HAVING 过滤职位为 “董事长”的记录,并且将结果集按平均工资 AVG(salary) 进行升序排序。
示例三:查询职员表 emp 各个不同职位的平均工资情况,使用 WHERE 先排除 “小红”的记录,再使用 HAVING 过滤职位为 “董事长”的记录,并且将结果集按平均工资 AVG(salary) 进行升序排序。
在实际的业务场景中,要查询的数据往往来自于不同的表中,因此要查询所需记录需要进行多表联合查询。多表联合查询是指:对多张表的数据取笛卡尔积。
语法:
形式一:
SELECT 查询字段 FROM 表1 JOIN 表2;
形式二:
SELECT 查询字段 FROM 表1, 表2;
注意:将多张表进行笛卡尔积后,新表的行数为各表行数的乘积,列数为各表列数之和。
示例如下:
注意:关联查询可以对关联表使用别名。
先创建以下表及初始化数据:
create table classes(id int, name varchar(30), `desc` varchar(50) );
create table student (id int , name varchar(15), qq_mail varchar(30), classes_id int);
create table course (id int, name varchar(20) );
create table score (score decimal, student_id int, course_id int);
insert into classes (id, name, `desc`) values
(1, '计算机系2019级1班', '学习了计算机原理、C和Java语言、数据结构和算法'),
(2, '中文系2019级3班','学习了中国传统文学'),
(3, '自动化2019级5班','学习了机械自动化');
insert into student ( id, name, qq_mail, classes_id) values
(1, '黑旋风李逵','[email protected]', 1),
(2, '菩提老祖',null,1),
(3, '白素贞',null,1),
(4, '许仙','[email protected]',1),
(5, '不想毕业',null,1),
(6, '好好说话','[email protected]',2),
(7, 'tellme',null,2),
(8, '老外学中文','[email protected]',2);
insert into course (id, name) values
(1, 'Java'),(2, '中国传统文化'),(3, '计算机原理'),(4, '语文'),(5, '高阶数学'),(6, '英文');
insert into score(score, student_id, course_id) values
-- 黑旋风李逵
(70.5, 1, 1),(98.5, 1, 3),(33, 1, 5),(98, 1, 6),
-- 菩提老祖
(60, 2, 1),(59.5, 2, 5),
-- 白素贞
(33, 3, 1),(68, 3, 3),(99, 3, 5),
-- 许仙
(67, 4, 1),(23, 4, 3),(56, 4, 5),(72, 4, 6),
-- 不想毕业
(81, 5, 1),(37, 5, 5),
-- 好好说话
(56, 6, 2),(43, 6, 4),(79, 6, 6),
-- tellme
(80, 7, 2),(92, 7, 6);
语法:
形式一:
SELECT 查询字段 FROM 表1 别名 [inner] JOIN 表2 别名 ON 连接条件 [AND 其他条件]
形式二:
SELECT 查询字段 FROM 表1 别名, 表2 别名 WHERE 连接条件 [AND 其他条件]
注意:
内连接说明:
由多表联合查询可知笛卡尔积的结果是将所有可能的结果进行排列组合,其中会产生大量“不合理”的记录。因此内连接就是需要剔除“不合理”记录,并在“合理”记录中查询特定的记录。(如下图)
外连接分为左外连接和右外连接。
左外连接通俗来讲当两个表进行笛卡尔积时,左表的所有记录一定会出现在结果集,若右表中没有与之匹配的记录,则右表的字段返回NULL。
右外连接通俗来讲当两个表进行笛卡尔积时,右表的所有记录一定会出现在结果集,若左表中没有与之匹配的记录,则左表的字段返回NULL。
语法:
左外连接:
SELECT 查询字段 FROM 表1 LEFT JOIN 表2 ON 连接条件 AND 其他条件
右外连接:
SELECT 查询字段 FROM 表1 RIGHT JOIN 表2 ON 连接条件 AND 其他条件
自连接是指在同一张表连接自身进行查询。
语法:
SELECT 查询字段 FROM 表 别名1 JOIN 表 别名2 ON 连接条件 AND 其他条件
注意:某张表进行自连接时,必须为表起别名,否则无法进行联合查询。
自连接应用场景:
当某张表的字段如 score 表时,某个学生多门课程的成绩分布于表的多行记录,由于 WHERE 只能进行列与列之间的比较,因此想找出一名学生某门课程成绩比另一门课程高的所有学生情况,并且只用到一次查询就需要用到自连接操作。
示例:显示所有“计算机原理”成绩比“Java”成绩高的学生信息
子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询。
语法:
单行子查询:
SELECT 查询字段 FROM 表名 WHERE 字段 = (返回一行记录的子查询查询语句)
多行子查询:
SELECT 查询字段 FROM 表名 WHERE 字段 IN (返回多行记录的查询语句)
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
注意:
UNION 内部的每个 SELECT 语句必须拥有相同数量的列,列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同;并且使用UNION会自动去除结果集中的重复记录。
语法:
SELECT 查询字段 FROM 表名
UNION
SELECT 查询字段 FROM 表名;
UNION ALL 操作符也用于合并两个或多个 SELECT 语句的结果集。
它的使用规则与UNION相同,但使用UNION ALL会使结果集中包含重复记录。
语法:
SELECT 查询字段 FROM 表名
UNION ALL
SELECT 查询字段 FROM 表名;
以上就是本篇文章的全部内容了,如果这篇文章对你有些许帮助,你的点赞、收藏和评论就是对我最大的支持。
另外,文章的不足之处,也希望你可以给我一点小小的建议,我会努力检查并改进。