SQL语句(基础理论篇)
更新: 12/31/2024 字数: 0 字 时长: 0 分钟
特别鸣谢
为什么要学习牢固SQL语法
作为初级后端开发工程师,CRUD是工作中最不可少的部分,可以说是工作的99%都是CRUD,尽管java中存在mybatis与mybatisPlus等一系列框架,但本质都是基于sql语言与JDBC的再封装。
无论是代码层面还是通过navicat等可视化工具对数据库进行操作,SQL语句的熟练掌握永远都是初级开发立住身份的重要一环。
本篇文章终结了自己学习中常用的SQL语法,用于自己复习使用
基础语法
DML(Data Manipulation Language):数据操作语言————对数据库内容进行修改
INSERT 插入数据
insert into 表名 (列名 1,列名 2, …) values (列名 1 插入的值,列名 2 插入的值, …)
eg.
INSERT into db_stu (id,name,sex) VALUES (1,'sad',0)
所有字符串数据必须使用单引用!
UPDTE 更新数据
update 表名 set 列名1=要更新为的值, 列名2=要更新为的值, 列名3=要更新为的值.... where 要更新的列的条件
eg
UPDATE db_stu set sex=1 where id=1
DELETE 删除数据
delete from 表名 where 要删除的列的条件
eg
DELETE FROM db_stu WHERE id=1
DQL(Data Query Language):数据查询语言————对数据库内容进行查询
SELECT 查询数据
select 列名1,列名2,...
from 表名
where 查询条件
group by 分组查询—————对查询结果分组
having 分组的条件
order by 列名 排序顺序 (desc降序 asc 升序)
limit 起始行, 行数 对查询结果抽取一部分作为最终结果
条件查询
where中用来判断逻辑的词
=、!=、<>、<、<=、>、>=; 不多说(注意:sql中部分字符集的字符串=不区分大小写,可以在字符串判断语句前加binary来区分) 列名 BETWEEN…AND;一个区间内的值 左右均闭合 列名 IN(set);类似于java中的contain函数 判断列的值是不是在set里面 列名 IS NULL;不为空 语句 AND 语句;与 语句 OR 语句;或 NOT 语句;非
模糊查询
SELECT 字段 FROM 表 WHERE 某字段 Like 条件
- % :表示任意 0 个或多个字符。可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示。
- _ : 表示任意单个字符。匹配单个任意字符,它常用来限制表达式的字 符长度语句。
eg
LIKE '_____'; 表示该字符串长度为5(我这里打了五个连续的下划线)
like 'z%'; 表示该字符串以z开头
like '%z' 表示该字符串以z结尾
like '%z%' 表示该字段中含有z (%表示0个及以上)
LIKE '_i%'; 表示字符第二个字母为i
字段控制查询
select distinct 列名 from ....
使用distinct关键字表示该列若有重复则只记录第一条数据
SELECT *,sal+comm FROM emp;
我们可以在全部的列外自己自定义想要的列(多的列名就叫sal+comm)
SELECT *, sal+IFNULL(comm,0) AS total FROM emp 使用as
SELECT *, sal+IFNULL(comm,0) total FROM emp; as可以省略
通过as关键字我们可以让列变成我们想要的名字(下划线转驼峰,与java对应)
排序
SELECT * FROM emp ORDER BY sal DESC ,empno ASC;
没啥说的 就是排序 ,如果order by后跟多个数据 表示优先级 desc降序 asc升序
聚合函数
用来对表数据进行纵向统计(针对某一字段整体)的函数
select count(*) from stu 查修stu的总行数 包含所有列 而由于一个列存在就必须至少有一个字段不为空,因此用于计算总行数
select count(1) from stu 与select(*)没区别
select count(sex) from stu 对sex列进行计数 仅sex上的值不为null时才会计算
COUNT():统计指定列不为 NULL 的记录行数;
select max(sal),min(sal),sum(sal),avg(sal) from emp 记录某一字段的最大/最小/总和/平均
MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为 0;
AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为 0;
分组查询
分组查询需要搭配聚合函数一同使用,表示针对某一字段,把所有该字段相同的行全部划分为一组,然后对这组数据使用聚合函数进行统计
SELECT deptno, SUM(salary) FROM emp GROUP BY deptno; 使用 group by 后 select 后只能跟随聚合函数或者group by后出现的字段
having子句
SELECT deptno, SUM(sal)
FROM emp
where sal>1500
GROUP BY deptno
HAVING SUM(sal) > 9000
having关键字用于在分组后对结果进行再一次筛选,与where不同的是where是在分组前完成了筛选
LIMIT限定行数查询
limit 关键字用于对查询的结果取出一部分
SELECT * FROM emp LIMIT 0, 5 将查询结果取出前五行
注意,这里的两个参数
0表示从第几行开始取 与数组类似 0表示第一行
5表示从该行开始往后取5条数据(包含第0行自己)
多表连接
join 连接表名 on 连接条件
inner join 内连接
-- 隐式连接 不推荐
SELECT staff.name, deptname
FROM staff, deptno
WHERE staff.name = deptno.name;
-- INNER JOIN 推荐
SELECT staff.name, deptname
FROM staff
INNER JOIN deptno ON staff.name = deptno.name;
内连接表示两个表求交集 即只有两张表均符合on的条件才可以被查出
left join 左连接 right join 右连接
select staff.name,deptname
from staff
left join deptno
on staff.name=deptno.name;
select staff.name,deptname
from staff
right join deptno
on staff.name=deptno.name;
左连接
(LEFT JOIN
)的左
指的是连接中第一个出现的表。,左
的这张表的所有数据会全部被查出来,然后再拼接上右表中符合on条件的数据,如果没有符合的条件,则使用null来填充
同理
右连接
(RIGHT JOIN
)的右
指的是连接中的第二个表。在 RIGHT JOIN
中,这个“右表”的所有行都会出现在结果中