一篇博文,带你入门数据库SQL语言
创始人
2024-04-07 01:51:21
0

目录

📖前言

🎈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数据操纵语言,用来对数据进行操作 (代表指令: insert,delete,update), DML中又单独分了一个DQL,数据查询语言 (代表指令: select)
  • DCL数据控制语言,主要负责权限管理和事务 (代表指令: grant,revoke,commit)
以上SQL我们主要会在后面学习DDL和DML的操作.

🎨数据库的分类

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

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

  1. Oracle:甲骨文产品,适合大型项目,适用于做复杂的业务逻辑,如ERP、OA等企业信息系统。收费
  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语言.

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

相关内容

热门资讯

银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...