前言:
因公司要求, 于是花了约莫一周的时间来理解和记忆 SQL 语言, 在基于实用而非彻底理解的情况下, SQL 语句其实是很简单的, 现在, 我就把自己这段时间的整理能容放出来, 供新人摸索, 供大佬批判.
因为是新人上路, 所以可能有所不足, 欢迎指正, 我已经尽可能的保证正确的了.
增添数据 (插入数据):
指定插入:
insert into 表名 (列名 1, 列名 2, 列名 3......) values (内容 1, 内容 2, 内容 3);
复制代码
默认插入:
insert into 表名 values (内容 1, 内容 2, 内容 3);
复制代码
以上两种是直接向表中插入数据的方式,
第一种是照应前边的内容进行插入, 第二种方式, 是默认的按照表格内容插入数据,
如果两者数据不足, 都会在表格中以 NULL 的形式插入数据.
删除数据:
指定行删除:
delete from table_name where 字段名 ="指定值";
复制代码
(清空数据表内容, 不释放空间, 即: 下次插入表数据, id 依然接着删除数据的 id 继续增加)
数据删除:
- (注: 以下删除都不会清理掉表的形式, 只会清理掉表的内容;)
- delete * from table_name;
复制代码
(直接删除表格内所有的东西, 不可恢复;)
truncate:truncate table 表名 1;
复制代码
(清空表数据, 释放空间, 即: 下次插入表数据, id 从 1 重新开始)
表删除: drop:drop table 表名 1;
复制代码
(整张表被删除, 要使用该表必须重新建)
修改数据:
指定修改:
update 表名 set 字段名 1='新值', 字段名 2='新值' where 字段名 = 你想要删除行的内容;
复制代码
全部修改:
update 表名 set 字段名 ='新值', 字段名 2='新值';
复制代码
注: 如果不加 where 子句的话, 所有内容都会被改成你指定的值;
查询数据:
全部查询:
select * from 表名;
复制代码
指定列查询:
select 指定的列名 from 表名;
复制代码
去重查询:
select distinct * from 表名;
复制代码
条件查询:
select 字段名 from 表名 where 查询条件;
复制代码
排序查询:
1,select 字段名 from 表名 order by 想要排行的字段名 desc;(倒序)
2,select 字段名 from 表名 order by 想要排行的字段名 asc;(正序, asd 可以省略)
复制代码
求和查询:
select sum (字段) from table1 where 条件;
复制代码
平均值查询:
select avg (字段) from table1 where 条件;
复制代码
最大值查询:
select max (字段) from table1 where 条件;
复制代码
最小值查询:
select min (字段) from table1 where 条件;
复制代码
表关联:
(注, 这里我会用 column_name 代替字段名这个说法, 希望不会影响阅读)
有关表关联这方面, 虽说就功能而言, 这像是在查询中的内容, 但是我还是把它单独列出来了. 毕竟, 这当初可是困扰我的难点.
这个关键字不难, 简单的来说, 就是将两张表放在一起, 通过某一个字段的关联, 来进行合并查询. 以下为目前已知的关联区分;
假设要关联两张表上的 ID 字段进行查询, 那么, 以下为例子 (以下语句均在 ORACLE 数据库中测试过, 可以使用).
第一张表
左关联:
select table_name1 as a left join table_name2 as b on a.id =b.id; (这个语句中, as 可以省略)
复制代码
右关联:
select * from table_name1 as a right join table_name2 as b on a.id =b.id; (这个语句中, as 可以省略)
复制代码
全关联:
- select * from table_name1 as a full join table_name2 as b on a.id=b.id;
- select * from table_name1 a join table_name2 as b on a.id=b.id;(这个语句中, full 和 as 都可以省略)
复制代码
交叉关联:
select * from table_name1 as a cross join table_name2 as b on a.id=b.id(这个语句中, as 可以省略);
复制代码
内关联:
select * from table_name1 as a inner join table_name2 as b on a.id=b.id;(这个语句中, as 可以省略);
复制代码
有关表关联这里, 我在第一遍看的时候, 很闹不明白, 也许是我悟性太差, 后来查了好几人的博客, 才弄清楚这里是怎么一回事, 那么, 在这里稍微说一下个人的见解吧.
(这里提前放一下大佬的链接: www.cnblogs.com/thomasguan/... 如果有兴趣, 可以直接看, 下边的个人见解可以跳过了.)
关联, 就是以你确定的字段名, 进行连接, 然后对应的开始查询, 一般关联的字段名是有一定的相关性的.
通过关联字段名, 你就可以做到一种对比显示, 而要做到对比显示, 就会有以下几种可能性:
1, 左关联: 以左表为主显示, 而右表不显示左表中没有的字段;
2, 右关联: 以右表为主显示, 不显示左表中没有的字段;
3, 全关联: 两个表全部对比, 一一对应, 无论两个表中是否有此行, 都显示;
4, 内关联: 仍旧是一一对应, 但是和上边正好相反, 两个都没有的, 他就都不显示;
5, 交叉关联: 拿其中的一个表的一行, 去对应另一个表中的所有行, 然后将以上对应执行到这个表的最后一个.
以上就是关联查询的几个常见形式了, 当然, 用文字看可能对初学者来说有点绕, 这里我图省事, 就没有放图, 实际上, 要是看结果图, 会非常轻松的明白关联这一块.
由于刚开始的时候, 踩了不少坑, 所以我对这里其实有点打怵. 不过过来之后, 发现其实也就是那么一回事, 太简单了, 简直是傻子都能懂的东西 (等等, 这样会不会说我自己是傻子了? emmmm....)
分组:
- group by
- (这个关键字用起来很简单, 就是通过字段名来将表的内容进行分类)
- select column_name1, column_name2 from table_name group by column_name3;
复制代码
例子:
select XB 性别 ,count(1) 总数 from CET_01 group by XB;
复制代码
以上, 我通过 group by 分组统计了男女生人数, 通过字段的内容进行分组查询;
having
同 where 用法, having 与 group by 连用. where 是筛选单个记录, having 是筛选分组记录 (先分组, 后筛选);
select XB 性别 ,count(1) 总数 from CET_01 group by XB having count(1)>300;
复制代码
还是接着上一个例子, 这里我们想让知道男生和女生中哪个大于 300 人, 我们只需要用 having 子句, 筛选出来就可以了.
注意, 这里有个坑, 有的新手不熟悉, 会以为这里可以用 where 进行筛选, 但是实际上, 这里因为 group by 的分组, where 是没有法使用的, 于是便有了 having 子句.
结语:
说一个悲哀的事实, 我本以为自己把 SQL 的基础语句看的如此扎实了, 应该也没什么大事了, 就算有问题, 凭借我现在的能力, 至少能够看懂吧?
但是两天之后, 我才有些闹心的发现, 真正的遇到问题的时候, 自己的这点水准依旧只是个打杂的, 有很多地方的查询, 不是难在语句上, 而是难在想法和对表的熟悉程度上.
真正在用到的时候, 更多的是对表关联查询的使用, 还有有别名用法, 和关联符的使用.
这个过程中, 真正用到最多的, 是 SQL 中自带的函数, 比如 DECODE(),sum(),avg(),nvl() 一类的函数.
有很多地方, 我写的很重复的 SQL 语句, 之后在大佬检查了之后, 多数会被翻新重写, 我就发现我写的 SQL 很没有灵性.. 至少, 他们的 SQL 写得很简单, 有种逻辑在里边, 而不是我这种重复的基础 SQL.
不得不说, 路还很长, 我还是太嫩, 我还需要继续努力.
最后, 如果有能喷的地方, 请轻喷... 或者, 能戳到痛点上, 给点用处的重喷也行...
本来打算过两天放出自己对函数部分的理解, 但是这两天在公司看了大佬的 SQL 语句后, 瑟瑟发抖... 神仙写法, 很多时候都有种完全没想到的感觉.
等后续能够完全适应了 SQL 中的函数部分, 我会放出自己对 SQL 的理解的, 谢谢.
来源: https://juejin.im/post/5b52871ae51d4519596b8ef5