SQL数据库-基础篇(上)

前言

        SQL(Structured Query Language,结构化查询语言)本身并不是一个具有官方网站的独立产品,而是一种用于与关系数据库进行通信的标准语言。SQL由IBM的Donald D. Chamberlin和Raymond F. Boyce在1970年代开发,并在1974年首次被称为SEQUEL(结构化英语查询语言),后来由于商标冲突问题,更名为SQL‌。

        SQL最初于1986年由美国国家标准协会(ANSI)标准化,1987年由国际标准化组织(ISO)标准化。从那时起,随着关系数据库供应商在其系统中添加了新特性,该标准已经扩展了几次‌。

        如果你对SQL或者某个特定的关系数据库感兴趣,不妨看一下这篇文章,说不定会找到你想要的内容呢!

一、SQL简介

        SQL(Structured Query Language,结构化查询语言),是一种专门用来管理和操作关系型数据库的编程语言。可以说SQL是关系数据库系统的标准语言。SQL通过一系列的语句和命令来执行数据库定义、数据查询、数据操作和数据控制等功能,包括表数据的四大操作,数据库模式创建和修改,以及数据访问控制。

二、SQl数据库的分类

        SQL数据库主要分为关系型数据库和非关系型数据库。关系型数据库如MySQL,PostgreSQL、Oracle、SQL Server等,非关系型数据库如MongoDB、Redis、CouchDB、Elasticsearch等等。

                        关系型数据库                                                非关系型数据库

三、SQL数据库的优缺点

优点:           

  1. 简单易学:SQL的语法相对简单直观,容易学习和使用。

  2. 统一的数据查询标准:不同的数据库管理系统(DBMS)通常都支持SQL,使得开发者可以使用相同的语言进行查询。

  3. 强大的查询功能:SQL提供了丰富的查询功能,包括连接查询、子查询、聚合查询等,可以满足复杂查询需求。

  4. 数据定义能力:SQL允许用户定义数据库的结构,包括表、视图、索引等。

  5. 数据操纵能力:SQL允许用户进行数据的插入、删除、更新和选择操作。

  6. 标准的数据库事务处理:SQL支持事务处理,确保数据的一致性和完整性。

SQL的主要缺点包括:

  1. 性能问题:在某些情况下,SQL的性能可能不如应用程序级别的定制代码。

  2. 可扩展性问题:SQL不适合高度可伸缩和分布式系统。

  3. 复杂查询的性能瓶颈:在处理大量数据和复杂查询时,SQL的性能可能会下降。

  4. 数据库依赖:过度依赖特定数据库系统,移植性差。

四、SQL分类

主要分为一下几类:

DDL(数据定义语言):用于定义数据库的结构,如Create,Alter,Drop等。

DML(数据操纵语言):用于操作数据库中的数据,如Insert、Update、Delete等。

DQL(数据查询语言):用于查询数据库中的数据,如Select等.

DCL(数据控制语言):用于定义数据库的访问权限,如Grant,Revoke等。


4.1 DDL建库

show databases #查询所有的表
select database() #查询当前数据库
CREATE DATABASE [IF NOT EXISTS] 数据库名 default charset utf8 #创建数据库编码为utf-8
drop database [IF NOT EXISTS] 数据库名   #删除数据库 
use 数据库名  #使用

其中[IF NOT EXISTS] 是可选的可以写也可以用于避免在数据库名已存在时产生错误。

4.2 DDL建表

4.1.1 数据类型

字符串类型

        varchar():用于存储可变长度的字符串,长度可以是0到65535个字符;

        char():用于存储固定长度的字符串,长度可以是0到255个字符;

        text:用于存储长文本数据,最大长度为65535个字符;

        tinytext:用于存储非常短的文本数据,最大长度为255字符;

        mediumtext:用于存储中等长度的文本数据,最大长度为16777215个字符;

        longtext:用于存储非常长的文本数据,最大长度为4294967295个字符;

数值类型

        tinyint: 用于存储小的整数,通常用于存储状态标志等。存储范围在-128到127之间。

        smallint:用于存储中等范围的整数,适用于存储较小的数值数据。数值范围在-32768到32767之间。

        mediumint:用于存储中等范围的整数,适用于需要更大范围但不超过bigint的数值数据。存储范围在-8388608到8388607之间。

        int:用于存储标准的整数,是最常用的整数类型之一。范围在-2147483648到2147483647之间。

        bigint:用于存储大范围的整数,使用于需要非常大范围整数的场景。范围在-9223372036854775808到9223372036854775807之间。

float:用于存储单精度浮点数,存在精度损失,适用于需要浮点数的场景。默认长度为4个字节。

        double:用于存储双精度浮点数,精度更高,适用于需要高精度的浮点数计算。默认长度为8个字节。

        decimal或numeric:用于存储定点数,不会出现精度损失,适用于需要精确计算的场景。默认长度为4个字节。

日期类型

        date类型用于存储包含日期的值,格式为“YYYY-MM-DD”。它不包含时间部分,使用于只需要记录日期的场景。

        time类型用于存储一天中的具体时间,格式为“HH:MM”,它不包含日期部分,使用于只需要记录时间的场景。

        datetime类型用于存储完整的日期和时间值,格式为“YYYY-MM-DD HH:MM”。它适用于需要用时记录日期和时间的场景。

        timestamp类型记录从1970年1月1日开始的秒数,并可用于自动记录表的创建和修改时间。它是一种特殊的日期时间类型格式,具有较高的精度和特定的用途,如在需要自动记录数据变更时间的场景中。

        year类型用于存储年份,适用于只需要记录年份信息的场景,它的存储范围较窄,只涉及年份的记录,适用于特定的业务需求。

4.1.2 DDL 表操作

创建并查看表结构

show table #查看数据库中的所有表
desc 表明 #查看表结构
show create table 表名 #查询建表语句

create table if not exists 表名( #判断是否有表,预防在建表时出错
    列名 数据类型  comment'注释',
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; 
    #制定引擎            编码格式                编码

create table if not exists user(
	id int COMMENT'编号',
	name varchar(10) COMMENT'姓名',
	age char(3) COMMENT'年龄'
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

修改表结构

#修改已存在表的编码方式为UTF-8:
ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE 表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

#修改表字段的编码方式为UTF-8:
ALTER TABLE 表名 MODIFY 列名 VARCHAR(100) CHARACTER SET utf8mb4;
ALTER TABLE user MODIFY name VARCHAR(100) CHARACTER SET utf8mb4;

#添加字段
ALTER TABLE 表名 ADD 字段名 类型(长度) comment'注释'
ALTER TABLE user ADD email varchar(20) comment'邮箱'

#修改数据类型
ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度)
ALTER TABLE user MODIFY name  varchar(50)

#修改字段名和字段类型
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度)
ALTER TABLE user CHANGE name name1 varchar(50)

#删除字段
ALTER TABLE 表名 DROP 字段名
ALTER TABLE user DROP email

#修改表名
ALTER TABLE 表名 RENAME TO 新表名
ALTER TABLE user RENAME TO tablename

#删除表
DROP TABLE IF  EXISTS 表名
DROP TABLE IF  EXISTS tablename

#删除并重建(只有表结构没有数据)
TRUNCATE TABLE 表名
TRUNCATE TABLE user

4.3 DML操作数据

4.3.1 DML 添加数据

#给全部字段添加数据
INSERT INTO 表名 VALUES (值1,值2,..)
insert into user VALUES(1,'张三',11),(2,'李四',12)

#给指定字段添加数据
INSERT INTO 表名 (字段1,字段2,.) VALUES(值1,值2,.)
insert into user(id,name) VALUES(1,'张三'),(2,'李四')

4.3.2 DML 修改数据

UPDATE 表名 SET 字段名1=值1,字段名2=值2,. where 条件
update user set name='王五',age=21 where id=1

4.3.3 DML 删除数据

DELETE FROM 表名 [where 条件]
delete from  user where id=1

4.4 DQL 操作数据

Select(字段列表)--form(表名)--where(条件)--group by(分组字段)--having(分组后条件)--order by(排序字段)--limit(分页)

4.4.1 执行顺序

from--where--group by--having--select--order by--limit

4.4.2 查询

4.4.2.1 DQL 基本查询 (select  from)

#查询所有字段
Select * from 表名;

#查询指定字段
Select 字段1,字段2.. from 表名;

#查询字段加别名
Select 字段1 as 别名1,字段2 as 别名2,.. from from;

4.4.2.2 DQL 聚合函数

常见的聚合函数有:

count 统计数量、max 最大的数 、min 最小的数、avg 平均值、sum 求和 

基础使用:
select 聚合函数(字段) as 别名 from 表名

判断使用:
select sum(if(表名.列名>条件,1,0)) from 表名

4.4.2.3 DQL 条件查询(where)

常用的判断有:

条件谓词
比较=、>、<、>=、<=、<>、!=
确定范围between and、not between and
确定集合in、not in
字符配置like not like通配符%,_
逻辑运算与and(&&),或or(||),非not(!),异或xor
空值is null、is not null、isnull
#1、比较:=、>、<、>=、<=、<>、!=
#修改年龄不等于20的学生
update 表名 set 列名='条件' where 列名<>条件
update user SET name ='李四' where age<>21
#判断年龄>=21的学生姓名
Select 列名 as 别名 where 年龄列名>=21


#2、确定范围:between and、not between and
#查询年龄在15到22的学生姓名
Select 姓名列名 from 表名 where 年龄列名 between 15 and 22;


#3、确定集合:in、not in
#查询数字为5,6,7的数据
Select * from 表名 where 列名 in(5,6,7)


#4、字符匹配:like not like通配符%,_
#查询姓名两个字第一个字为李的信息
Select * from 表名 where 姓名列名 like '李_'
#查询姓名中第二个字为三的信息
Select * from 表名 where 姓名列名 like '_三%'
#查询姓名中第一个为李的信息
Select * from 表名 where 姓名列名 like '李%'
#查询姓名中第二字不为三的信息
Select * from 表名 where 姓名列名 not like '_三'


#5、逻辑运算:与and(&&),或or(||),非not(!),异或xor
#查询姓名为张三且年龄大于20的信息
Select * from 表明 where 姓名列名='张三' and age>20
#查询姓名为张三和年龄大于20的信息
Select * from 表名 where 姓名列名='张三' or age>20


#6、空值:is null、is not null、isnull
#查询电话为空的信息
Select * from 表名 where 电话列名 is not

4.4.2.4 DQL 分组查询(group by)

语法

Select 字段 from 表名  where 条件  group by 分组字段 having 分组后的条件

where是不能判断group by 分组后的数据的having是可以代劳的。

举例:

#查询年龄大于20,并根据班级分组,获取班级大于50的班级。
Select 班级列名,count(*) from 表名 where 年龄列名>20 group by 班级列名  having count(*)>50

4.4.2.5 DQL 排序查询(order by)

排序方式:

asc:升序(默认)  desc:降序

#查询按照列名排序显示数据
Select * from 表名 order by 列名 排序方式,..;

4.4.2.6 DQL 分页查询

介绍

起始索引从0开始,起始索引等于查询页数-1,

第一页可以写为limit 20

#查询表中前20个数据
Select * from 表名 limit 20

4.4 DCL 管理用户

4.1 创建用户

create user '用户名'@'主机名' identified by '密码';

4.2 修改密码

alter user '用户名'@'主机名' identified with mysql_native_password by '新密码';

4.3 删除函数

drop user '用户名'@'主机名';

4.4 权限控制

show grants for '用户名'@'主机名';#查询权限
grant 权限列表 on 数据库名.表名 to '用户名'@'主机名';#授予权限
revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名';#撤销权限

到这里上篇也写完了,编写了3,4个钟头,如各位喜欢不妨点赞关注加收藏谢谢大家了,如喜欢我的作品不妨去看看其他的,这下篇我会在这两天更新出来的,感谢大家的阅读。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

とてつもなく

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值