【SQL】❤️数据库理论加实践详细教程❤️实践出真知❤️

news2024/11/25 16:19:42

SQL(结构化查询语言)

请添加图片描述

基础部分


SQL作用

按照作用划分可以划分为四个模块,从而由此行文

  1. DDL(数据定义语言):
    DDL涉及的命令允许用户定义或修改数据库的结构。主要命令包括:

    • CREATE:用于创建新的数据库对象,如表、视图、索引等。
    • ALTER:用于修改现有数据库对象的结构。
    • DROP:用于删除数据库对象。
    • TRUNCATE:用于删除表中的数据,但保留表结构。
  2. DML(数据操纵语言):
    DML涉及的操作允许用户对数据库中的数据进行各种操纵。主要命令包括:

    • INSERT:向表中添加新行。
    • UPDATE:修改表中的现有数据。
    • DELETE:从表中删除数据。
  3. DQL(数据查询语言):
    DQL基本上只涉及一个命令,那就是SELECT,但它非常强大和复杂,允许用户检索数据库中的数据,并支持多种选项和构造,如WHERE子句、JOINs和子查询等。

  4. DCL(数据控制语言):
    DCL包括用于配置或限制用户对数据库所做更改的权限的命令。主要包括:

    • GRANT:授权用户访问和操纵数据库的权限。
    • REVOKE:撤销用户的权限。
  5. TCL(事务控制语言):
    TCL用于管理数据库中的事务。这包括以下命令:

    • COMMIT:提交一个事务,使所有数据变更成为永久性的。
    • ROLLBACK:回滚事务,撤销自上一个提交以来执行的所有未提交的变更。
    • SAVEPOINT:在事务内部设置一个回滚点。

SQL数据类型

名称类型说明
INT整型4字节整数类型,范围约+/-21亿
BIGINT长整型8字节整数类型,范围约+/-922亿亿
REAL浮点型4字节浮点数,范围约+/-1038
DOUBLE浮点型8字节浮点数,范围约+/-10308
DECIMAL(M,N)高精度小数由用户指定精度的小数,例如,DECIMAL(20,10)表示一共20位,其中小数10位,通常用于财务计算
CHAR(N)定长字符串存储指定长度的字符串,例如,CHAR(100)总是存储100个字符的字符串
VARCHAR(N)变长字符串存储可变长度的字符串,例如VARCHAR(100)可以存储0~100个字符的字符串
BOOLEAN布尔类型存储True或者False
DATE日期类型存储日期,例如,2018-06-22
TIME时间类型存储时间,例如,12:20:59
DATETIME日期和时间类型存储日期+时间,例如,2018-06-22 12:20:59

安装MySQL

  • 使用phpstudy安装MySQL
    1. 下载PHPstudy
      从phpstudy官网下载最新phpstudy版本(https://www.xp.cn/download.html),目前最新版本为v8.1。根据需要选择对应版本下载,

    2. 安装phpstudy
      解压后,运行安装程序,默认安装即可。安装结束后,运行程序,启动mysql数据库。

    3. 将mysql添加到系统变量
      (1) 找到phpstudy安装文件的中mysql的bin文件目录,默认路径为D:\phpstudy_pro\Extensions\MySQL5.7.26\bin
      (2) 桌面右键计算机,win10 系统为“此电脑”。依次找到“属性”——“高级系统设置”——“环境变量”——“系统变量”——“Path”——“编辑”

    4. 登录数据库
      快捷键“win+R”,输入cmd,回车运行。
      mysql -u root -p , 随后输入口令即可,默认为root

  • 官网下载MySQLCommunityServer版本
  • Linux上安装MySQL
    可以使用发行版的包管理器。例如,Debian和Ubuntu用户可以简单地通过命令apt-get install mysql-server安装最新的MySQL版本。

关系模型

关系模型本质上就是若干个存储数据的二维表,可以把它们看作很多Excel表,一张表中的每一行数据被称为一条记录。一条记录就是由多个字段组成

主键

  • 1.什么是主键?
    对于关系表,有个很重要的约束,就是任意两条记录不能重复。不能重复不是指两条记录不完全相同,而是指能够通过某个字段唯一区分出不同的记录,这个字段被称为主键。

  • 2.如何选择主键?
    对主键的要求,最关键的一点是:记录一旦插入到表中,主键最好不要再修改,因为主键是用来唯一定位记录的,修改了主键,会造成一系列的影响。
    主键不要带有业务含义,而应该使用BIGINT自增或者GUID类型。主键也不应该允许NULL。

  • 3.常见的可作为id字段的类型?

    • INT自增类型:数据库会在插入数据时自动为每一条记录分配一个自增整数,这样我们就完全不用担心主键重复,也不用自己预先生成主键;
    • 唯一GUID类型:使用一种全局唯一的字符串作为主键,类似8f55d96b-8acc-4636-8cb8-76bf8abc2f57。GUID算法通过网卡MAC地址、时间戳和随机数保证任意计算机在任意时间生成的字符串都是不同的,大部分编程语言都内置了GUID算法,可以自己预算出主键。

外键

关系数据库通过外键可以实现一对多、多对多和一对一的关系。外键既可以通过数据库来约束,也可以不设置约束,仅依靠应用程序的逻辑来保证。

  • 1.什么是外键?
    在students表中,通过class_id的字段(是class班级表的主键),可以把数据与另一张表关联起来,这种列称为外键。

  • 2.外键实现?
    外键并不是通过列名实现的,而是通过定义外键约束实现的:

ALTER TABLE students
ADD CONSTRAINT fk_class_id
FOREIGN KEY (class_id)
REFERENCES classes (id);

其中,外键约束的名称fk_class_id可以任意,FOREIGN KEY (class_id)指定了class_id作为外键,REFERENCES classes (id)指定了这个外键将关联到classes表的id列(即classes表的主键)。
通过定义外键约束,关系数据库可以保证无法插入无效的数据。即如果classes表不存在id=99的记录,students表就无法插入class_id=99的记录。
要删除一个外键约束,也是通过ALTER TABLE实现的:

ALTER TABLE students
DROP FOREIGN KEY fk_class_id;

注意:删除外键约束并没有删除外键这一列。删除列是通过DROP COLUMN …实现的。

  • 3.多对多关系?
    多对多关系实际上是通过两个一对多关系实现的,即通过一个中间表,关联两个一对多关系,就形成了多对多关系。

  • 4.一对一关系?
    一对一关系是指,一个表的记录对应到另一个表的唯一一个记录。

隐式索引

  • 1对列创建索引?
    如果要经常根据score列进行查询,就可以对score列创建索引:
ALTER TABLE students
ADD INDEX idx_score (score);

索引的效率取决于索引列的值是否散列,即该列的值如果越互不相同,那么索引效率越高。

  • 2.索引的优缺点?
    索引的优点是提高了查询效率,缺点是在插入、更新和删除记录时,需要同时修改索引,因此,索引越多,插入、更新和删除记录的速度就越慢。
    对于主键,关系数据库会自动对其创建主键索引。使用主键索引的效率是最高的,因为主键会保证绝对唯一。

  • 3.创建唯一索引?
    有业务含义但是唯一的列,不适合作为主键但适合作为索引。
    我们假设students表的name不能重复,通过UNIQUE关键字我们就添加了一个唯一索引:

ALTER TABLE students
ADD UNIQUE INDEX uni_name (name);

也可以只对某一列添加一个唯一约束而不创建唯一索引,这种情况下 name列没有索引,但仍然具有唯一性保证:

ALTER TABLE students
ADD CONSTRAINT uni_name UNIQUE (name);
  • 4.小结
    • 通过对数据库表创建索引,可以提高查询速度。
    • 通过创建唯一索引,可以保证某一列的值具有唯一性。
    • 数据库索引对于用户和应用程序来说都是透明的。

功能部分


查询数据(DQL)

准备数据

执行.sql脚本,这个过程需要熟悉SQL WorkBench工具

基本查询

SELECT * 
FROM <表名>

使用SELECT查询的基本语句SELECT * FROM <表名>可以查询一个表的所有行和所有列的数据。SELECT查询的结果是一个二维表。

条件查询

SELECT * 
FROM <表名> 
WHERE <条件表达式>
  • 常用的条件表达式
条件表达式举例1表达式举例2说明
使用=判断相等score = 80name = ‘abc’字符串需要用单引号括起来
使用>判断大于score > 80name > ‘abc’字符串比较根据ASCII码,中文字符比较根据数据库设置
使用>=判断大于或相等score >= 80name >= ‘abc’
使用<判断小于score < 80name <= ‘abc’
使用<=判断小于或相等score <= 80name <= ‘abc’
使用<>判断不相等score <> 80name <> ‘abc’
使用LIKE判断相似name LIKE ‘ab%’name LIKE ‘%bc%’%表示任意字符,例如’ab%‘将匹配’ab’,‘abc’,‘abcd’

投影查询

SELECT 列名1  AS 别名1, 列名2 AS 别名2 
FROM <表名> 
WHERE <条件表达式>

排序

-- ASC升序排列|DESC降序列
SELECT <列名1>,<列名2>...
FROM <表名> 
WHERE <条件表达式> 
ORDER BY column1 [ASC|DESC], column2 [ASC|DESC];

分页显示

-- page_size 是每页要显示的记录数。  
-- offset_value 是要跳过的记录数。 
SELECT <列名1>,<列名2>...
FROM <表名> 
WHERE <条件表达式> 
ORDER BY column1 [ASC|DESC], column2 [ASC|DESC]
LIMIT page_size OFFSET offset_value;

聚合查询

对于统计总数、平均数这类计算,SQL提供了专门的聚合函数,使用聚合函数进行查询,就是聚合查询,支持使用WHERE条件

SELECT <聚合函数名(列名)> AS <别名>
FROM <表名>
WHERE <条件表达式> ;
-- 例:使用聚合查询计算一班男生的平均成绩:
SELECT AVG(score) average FROM students WHERE class_id = '1' AND gender = 'M';

聚合函数

函数说明
COUNT(*)计算某一列的记录数
SUM计算某一列的合计值,该列必须为数值类型
AVG计算某一列的平均值,该列必须为数值类型
MAX计算某一列的最大值
MIN计算某一列的最小值

分组聚合

-- 例:按class_id分组:
SELECT class_id, COUNT(*) AS num 
FROM students GROUP BY class_id;

-- 例:使用分组聚合计算各班男女生成绩,多维度分组
SELECT class_id, gender, AVG(score) AS average_score
FROM students
GROUP BY class_id, gender
ORDER BY class_id, gender;

多表查询(笛卡尔查询)

使用多表查询可以获取M x N行记录;多表查询的结果集可能非常巨大,要小心使用。

SELECT * FROM <1> <2>;

多表查询时,为避免多表列名重复问题,要使用表名.列名这样的方式来引用列和设置别名.SQL还允许给表设置一个别名,让我们在投影查询中引用起来稍微简洁一点表名 AS 表别名(AS可以省略)

-- 例:多表查询
SELECT
    s.id sid,
    s.name,
    s.gender,
    s.score,
    c.id cid,
    c.name cname
FROM students s, classes c
WHERE s.gender = 'M' AND c.id = 1;

连接查询

连接查询是另一种类型的多表查询。连接查询对多个表进行JOIN连接,连接查询需要先确定主表,然后把另一个表的数据“JOIN”到结果集上。连接查询仍然可以使用WHERE条件和ORDER BY排序。

SELECT ... FROM <1> INNER JOIN <2> ON <条件...>
  • 内连接INNER JOIN查询的写法:
  1. 先确定主表,仍然使用FROM <表1>的语法;
  2. 再确定需要连接的表,使用INNER JOIN <表2>的语法;
  3. 然后确定连接条件,使用ON <条件…>,这里的条件是s.class_id = c.id,表示students表的class_id列与classes表的id列相同的行需要连接;
  4. 可选:加上WHERE子句、ORDER BY等子句。
-- 例子:内连接
SELECT s.id, s.name, s.class_id, c.name class_name, s.gender, s.score
FROM students s
INNER JOIN classes c
ON s.class_id = c.id;
  • 内连接,左外连接,右外连接的区别?

    • 匹配性:内连接仅返回两个表中匹配的记录;左外连接返回左表的所有记录,即便某些记录在右表中没有匹配;右外连接则返回右表的所有记录,即便某些记录在左表中没有匹配。
    • 结果集中的NULL:在左外连接和右外连接中,如果一个表中的行在另一个表中没有匹配项,结果集将包含NULL值,以填充缺失的字段。
    • 使用场景不同:内连接用于查询需要严格匹配的场景,而外连接(左外和右外)适用于需要包含未匹配记录的场景。
  • 如何选择连接方式?

    • INNER JOIN是选出两张表都存在的记录
    • LEFT OUTER JOIN是选出左表存在的记录
    • RIGHT OUTER JOIN是选出右表存在的记录
    • FULL OUTER JOIN则是选出左右表都存在的记录

修改数据(DML)

INSERT(增)

INSERT INTO <表名> (字段1, 字段2, ...) VALUES (1,2, ...);
-- 例:添加一条新记录
INSERT INTO students (class_id, name, gender, score) VALUES (2, '大牛', 'M', 80);

-- 例:一次性添加多条新记录
INSERT INTO students (class_id, name, gender, score) VALUES
  (1, '大宝', 'M', 87),
  (2, '二宝', 'M', 81);

UPDATE(改)

UPDATE <表名> SET 字段1=1, 字段2=2, ... WHERE ...;
-- 例:更新一条记录
UPDATE students SET name='大牛', score=66 WHERE id=1;

-- 例:一次性更新多条记录
UPDATE students SET name='小牛', score=77 WHERE id>=5 AND id<=7;

-- 例:使用表达式更新字段
UPDATE students SET score=score+10 WHERE score<80;

-- 特别小心:不带WHERE会全更新
UPDATE students SET name='大牛', score=66

DELETE(删)

DELETE FROM <表名> WHERE ...;
-- 例:删除一条记录
DELETE FROM students WHERE id=1;

-- 例:一次性删除多条记录
DELETE FROM students WHERE id>=5 AND id<=7;

-- 特别小心:不带WHERE会全删
DELETE FROM students;

修改结构(DDL)(以Mysql数据库为例)

要管理MySQL,可以使用可视化图形界面MySQL Workbench。它对MySQL的操作本质上仍然是发送SQL语句并执行。很多时候,通过SSH远程连接时,只能使用SQL命令,所以,了解并掌握常用的SQL管理操作是必须的。

数据库管理

-- 连接到数据库
mysql -u root -p

-- 创建数据库
CREATE DATABASE test;

-- 列出所有数据库,显示的数据库中,information_schema、mysql、performance_schema和sys是系统库,不要去改动它们
mysql> SHOW DATABASES;

-- 切换当前数据库
mysql> USE test;

表管理

-- 列出当前数据库的所有表
mysql> SHOW TABLES;

-- 查看一个表的结构
mysql> DESCRIBE students;

-- 查看创建表的SQL语句
mysql> SHOW CREATE TABLE students;

-- 创建和删除表
mysql> CREATE TABLE students;
mysql> DROP TABLE students;

列管理

-- 给students表新增一列birth
ALTER TABLE students ADD COLUMN birth VARCHAR(10) NOT NULL;

-- 把列名改为birthday,类型改为VARCHAR(20)
ALTER TABLE students CHANGE COLUMN birth birthday VARCHAR(20) NOT NULL;

-- 删除列
ALTER TABLE students DROP COLUMN birthday;

-- 退出MySQL
mysql> EXIT

修改权限(DCL)

赋予用户或角色某种权限或角色

GRANT SELECT, INSERT ON database.table TO 'username'@'host';

这条命令赋予指定用户在特定数据库的特定表上执行SELECT和INSERT操作的权限。

移除用户或角色的权限或角色

REVOKE SELECT, INSERT ON database.table FROM 'username'@'host';

这条命令移除指定用户在特定数据库的特定表上执行SELECT和INSERT操作的权限。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1632491.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用 BurpSuite 基于 Token 机制实施暴力破解

前言 Token是一种用于身份验证和授权的令牌&#xff0c;通常由服务器生成并发送给客户端&#xff0c;客户端在后续的请求中携带该令牌来进行身份验证和授权操作。Token的使用可以增强应用程序的安全性&#xff0c;避免了直接传递敏感凭证&#xff08;如用户名和密码&#xff0…

SpringMVC整体工作流程

. 用户发起一个请求&#xff0c;请求首先到达前端控制器前端控制器接收到请求后会调用处理器映射器&#xff0c;由此得知&#xff0c;这个请求该由哪一个Controller来进行处理(并未调用Controller)&#xff1b;前端控制器调用处理器适配器&#xff0c;告诉处理器适配器应该要…

2024抖音AI图文带货班:在这个赛道上 乘风破浪 拿到好效果

课程目录 1-1.1 AI图文学习指南 1.mp4 2-1.2 图文带货的新机会 1.mp4 3-1.3 2024年优质图文新标准 1.mp4 4-1.4 图文如何避免违规 1.mp4 5-1.5 优质图文模板解析 1.mp4 6-2.1 老号重启 快速破局 1.mp4 7-2.2 新号起号 不走弯路 1.mp4 8-2.3 找准对标 弯道超车 1.mp4 9…

判断前端入参是否空否则提示前端写法

vue2中 前端先声明一个变量&#xff0c;用于alert判断 在templeat中定义一个提示语句 然后在点击事件时判断一下是否展示

【Python 对接QQ的接口】简单用接口查询【等级/昵称/头像/Q龄/当天在线时长/下一个等级升级需多少天】

文章日期&#xff1a;2024.04.28 使用工具&#xff1a;Python 类型&#xff1a;QQ接口 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要做的可联系我】 AES解密处理&#xff08;直接解密即可&#xff09;&#xff08;crypto-js.js 标准算法&#xff09;&…

<计算机网络自顶向下> Internet Protocol

互联网中的网络层 IP数据报格式 ver: 四个比特的版本号&#xff08;IPV4 0100, IPV6 0110&#xff09; headlen&#xff1a;head的长度&#xff08;头部长度字段&#xff08;IHL&#xff09;指定了头部的长度&#xff0c;以32位字&#xff08;4字节&#xff09;为单位计算。这…

How to solve matplotlib Chinese garbled characters in Ubuntu 22.04

conda create -n huizhou python3.8conda activate huizhouconda install numpy matplotlibpip install mplfontsmplfonts init# 导入必要的库 import numpy as np import matplotlib.pyplot as plt# 创建角度数组&#xff0c;从0到2π x np.linspace(0, 2 * np.pi, 100)# 计算…

NFTScan | 04.22~04.28 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期&#xff1a;2024.04.22~ 2024.04.28 NFT Hot News 01/ ApeCoin DAO 发起「由 APE 代币支持的 NFT Launchpad」提案投票 4 月 22 日&#xff0c;ApeCoin DAO 社区发起「由 APE 代币支持的 NFT Launch…

第8章 软件工程

一、软件工程概述 &#xff08;一&#xff09;软件危机 1、含义&#xff1a;落后的软件生产方式无法满足迅速增长的计算机软件需求&#xff0c;从而导致软件开发与维护过程中出现一系列严重问题的现象。 2、解决方案&#xff1a;引入软件工程的思想。 &#xff08;二&#x…

ubuntu samba 安装与配置

ubuntu samba 安装与配置 一&#xff1a;安装二&#xff1a;添加samba访问账号及密码三&#xff1a;修改配置文件四&#xff1a;重启服务五&#xff1a;登录 一&#xff1a;安装 sudo apt update sudo apt install samba samba-common二&#xff1a;添加samba访问账号及密码 …

YOLOv8: 快速而准确的对象检测

YOLOv8: 快速而准确的对象检测 背景 对象检测是计算机视觉中的一个关键任务,它可以帮助我们在图像或视频中识别和定位感兴趣的物体。其中,YOLO(You Only Look Once)系列是一类非常出色的实时对象检测算法,以其快速和准确的特点而闻名。YOLOv8是YOLO系列的最新版本,由Ultralyti…

Linux下的基本指令(1)

嗨喽大家好呀&#xff01;今天阿鑫给大家带来Linux下的基本指令&#xff08;1&#xff09;&#xff0c;下面让我们一起进入Linux的学习吧&#xff01; Linux下的基本指令 ls 指令pwd命令cd 指令touch指令mkdir指令(重要)rmdir指令 && rm 指令(重要)man指令(重要)cp指…

020Node.js的FS模块使用fs.mkdir创建目录

Node.js的FS模块使用fs.mkdir创建目录 //fs.mkdir 创建目录 /*path 将创建的目录路径mode 目录权限&#xff08;读写权限&#xff09;&#xff0c;默认777callback 回调&#xff0c;传递异常参数err*/ const fsrequire(fs);fs.mkdir(./css,(err)>{if(err){console.log(err)…

Spring Security OAuth2 统一登录

介绍 Spring Security OAuth2 是一个在 Spring Security 框架基础上构建的 OAuth2 授权服务器和资源服务器的扩展库。它提供了一套功能强大的工具和组件&#xff0c;用于实现 OAuth2 协议中的授权流程、令牌管理和访问控制。 Git地址&#xff1a;yunfeng-boot3-sercurity: Sp…

【会员单位】浙江晧月水务科技有限公司

中华环保联合会理事单位 水环境治理专业委员会副主任委员单位 公司成立于2018年3月14日&#xff0c;是专业研究废水处理业务的国家高新技术企业。 公司自主研发的脱硫废水“零排放”的技术&#xff0c;不仅适应性好&#xff0c;技术先进&#xff0c;智慧化程度高&#xff0c…

【C++第六课 - 模板、STL简介、string】函数模板、类模板、STL简介

目录 模板函数模板函数模板概念函数模板格式实例化推演实例化显示实例化 类模板 STL简介 模板 函数模板 函数模板概念 函数模板代表了一个函数家族&#xff0c;该函数模板与类型无关&#xff0c;在使用时被参数化&#xff0c;根据实参类型产生函数的特定 类型版本。 函数模板…

如何用二维码实现现代仓库管理?

随着科技的进步&#xff0c;二维码技术逐渐应用与各个领域&#xff0c;其中在仓库管理中的应用也日益广泛。 那话不多说&#xff0c;我们直接来看如何用二维码实现现代仓库管理 简道云仓库管理模板&#xff0c;可以点击安装配合阅读&#xff1a;https://www.jiandaoyun.com 二…

【JAVA进阶篇教学】第七篇:Spring中常用注解

博主打算从0-1讲解下java进阶篇教学&#xff0c;今天教学第七篇&#xff1a;Spring中常用注解 在Java Spring框架中&#xff0c;注解&#xff08;Annotation&#xff09;是一种元数据&#xff0c;它提供了关于程序代码的额外信息&#xff0c;这些信息可以用于编译时检查、运行时…

裸金属服务器使用效果好吗

在当今的数字化时代&#xff0c;信息技术的飞速发展&#xff0c;云计算技术已经成为企业信息化建设的重要基石。在众多计算资源中&#xff0c;裸金属和云服务器是两种主流的服务模式&#xff0c;它们各有千秋&#xff0c;为不同的用户需求提供了适合的解决方案。而裸金属服务器…

【EMQX】使用websocket订阅EMQX数据

需求&#xff1a;某平台希望通过 websocket 来订阅 EMQX平台上的某些 Topic数据进行处理 1、EMQX 服务配置 前提是EMQX服务正常安装运行了&#xff0c;如果EMQX服务未安装的话&#xff0c;详见以下文章关于如何安装部署服务&#xff1a; 搭建自己的MQTT服务器、实现设备上云(W…