SQL字典零基础带你快速上手SQL语言

Posted 慧天城寻

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL字典零基础带你快速上手SQL语言相关的知识,希望对你有一定的参考价值。

目录

📖前言

🎈SQL的分类

🎨数据库的分类

✨SQL的基础操作

⚽SQL常用数据类型

🏉数据库的操作

⚾创建数据库

🥎显示数据库

🏀使用数据库

🏐删除数据库

🍿表的操作

🍕创建表

🍔查看表结构

🍟删除表

🥯表数据的增查改删(CRUD)

🌭表中插入数据

🧇表中查询数据

1️⃣distinct - 去重查询

2️⃣order by - 排序查询

3️⃣where - 条件查询

😶where基本查询

😶and与or运算符查询

😶between and, in范围查询

😶like模糊查询

😶查询数据是否为空(或不空)

4️⃣limit - 分页查询

🧈修改表中数据

🍞删除表中数据

🎉小结ending


📖前言

当第一次学习SQL语言时, 你肯定会有一个疑问, 比如, 什么是SQL? SQL是Structured Query Language的缩写, 意思是结构化查询语言, 是一种在数据库管理系统中查询数据, 或对数据库中的数据进行更改的语言, SQL语言诞生已有40多年的历史, 并且至今各大互联网公司仍在使用, 可想而知SQL语言的重要性,  它是操作数据库的重要语言.

本文篇幅较长, 关注收藏, 耐心食用吧🧐

🎈SQL的分类

我们可以把SQL分为三个部分: DDL数据定义语言, DML数据操纵语言, DCL数据控制语言.
  • DDL数据定义语言,用来维护存储数据的结构 (代表指令: create, drop, alter)
  • DML数据操纵语言,用来对数据进行操作 (代表指令: insertdeleteupdate)DML中又单独分了一个DQL,数据查询语言 (代表指令: select)
  • DCL数据控制语言,主要负责权限管理和事务 (代表指令: grantrevokecommit)
以上 SQL 我们主要会在后面学习 DDL DML 的操作.

🎨数据库的分类

要想了解数据库的分类, 那么我们首先就要知道什么是数据库, 数据库用来干什么, 用生活中的例子来说, 每个学校中都会有自己的教务系统, 而教务系统中又会有各种抽象的数据, 比如老师, 学生, 课程等等, 这些数据就构成了一个数据库.

数据库大致可以分为两类: 关系型数据库 非关系型数据库,  而目前我们见到的关系型数据库比较多,  他们都基于SQL语言, 只是内部一些实验略有区别, 常见的关系型数据库有: 

  1. Oracle:甲骨文产品,适合大型项目,适用于做复杂的业务逻辑,如ERPOA等企业信息系统。收费
  2. mysql:属于甲骨文,不适合做复杂的业务。开源免费
  3. SQL Server:微软的产品,安装部署在windows server上,适用于中大型项目。收费

✨SQL的基础操作

在学习数据库的操作前, 我们首先先了解一下SQL中常用的数据类型.

⚽SQL常用数据类型

数值类型(Number类型): 

字符串类型(Text类型): 

日期类型:

 以上种种类型, 今后经常用到的会是 int double decimal varchar datetime,请读者熟悉.

decimal(size, d) ----- size指的是存储数据的有效数字, d指的是存储数据的小数位数

注意: 日期类型中有一个数据类型为timestamp, 为时间戳, 其支持的范围只能到2038年, 所以在使用中要时刻注意, 以免日后程序发生bug

🏉数据库的操作

⚾创建数据库

创建名为db_test1的数据库

create database db_test1;

 如果系统没有 db_test2 的数据库,则创建一个名叫 db_test2 的数据库,如果有则不创建

create database if not exists db_test2;
创建一个使用  utf8  字符集的 db_test3 数据库
create database db_test3 charset utf8;

在MySQL中可以创建多个数据库, 但数据库名称不能重复, 也不能和SQL语言的关键字重复.

🥎显示数据库

show 数据库名称;

🏀使用数据库

use 数据库名称;

在之后进行的表的操作前, 首先要指定一下使用的数据库, 就需要用到该语句.

🏐删除数据库

drop database 数据库名称;

删除名为db_test4的数据库

drop database db_test4;

如果有一个名为db_test5的数据库, 删除掉

drop database if exists db_test5;

注意: 数据库一旦删除, 里边的表和所有的数据都会被删除, 所有在日后的工作中, 删表需谨慎, 看到drop千万留一个心眼!!!!包括之后我们学习的表操作中的删表操作.

🍿表的操作

🍕创建表

语法:

create table 表名(
    数据1,
    数据2,
    数据3,
    ...
);

并且可以使用comment, --, 或 # 来增加字段说明.

示例: 创建一个名为'teacher'的表

设计一张老师表,包含以下字段:姓名、年龄、身高、体重、性别、学历、生日、身份证号

create table teacher(
	name varchar(20),
	age int,
	height double,
	weight double,
	sex bit,
	birthday TIMESTAMP,
	id_number varchar(18)
);

创建成功

注意: 创建表时, 表名不可以与SQL语言的关键字重复, 如果非要使用关键字来命名, 可以加上反引号 `表名` , 即可创建成功, 在创建表时, 要选择合适的数据类型来存放数据, 避免造成不必要的错误.

🍔查看表结构

语法:

desc 表名;

示例: 查看名为 'teacher' 的表结构

desc teacher;

表中第一层各个英文单词所代表的含义: 

Field: 字段名字

Type: 字段类型

Null: 是否允许为空

Key: 索引类型 

Default: 默认值

Extra: 扩充

这些都是表的属性.

🍟删除表

语法:

drop table 表名;

示例: 删除一个名叫 'student' 的表

删除成功

drop database if exists student;

🥯表数据的增查改删(CRUD)

 有了表格后, 我们就可以进行表中数据的操作, 要想在表中增删查改数据, 我们先创建一个表, 后文中我们介绍增查改删数据时,均使用下面我创建的stu_exam表(学生成绩表). 运用我们上面所学创建表的知识, 就可以轻松完成.

create table stu_exam(
    id int, name varchar(20),
    chinese decimal(3,1), 
    math decimal(3,1), 
    english decimal(3,1)
);

CRUD 即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首字母缩写 

🌭表中插入数据

语法:

全列插入:

insert into 表名 values (数据1, 数据2, 数据3, ...);

 指定列插入:

insert into 表名 (列1, 列2, 列3, ...) values (数据1, 数据2, 数据3, ...);

示例1: 插入一个名叫小樊的学生的语数英成绩 

insert into stu_exam values (1, '小樊', 98, 89, 56);

数据不仅可以全列插入, 还可以实现 指定列插入, 上面的代码, 也可以写为下面这种形式:

insert into stu_exam (id, name, chinese, math, english) values (1, '小樊', 98, 89, 56);

指定列插入操作, 如果有没指定的列, 默认为null.

SQL插入语句也可以实现 在表中插入多行数据

示例2: 多行插入, 插入两个学生的成绩数据

insert into stu_exam values (2, '小王', 67, 78, 89),(3, '小高', 78, 79, 95);

这样就插入成功了, 经过三次插入后, stu_exam表中应该有三个学生数据, 那么我们如何查看表中的数据呢? 这就需要下面我们讲到的 select 关键字了.

🧇表中查询数据

语法:

全列查询:

select * from 表名;

指定列查询:

select 列名称1, 列名称2, 列名称3, ... from 表名;

示例1: 查询stu_exam表中所有列

select * from stu_exam;

如图所示, 查询到的之前建好并插入列后的stu_exam表中的所有列.

示例2: 查询stu_exam表中的 id 和 name 列

select id, name from stu_exam;

 如图所示, 查询到stu_exam表中的 id 和 name 列.

拓展1: 查询字段为表达式时

-- 表达式不包含字段
--表达式不包含字段
select id, name, 10 from stu_exam;

 -- 表达式包含一个字段

--表达式包含一个字段
select id, name, math + 10 from stu_exam;

注意: 此时我们的表达式查询, 查询后得到的表, 是临时表, 并没有真正的给表中数据修改值, 它只是一个临时表, 当我们再次查询表中数据时, 还是他原本的值, 而不是+10 后的结果, 三位同学数据并未发生改变. 如下图所示.

包括在后文要教的各种查询中, 我们查询到的其实都是临时表, 进行的操作, 并不会影响到表中原本的值, 只有在 delete , update 这种操作, 才会直接修改表中数据, 同学们一定要牢记, 所以像这种delete, update能真正修改表中数据的操作在使用中十分危险, 稍一疏忽, 就会把原本的数据搞丢, 看到后操作需谨慎!!!

-- 表达式包含多个字段
--表达式包含多个字段
select name, chinese + math + english from stu_exam;

拓展2: 为查询结果中的列制定别名

select name, chinese + math + english as total from stu_exam;

 如上图所示, 用关键字 as 为查询的 chinese + math + english 取别名为 total.

1️⃣distinct - 去重查询

语法:

select distinct 列名1, 列名2, 列名3, ... from 表名;

示例: 去重 chinese 分数相同的数据

去重前:

去重后:

注意: 当去重多个列时, 只有列对应数据都相同时, 才会被去重, 否则不会被去重. 

如图所示, 语文成绩相同但数学成绩不同的同学, 其数据并不会被去重.

2️⃣order by - 排序查询

语法:

select 列名1, 列名2, 列名3, ... from 表名 order by 列名(制定被排序) [asc/desc];
-- [ ]中内容可加也可不加
-- asc为升序, desc为降序
-- 不制定排序方法的话, 默认为asc

示例1: 将stu_exam中数据按math成绩降序排序

select * from stu_exam order by math desc;

如图所示, 表中数据根据math成绩进行了降序排序, 此为临时表.

当我们插入一个同学成绩都为null, 他的成绩应该排在哪里呢?

insert into stu_exam values(6, '黑大帅', null, null, null);

 我们进行一次升序查询, 一次降序查询, 可以看到, null的值比所有的有值数字都小, 永远是最小的

示例2: 查询同学及总分, 由高到低

select name, chinese + math + english as total from stu_exam order by total desc;

示例3: 查询同学各门成绩, 数学降序, 语文升序, 英语降序

select name, chinese, math, english from stu_exam order by math desc, chinese asc, english desc;

此排序优先级随书写顺序.

注意: 

  • 没有 order by 子句的查询, 返回的顺序都是未定义的, 永远不要依赖这个顺序, 否则会出错误
  • null 数据排序, 视为比任何值都小, 升序在最上面, 降序在最下面
  • 可以配合表达式及别名来使用, 效果如示例2
  • 可以对多个字段进行排序, 效果如示例3

3️⃣where - 条件查询

当我们需要在表中查找某些特定数据时, 我们可以使用where来指定我们需要的数据, 进行条件查询.

语法:

select 列名 from 表名 where 列名 运算符 值;

要想更好的使用where查询, 我们需要先知道SQL中有哪些运算符:

比较运算符

运算符说明
>, >=, <, <=大于, 大于等于, 小于, 小于等于
=等于
<=>等于
!=, <>不等于
between x1 and x2[x1, x2], 如果value在这个区间, 返回true(1)
in(option, ...)如果是option中的任意一个, 返回true(1)
is null是null
is not null不是null
like模糊匹配

逻辑运算符

运算符说明
and与, 两边条件都必须为true(1), 结果才为true(1)
or或, 两边条件任意一个为true(1), 结果为true(1)
not非, 条件为true(1), 结果为false(0)

注:

  • = 和 <=> 虽然都是等于, 但是在与null相比较时, 结果并不同, SQL中null并不安全, 比较运算符与null相比较, 其结果都会变成null, null = null 的结果是null, 但 <=> 与 = 不同, null <=> null 的结果是true, 所以在操作与null有关的计算时, 一定要注意
  • 在同时使用and 和 or 运算符时, 要注意优先级问题, and运算符的优先级要高于or, 所以可以用小括号()来选择需要优先执行的部分

在初步了解SQL中有哪些运算符后, 下面我们深入讲一下, 其中一些操作符的使用方法以及where查询语句的实现.

在进行where讲解前, 我们建立一张新表exam_test, 并给其插入一些数据进去, 读者也运用之前所学create, insert 知识, 根据自己喜欢来创建表, 插入数据.

create table exam_test(
    id int, name varchar(20), 
    chinese int, 
    math int, 
    english int
);

insert into exam_test values
 (1, '成龙', 67, 98, 56),
 (2, '小玉', 87.5, 78, 77),
 (3, '黑虎阿福', 88, 98.5, 90),
 (4, '老爹', 82, 84, 67),
 (5, '牛战士', 55.5, 85, 45),
 (6, '瓦龙', 70, 73, 78.5),
 (7, '特鲁', 85, 97, 35);

 并使用select语句查询表中所有内容, 结果如下:

  

 接下来进入我们where的几个用法, 及运算符使用方法.

😶where基本查询

示例一: 查询英语不及格的学生及其成绩(english < 60)

select name, english from exam_test where english < 60;

   

 示例二: 查询自己的语文成绩比数学成绩高的学生(chinese > math)

select name, chinese, math from exam_test where chinese > math;

 示例三: 查询成绩总分在200分以下的学生(chinese + math + english < 200)

select name, chinese + math + english as total from exam_test where chinese + math + english < 200;

 示例四: 查询语文成绩等于88的学生(chinese = 88)

select name, chinese from exam_test where chinese = 88;

😶and与or运算符查询

示例一: 查询语文成绩大于80 数学成绩大于85的同学 (and)

select name, chinese, math from exam_test where chinese > 80 and math > 85;

示例二: 询语文成绩大于80 或 数学成绩大于85的同学 (or)

select name, chinese, math from exam_test where chinese > 80 or math > 85;

 补: and 和 or 优先级

 根据之前讲的知识and优先级高于or, 请读者想一下, 以下两个操作的运行结果相同吗?

-- 不加括号
select name, chinese from exam_test where chinese > 80 or math > 70 and english > 70;

-- 加括号
select name, chinese from exam_test where (chinese > 80 or math > 70) and english > 70;

揭晓答案: 

可以看到查询结果并不相同, 原因就是两个操作的运算顺序不同, 不加括号的话, 根据优先级先进行and运算, 再进行or运算. 加上括号后, 先进行是or运算, 再进行and运算, 所以导致了不同的结果. 读者在使用and和or运算符查询时, 一定要注意优先级, 如果忘记谁的优先级高的话, 就加括号来指定运算顺序.

😶between and, in范围查询

要进行范围查询, 我们需要用到运算符 between ... and ... 和 in.

示例一: 查询数学成绩在[80, 90]区间内的同学及其成绩(math between 80 and 90)

select name, math from exam_test where math between 80 and 90;

 当然也可以使用and单个运算符来实现.

select name, math from exam_test where math >= 80 and math <= 90;

可以看到, 查询结果是相同的, 但这里博主还是建议使用between and来进行范围查询, 如果数据过大, 因为and需要进行两个查询, 相较于between and一次查询, 操作时间会变长.

示例二: 查询数学成绩是 78 或者 84 或者 98 或者 99 分的同学及数学成绩( in (78, 84, 98, 99) )

select name, math from exam_test where math in (78, 84, 98, 99);

 与and同理, 也可以使用 or 来实现

select name, math from exam_test where math = 78 or math = 84 or math = 98 or math = 99;

 同样建议使用 in 运算符, 原因与 between and 相同.

😶like模糊查询

当我们需要匹配字符类型的数据时, 可以使用之前的 = 来匹配, 假如我们要查找 成龙 的数学成绩, 可以写成:

select name, math from exam_test where name = '成龙';

 

如图, 查询成功

那如果我们需要进行模糊匹配时, 应该怎样做呢? 这时我们就需要用到like来进行模糊查询 

语法: 

select 列名1, 列名2, 列名3, ... from 表名 where 列名 like 查询值;

看例子前, 首先需要先了解like查询中的两个符号:(我们依旧以学生成绩系统来了解符号用法)

  •  % ---- 匹配任意多个(包括0个)字符, '孙%' 代表姓孙的人, '%孙%' 代表姓名中含孙的人, '%孙' 代表姓名以孙结尾的人
  • _ ---- 匹配严格的一个任意字符, 用法与%相同, 但比%更加严格, 只能匹配一个字符, 如 '孙_' 代表姓名为两个字并且姓孙的人

示例一: 查询名字以 '龙' 结尾的同学数学成绩(%龙)

select name, math from exam_test where name like '%龙';

  

 如图所示, 成龙, 瓦龙, 小白龙的数学成绩被查询了出来

示例二: 查询两个字的名字并且以 '龙' 结尾的同学的数学成绩(_龙)

select name, math from exam_test where name like '_龙';

 相信读者现在已经能看出一些 '%' 和 '_' 的区别了吧

示例三: 查询名字中带 '虎' 的同学的语文和英语成绩(%虎%)

select name, chinese, english from exam_test where name like '%虎%';

示例四: 查询名字中不带 '龙' 的同学的全部数据(not like '%龙%') 

select * from exam_test where name not like '%龙';

可以看到, 配合not使用, 就可以达到一个否定的作用.

😶查询数据是否为空(或不空)

前文我们提到过, null是一个危险的值, 任何数据与null进行 = 运算, 都会变成null, 而为了安全, 我们会使用 <=> 来与null进行比较, 除了<=>以外, 判断是否为空(或不空)的时候, 我们也会使用is (not) null来进行判断.

首先我们给exam_test表中插入一个学生数据(成绩均为null).

insert into exam_test values (9, '乌鸦坐飞机', null, null, null);

示例一: 查询缺考数学(数学成绩为null)的同学名字

select name, math from exam_test where math is null;

 如图所示, 查询到了缺考数学的同学

示例二: 查询有数学成绩的同学名字

select name, math from exam_test where math is not null;

4️⃣limit - 分页查询

在我们日常学习中, 数据库中数据还不算多, 但是在大部分公司内, 数据量都非常的大, 上万条数据存放在一个表内都很有可能, 如果我们还要查询整张表的话, 数据库服务器的操作量就非常的大, 这时我们就需要用到limit分页查询了, 他可以把多行数据分为你想要的页数, 可以自己来指定一页显示多少行数据, 从而避免直接查询上万条数据, 给服务器造成拥堵.

语法:

-- 从0开始, 筛选n条结果
select 列名1, 列名2, 列名3, ... from 表名 [where ...] [order by ...] limit n;
-- 从s开始, 筛选n条结果
select 列名1, 列名2, 列名3, ... from 表名 [where ...] [order by ...] limit s, n;
-- 从0开始, 筛选n条结果, 比第二种更明确, 建议使用
select 列名1, 列名2, 列名3, ... from 表名 [where ...] [order by ...] limit n offset s;

注:

  • 起始下标为0
  • [ ] 中子句是我们前文学到的,
  • 可添加也可不加, 加上可以实现其对应的操作 
  • 如where的一系列查询操作, order by的排序功能

示例: 按 id 进行分页,每页 3 条记录,分别显示 第 1、2、3 页

显示第一页:

select * from exam_test limit 3 offset 0;

显示第二页:

select * from exam_test limit 3 offset 3;

  

显示第三页:

select * from exam_test limit 3 offset 6;

 

 就这样, 我们通过limit将表分成了三页来查看.

🧈修改表中数据

当我们想修改插入表后的数据时, 我们就需要用到关键字update, 此修改是永久修改, 与之前我们学的select查询操作不同, 查询操作创建的都是临时表, 表内数据就算有修改也不会影响其原始数据, 而update会直接修改原始数据.

语法:

update 表名 set 列名1 = 期望的新值, 列名2 = 期望的新值, ... [where ...] [order by ...] [limit ...]; 

示例一: 将特鲁的英语成绩修改为100分 

update exam_test set english = 100 where name = '特鲁';

如图所示, 特鲁的英语成绩已被修改为100. 

示例二: 将小玉的语文成绩修改为89分, 数学成绩修改为78分 

如图所示, 已按要求修改数据.

示例三: 将总成绩排名前三的同学的数学成绩减三十分 

update exam_test set math = math - 30 order by chinese + math + english desc limit 3;

示例四: 将所有同学的语文成绩变为之前的两倍

update exam_test set chinese = Chinese * 2;

  

🍞删除表中数据

除了可以添加, 修改, 查询数据外, 我们也可以使用delete来删除掉我们不需要的数据(行), 与修改操作相同, 删除操作造成的结果是永久的.

语法:

delete from 表名 [where ...] [order by ...] [limit ...];

示例一: 删除exam_test表中老爹的所有数据

delete from exam_test where name = '老爹';

 如图所示, 老爹的数据已经从表中被移除掉了.

示例二: 删除exam_test表中的所有数据

delete from exam_test;

此操作与前面讲的删除表(drop table exam_test;)不一样, drop是将表本身及表内数据全都删掉, 而delete处理的只是表中数据, 并不会删掉表, 表本身的结构,属性都还是完整的, 还可以继续在表内插入数据等等.


🎉小结ending

✨感谢你们的耐心阅读, 博主本人也是一名学生, 也还有需要很多学习的东西. 写这篇文章是以本人所学内容为基础, 日后也会不断更新自己的学习记录, 我们一起努力进步, 变得优秀, 小小菜鸟, 也能有大大梦想, 关注我, 一起学习。

✨数据库SQL语言的基本操作就先告一段落了, 学习后可以使自己轻松操作表数据, 进阶内容我会放在下篇SQL博客中讲解, 请关注插眼, 带你继续学习SQL语言.

再次感谢你们的阅读, 你们的鼓励是我创作的最大动力!!!!!

小白都能看懂的SQL零基础入门,一文带你轻松学会增删改查!

作者简介

  • 作者:LuciferLiu,中国DBA联盟(ACDU)成员。
  • 目前从事Oracle DBA工作,曾从事 Oracle 数据库开发工作,主要服务于生产制造,汽车金融等行业。
  • 现拥有Oracle OCP,OceanBase OBCA认证,擅长Oracle数据库运维开发,备份恢复,安装迁移,Linux自动化运维脚本编写等。

前言

  • SQL是什么?

官方解释:SQL (Structured Query Language:结构化查询语言) 是用于管理关系数据库管理系统(RDBMS)。

  • SQL能用来干什么?

通俗的讲:让您可以访问和处理数据库,包括数据插入、查询、更新和删除。

SQL

讲解

  • 下面让我们看看小美是如何零基础学习SQL的:

👸小美: Lucifer,最新领导让我负责数据库开发,需要写SQL,但是我零基础没学过,有办法快速入门吗?

🙉Lucifer: 小美啊,SQL语言其实入门不难,我先来教你最简单的增删改查基础吧。

👸小美: 好的,我试试看,奥力给。

在这里插入图片描述

🙉Lucifer: Ok,那我们先来一个最简单常用的SQL语句DUAL查询: SELECT SYSDATE FROM DUAL;

sysdate

🙉Lucifer: 使用这个SQL语句可以查看数据库当前时间,当然也可以把 SYSDATE 换成任意东西。

例如:

计算器:SELECT 365 * 24 FROM dual;

计算器

🙉Lucifer: 这个SQL我们在开发中会经常用到,作为入门第一个SQL轻松有趣。小美,你觉得难吗?

👸小美: 这个太实用了,以后计算器和日历都可以省了,哈哈哈。

🙉Lucifer: 是的,其实我们刚刚已经不经意的学习了SQL语言增删改查中的 操作了。接下来,我要介绍一个新的对象: :是相关的数据项的集合,它由列和行组成。通俗的讲,数据库相当于图书馆,表就类似于其中的一个个书架,表数据就类似于一本本书。我们查询数据库表的数据,就好比我们进入图书馆去找一本喜欢的书。我这么说,你能理解吗?

  • 的基本语法:select * from 表名;

👸小美: 可以可以,这个比喻我一下子就听懂了,原来数据库查询是这样的,那表是怎么创建的呢?

🙉Lucifer: 不要着急,先来介绍一下数据库中最常用的3个数据类型:NUMBER,VARCHAR2,DATE,分别为数字型,字符型,日期型。顾名思义,即用来定义表中列字段用来存放数据的类型。

数据类型

👸小美: 嗯嗯,这个能理解,跟java,C 好像有些相似。

🙉Lucifer: 嗯嗯。理解了这个,就可以开始建表了,现在来创建一个简单的图书馆书架表。

CREATE TABLE bookshelf
(
BOOK_ID NUMBER,
BOOK_NAME VARCHAR2(100),
BOOK_TYPE VARCHAR2(100),
AUTHOR VARCHAR2(100),
INTIME DATE
);

🙉Lucifer: 表名为:bookshelf,有列:图书id,图书名称,图书类型,作者,入库时间。通过上面学习的 SELECT语法,来查询一下这张表:

SELECT * FROM bookshelf;

查询图书表

🙉Lucifer: 可以发现,新建的bookshelf表没有任何记录。现在,图书馆里已经增加一个空的书架,是不是需要将书放入书架上呢?这时就需要用到 操作了。

👸小美: 嗯嗯,很形象,感觉自己就像个图书管理员一样,哈哈哈。

🙉Lucifer: 哈哈,没错,我们数据库管理员跟图书管理员可以说是异曲同工。好了,继续说放书吧,现在假设有一本书《飘》,作者:玛格丽特·米切尔,类型:长篇小说。现在通过 INSERT 将这本书放入书架上:

INSERT INTO bookshelf 
(book_id,
book_name,
book_type,
author,
intime)
VALUES
(1,
'飘',
'长篇小说',
'玛格丽特·米切尔',
SYSDATE);
COMMIT;
  • 的基本语法:insert into 表名 (需要插入的列名,用逗号隔开) values (对应列名的值);
    在这里插入图片描述

🙉Lucifer: 通过sql查询发现,这本书《飘》已经放入了书架上,可供大家借用和查看。

👸小美: 太形象了,那如果我把书的作者写错了,那怎么办呢?再插入一条吗?

🙉Lucifer: 这个问题问的很好,因为人为的操作总会存在误差,因此提出了 两种操作。

  • 的基本语法: UPDATE 表名 SET 列名 = 新的值;

  • 的基本语法: DELETE FROM 表名;

现在来模拟一下场景:

1 修改作者名:

UPDATE bookshelf SET author='Margaret Mitchell';
COMMIT;

修改作者名
2 下架图书:

DELETE FROM bookshelf;
COMMIT;

在这里插入图片描述
通过以上两个场景,演示了 两种操作。

👸小美: lucifer,你讲的很明了,我现在已经懂了增删改查四种操作了,迫不及待想要动手开始操作了!

🙉Lucifer: 小美,先别急,你没有发现一个严重的问题吗?如果书架上不止一本书呢?那你怎么对指定的那本书进行操作呢?有思考过吗?

👸小美: 啊!对哦,上面都是演示的一本书,如果有多本书,是不是也有对应的操作可以来筛选呢?

🙉Lucifer: 没错,很聪明。现在隆重有请 WHERE 查询条件登场。正如上面所说,WHERE 子句用于提取那些满足指定条件的记录。

在这里插入图片描述

先上架3本书:

INSERT INTO bookshelf (book_id,book_name,book_type,author,intime) VALUES (1,'飘','长篇小说','玛格丽特·米切尔',SYSDATE);
INSERT INTO bookshelf (book_id,book_name,book_type,author,intime) VALUES (2,'倾城之恋','爱情小说','张爱玲',SYSDATE);
INSERT INTO bookshelf (book_id,book_name,book_type,author,intime) VALUES (3,'从你的全世界路过','短篇小说','张嘉佳',SYSDATE);
COMMIT;

插入数据

查看《倾城之恋》:

SELECT * FROM bookshelf WHERE BOOK_NAME = '倾城之恋';

在这里插入图片描述

更新《飘》:

UPDATE bookshelf SET author='Margaret Mitchell' WHERE book_name = '飘';
COMMIT;

在这里插入图片描述
删除《从你的全世界路过》:

DELETE FROM bookshelf WHERE book_name = '从你的全世界路过';
COMMIT;

在这里插入图片描述

通过上面的几个栗子🌰,应该能很好的理解 WHERE 查询条件的使用了。

👸小美: 懂了懂了,lucifer,我现在是不是可以去开发了?好像练练手啊!!!

🙉Lucifer: 嗯。现在只能说是入门了,会简单的增删改查是数据库开发的第一部,所有的数据库操作都是基于SQL语言的。

👸小美: 好的好的。有问题了,我在继续问你,谢谢lucifer!!!Thanks♪(・ω・)ノ。

在这里插入图片描述
文末,赠送给各位看官几个一句SQL画图的趣味小SQL:

  • 五角星:
WITH a AS
 (SELECT DISTINCT round(SUM(x) over(ORDER BY n)) x,
                  round(SUM(y) over(ORDER BY n)) y
    FROM (SELECT n,
                 cos(trunc(n / 20) * (1 - 1 / 5) * 3.1415926) * 2 x,
                 sin(trunc(n / 20) * (1 - 1 / 5) * 3.1415926) y
            FROM (SELECT rownum - 1 n
                    FROM all_objects
                   WHERE rownum <= 20 * 5)))
SELECT REPLACE(sys_connect_by_path(point,
                                   '/'),
               '/',
               NULL) star
  FROM (SELECT b.y,
               b.x,
               decode(a.x,
                      NULL,
                      ' ',
                      '*') point
          FROM a,
               (SELECT *
                  FROM (SELECT rownum - 1 + (SELECT MIN(x)
                                               FROM a) x
                          FROM all_objects
                         WHERE rownum <= (SELECT MAX(x) - MIN(x) + 1
                                            FROM a)),
                       (SELECT rownum - 1 + (SELECT MIN(y)
                                               FROM a) y
                          FROM all_objects
                         WHERE rownum <= (SELECT MAX(y) - MIN(y) + 1
                                            FROM a))) b
         WHERE a.x(+) = b.x
           AND a.y(+) = b.y)
 WHERE x = (SELECT MAX(x)
              FROM a)
 START WITH x = (SELECT MIN(x)
                   FROM a)
CONNECT BY y = PRIOR y
       AND x = PRIOR x + 1;

在这里插入图片描述

注意:调整期中数字5, 你还可以输出7角星, 9角星。

  • 奥运五环:
WITH a AS
 (SELECT DISTINCT round(a.x + b.x) x,
                  round(a.y + b.y) y
    FROM (SELECT (SUM(x) over(ORDER BY n)) x,
                 round(SUM(y) over(ORDER BY n)) y
            FROM (SELECT n,
                         cos(n / 30 * 3.1415926) * 2 x,
                         sin(n / 30 * 3.1415926) y
                    FROM (SELECT rownum - 1 n
                            FROM all_objects
                           WHERE rownum <= 30 + 30))) a,
         (SELECT n,
                 (SUM(x) over(ORDER BY n)) x,
                 round(SUM(y) over(ORDER BY n)) y
            FROM (SELECT n,
                         cos(m / 3 * 3.1415926) * 2 * 15 x,
                         sin(m / 3 * 3.1415926) * 15 y
                    FROM (SELECT CASE
                                   WHEN rownum <= 2 THEN
                                    3
                                   WHEN rownum = 3 THEN
                                    -2
                                   ELSE
                                    -6
                                 END m,
                                 rownum - 1 n
                            FROM all_objects
                           WHERE rownum <= 5))) b)
SELECT REPLACE(sys_connect_by_path(point,
                                   '/'),
               '/',
               NULL) star
  FROM (SELECT b.y,
               b.x,
               decode(a.x,
                      NULL,
                      ' ',
                      '*') point
          FROM a,
               (SELECT *
                  FROM (SELECT rownum - 1 + (SELECT MIN(x)
                                               FROM a) x
                          FROM all_objects
                         WHERE rownum <= (SELECT MAX(x) - MIN(x) + 1
                                            FROM a)),
                       (SELECT rownum - 1 + (SELECT MIN(y)
                                               FROM a) y
                          FROM all_objects
                         WHERE rownum <= (SELECT MAX(y) - MIN(y) + 1
                                            FROM a))) b
         WHERE a.x(+) = b.x
           AND a.y(+) = b.y)
 WHERE x = (SELECT MAX(x)
              FROM a)
 START WITH x = (SELECT MIN(x)
                   FROM a)
CONNECT BY y = PRIOR y
       AND x = PRIOR x + 1;

奥运五环

  • 打印当月日历:
SELECT MAX(decode(dow,
                  1,
                  d,
                  NULL)) sun,
       
       MAX(decode(dow,
                  2,
                  d,
                  NULL)) mon,
       
       MAX(decode(dow,
                  3,
                  d,
                  NULL)) tue,
       
       MAX(decode(dow,
                  4,
                  d,
                  NULL)) wed,
       
       MAX(decode(dow,
                  5,
                  d,
                  NULL)) thu,
       
       MAX(decode(dow,
                  6,
                  d,
                  NULL)) fri,
       
       MAX(decode(dow,
                  7,
                  d,
                  NULL)) sat

  FROM (SELECT rownum d,
               
               rownum - 2 + to_number(to_char(trunc(SYSDATE,
                                                    'MM'),
                                              'D')) p,
               
               to_char(trunc(SYSDATE,
                             'MM') - 1 + rownum,
                       'D') dow
        
          FROM all_objects
        
         WHERE rownum <=
              
               to_number(to_char(last_day(to_date(SYSDATE)),
                                 'DD')))

 GROUP BY trunc(p / 7)

 ORDER BY sun NULLS FIRST;

打印日历

本次分享到此结束啦~

如果觉得文章对你有帮助,点赞、收藏、关注、评论,一键四连支持,你的支持就是我创作最大的动力。

技术交流可以 关注公众号:Lucifer三思而后行

以上是关于SQL字典零基础带你快速上手SQL语言的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询入门(上篇)

小白都能看懂的SQL零基础入门,一文带你轻松学会增删改查!

Mysql快速上手一(基础知识数据模型数据类型SQL语句)

JAVA基础入门教程 -

MySQL高级篇数据库到底是什么?一文带你快速上手MySQL

Python 学习资源