Sql学习

article/2025/9/17 4:29:43

Sql学习

一、SQL简介

SQL 是一种 ANSI(American National Standards Institute 美国国家标准化组织)标准的计算机语言。
是结构化查询语言(Structured Query Language),可以访问和处理数据库,SQL 对大小写不敏感。
RDBMS指关系型数据库管理系统(Relational Database Management System) ,是 SQL的基础,也是所有现代数据库系统的基础。

二、sql语法

select * from emp where not sal > 1500; //查询EMP表中 sal 小于等于 1500 的值。
Select * from emp where sal between 1500 and 3000; //between and(在 之间的值)

like
% 表示多个字值,_ 下划线表示一个字符;
M% : 为能配符,正则表达式,表示的意思为模糊查询信息为 M 开头的。
%M% : 表示查询包含M的所有内容。
%M_ : 表示查询以M在倒数第二位的所有内容。
and&or
如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。
如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录。
order by
ORDER BY 关键字用于对结果集进行排序,默认按照升序对记录进行排序。如果需要按照降序对记录进行排序,您可以使用 DESC 关键字。
order by A,B 这个时候都是默认按升序排列
order by A desc,B 这个时候 A 降序,B 升序排列
order by A ,B desc 这个时候 A 升序,B 降序排列
即 desc 或者 asc 只对它紧跟着的第一个列名有效,其他不受影响,仍然是默认的升序。
insert
insert into select 和select into from 的区别
insert into user_bak select * from user where userid=5 //插入一行,要求表scorebak 必须存在。Table ‘test.user_bak’ doesn’t exist
SELECT * INTO user_bak FROM USER WHERE userid=5; //也是插入一行,要求表scorebak 不存在。
由于mysql不支持select into from,故因此用CREATE TABLE user_bak(SELECT * FROM USER WHERE userid=5);代替。
update/delete
执行没有 WHERE 子句的 update/delete 要慎重,再慎重。
在 MySQL 中可以通过设置 sql_safe_updates 这个自带的参数来解决,当该参数开启的情况下,你必须在update 语句后携带 where 条件,否则就会报错。
set sql_safe_updates=1; 表示开启该参数。
UPDATE user_bak SET STATUS=1; DELETE FROM user_bak; //You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column.
总结
通过SHOW VARIABLES LIKE ‘sql_safe%’;//查看此参数开闭情况。
如果设置了sql_safe_updates=1,那么update语句必须满足如下条件之一才能执行成功
1)使用where子句,并且where子句中列必须为prefix索引列(主键、组合索引第一列)
2)使用limit
3)同时使用where子句和limit(此时where子句中列可以不是索引列)
delete语句必须满足如下条件之一才能执行成功
1)使用where子句,并且where子句中列必须为prefix索引列
2)同时使用where子句和limit(此时where子句中列可以不是索引列)

三、高级语法

SELECT TOP 50 PERCENT * FROM Websites;//从 websites 表中选取前面百分之 50 的记录:
select top 5 * from table;
并非所有的数据库系统都支持 SELECT TOP 语句
别名
在下面的情况下,使用别名很有用:
在查询中涉及超过一个表
在查询中使用了函数
列名称很长或者可读性差
需要把两个列或者多个列结合在一起
NULL 函数
无法比较 NULL 和 0;它们是不等价的。
始终使用 IS NULL 来查找 NULL 值
微软的 ISNULL() 函数用于规定如何处理 NULL 值。
NVL()、IFNULL() 和 COALESCE() 函数也可以达到相同的结果
约束
1.NOT NULL 约束
NOT NULL 约束 在默认的情况下,表的列接受 NULL 值。NOT NULL 约束强制列不接受 NULL 值。
ALTER TABLE Persons MODIFY Age int NOT NULL;//添加 NOT NULL 约束
ALTER TABLE Persons MODIFY Age int NULL;//删除 NOT NULL 约束
2. UNIQUE 约束
UNIQUE 约束唯一标识数据库表中的每条记录。UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。
ALTER TABLE Persons ADD UNIQUE (P_Id);//在 “P_Id” 列创建 UNIQUE 约束
ALTER TABLE Persons DROP INDEX uc_PersonID;//撤销 UNIQUE 约束 Mysql
ALTER TABLE Persons DROP CONSTRAINT uc_PersonID;//撤销 UNIQUE 约束 Oracle
ALTER TABLE Persons ADD CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName);//定义多个列的 UNIQUE 约束
3.PRIMARY KEY 约束
PRIMARY KEY 约束唯一标识数据库表中的每条记录。主键必须包含唯一的值。主键列不能包含 NULL 值。
ALTER TABLE Persons ADD PRIMARY KEY (P_Id) ;//在 “P_Id” 列上创建 PRIMARY KEY 约束
ALTER TABLE Persons ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName);//定义多个列的 PRIMARY KEY 约束
ALTER TABLE Persons DROP PRIMARY KEY;//撤销 PRIMARY KEY 约束 Mysql
ALTER TABLE Persons DROP PRIMARY KEY ALTER TABLE Persons DROP CONSTRAINT pk_PersonID;//撤销 PRIMARY KEY 约束 Oracle
4. FOREIGN KEY 约束
FOREIGN KEY 约束用于预防破坏表之间连接的行为。FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
ALTER TABLE Orders ADD FOREIGN KEY (P_Id) REFERENCES Persons(P_Id);//在 “P_Id” 列创建 FOREIGN KEY 约束
ALTER TABLE Orders ADD CONSTRAINT fk_PerOrders FOREIGN KEY (P_Id) REFERENCES Persons(P_Id);//定义多个列的 FOREIGN KEY 约束
ALTER TABLE Orders DROP FOREIGN KEY fk_PerOrders;//撤销 FOREIGN KEY 约束 Mysql
ALTER TABLE Orders DROP CONSTRAINT fk_PerOrders;//撤销 FOREIGN KEY 约束 Oracle
5. CHECK 约束
CHECK 约束用于限制列中的值的范围。
ALTER TABLE Persons ADD CHECK (P_Id>0);//在 “P_Id” 列创建 CHECK 约束
ALTER TABLE Persons ADD CONSTRAINT chk_Person CHECK (P_Id>0 AND City=‘Sandnes’);//定义多个列的 CHECK 约束
ALTER TABLE Persons DROP CHECK chk_Person;//撤销 CHECK 约束 Mysql
ALTER TABLE Persons DROP CONSTRAINT chk_Person;/撤销 CHECK 约束 Oracle
6. DEFAULT 约束
DEFAULT 约束用于向列中插入默认值。 ALTER TABLE Persons ALTER City SET DEFAULT ‘SANDNES’;//在 “City” 列创建 DEFAULT 约束 Mysql ALTER TABLE
Persons ALTER City DROP DEFAULT;//撤销 DEFAULT 约束 Mysql ALTER TABLE
Persons MODIFY City DEFAULT ‘SANDNES’;//在 “City” 列创建 DEFAULT 约束 Oracle
ALTER TABLE Persons ALTER COLUMN City DROP DEFAULT;//撤销 DEFAULT 约束 Oracle
**union**
UNION 操作符合并两个或多个 SELECT 语句的结果。UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。
UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。

JOIN
INNER JOIN 关键字在表中存在至少一个匹配时返回行。INNER JOIN 与 JOIN 是相同的。
LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。在某些数据库中,LEFT JOIN 称为 LEFT OUTER JOIN。
RIGHT JOIN 关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL。在某些数据库中,RIGHT JOIN 称为 RIGHT OUTER JOIN。
FULL OUTER JOIN 关键字只要左表(table1)和右表(table2)其中一个表中存在匹配,则返回行。FULL OUTER JOIN 关键字结合了 LEFT JOIN 和 RIGHT JOIN 的结果。在某些数据库中,FULL OUTER JOIN 称为FULL JOIN。 可以使用union关键字来实现所谓的全连接。
natural join 自然连接默认是匹配两个表列名相同的,然后不重复显示。
cross join 笛卡尔积,就是第一个表的行数乘以第二个表的行数。

可以参照MySQL的Sql join
在这里插入图片描述
在这里插入图片描述

通配符
MySQL 中使用 REGEXP 或 NOT REGEXP 运算符 (或 RLIKE 和 NOT RLIKE) 来操作正则表达式。
SELECT * FROM USER WHERE username RLIKE ‘^ [bat]’;
SELECT * FROM USER WHERE username REGEXP ‘^ [bat]’;
SELECT * FROM USER WHERE username REGEXP ‘^ [^bat]’;

在这里插入图片描述

四、函数

MID() 函数
MID() 函数用于从文本字段中提取字符。Oracle 中没有 MID 函数,有 substr 函数有类似功能
SELECT MID(name,1,4) AS ShortTitle FROM Websites;//从 “Websites” 表的 “name” 列中提取前 4 个字符
SELECT substr(name,1,4) AS ShortTitle FROM Websites;//从 “Websites” 表的 “name” 列中提取前 4 个字符
LEN() 函数
LEN() 函数返回文本字段中值的长度。
SELECT name, LENGTH(url) as LengthOfURL FROM Websites;//从 “Websites” 表中选取 “name” 和 “url” 列中值的长度 Mysql
FORMAT() 函数
FORMAT() 函数用于对字段的显示进行格式化。
SELECT name, url, DATE_FORMAT(Now(),’%Y-%m-%d’) AS date FROM Websites;//从 “Websites” 表中选取 name, url 以及格式化为 YYYY-MM-DD 的日期
HAVING 子句
在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数一起使用。
HAVING 子句可以让我们筛选分组后的各组数据。
SELECT Websites.name, Websites.url, SUM(access_log.count) AS nums FROM (access_log INNER JOIN Websites ON access_log.site_id=Websites.id) GROUP BY Websites.name HAVING SUM(access_log.count) > 200;//总访问量大于 200 的网站
ROUND() 函数
ROUND() 函数用于把数值字段舍入为指定的小数位数。

在这里插入图片描述 在这里插入图片描述


http://chatgpt.dhexx.cn/article/n8DpTX4J.shtml

相关文章

SQL学习笔记1

* 以下内容是我在学习SQL(http://www.w3school.com.cn/sql/index.asp)的时候的学习笔记 * 学习时使用的数据库软件是MySQL数据库可视化工具SQLyogEnt * 如果大家有发现什么不对的地方请告诉我。谢啦!!☆⌒(*^-゜)v * 在这里需要注意的是&…

史上最全SQL学习指南(教程+实例+练习题)

报告称,未来10年数据细分岗位将扩张5倍,大数据19w的人才缺口将继续增加。国内外一线互联网公司纷纷开设了数据分析岗位。 数据分析岗位中用的最频繁的工具就是SQL了。不论是满足业务日常取数需求,还是自己做分析,都离不开SQL。 …

SQL入门教程(非常详细)从零基础入门到精通,看完这一篇就够了

导读: SQL语言有40多年的历史,从它被应用至今几乎无处不在。我们消费的每一笔支付记录,收集的每一条用户信息,发出去的每一条消息,都会使用数据库或与其相关的产品来存储,而操纵数据库的语言正是 SQL &…

SQL零基础入门必知必会!

📚 前言 SQL语言有40多年的历史,从它被应用至今几乎无处不在。我们消费的每一笔支付记录,收集的每一条用户信息,发出去的每一条消息,都会使用数据库或与其相关的产品来存储,而操纵数据库的语言正是 SQL &am…

redis:redis缓冲区溢出怎么办

引入 什么是缓冲区:用一块内存空间来暂时存放命令数据,以免出现因为数据和命令的处理速度慢与发送速度而导致的数据丢失和性能问题但是问题是,因为缓冲区的内存空间是有限的,如果往里面写入数据的速度大于从里面读取数据的速度&a…

【缓冲区溢出】堆溢出原理

一、操作系统中堆和栈的区别 堆内存申请,释放,操作,特点: 1. 堆内存申请环境:堆内存需要程序员在程序中申请 ,动态分配,申请的大小有程序决定。 2. 堆内存申请方法:C语言中的malloc(…

本地缓冲区溢出

本地缓冲区溢出 【实验目的】 1、掌握缓冲区溢出的基本原理; 2、熟练利用jmp.egp指令实现缓冲区溢出; 3、掌握缓冲区溢出的危害及其防范手段。 【实验环境】 登录Linux靶机环境,在无root权限的情况下,通过编译运行程序&#x…

关于缓冲区溢出(Buffer Overflow)

接触黑客的同志们经常遇到,使用一些扫描工具扫描的时候,会得到一些缓冲区溢出的漏洞,但是怎么利用自己是一团雾水 网上很少有相关的工具,也很少有相关的文章,下面我们就说说这个“窿西”吧 [蛋痛]文章丢失了一次&…

高并发缓存队列防止溢出解决方案

目录 1 背景介绍1.1 设计分析微信抢红包1.2 红包定时导入缓存队列 2 队列术限流2.1 高并发场景分析2.2 队列削峰实战 3 设计原则3.1 动静分离3.2 微服务化3.3 负载均衡3.4 异步消息3.5 缓存预热 4 Nginx通过LUA脚本访问RabbitMQ消息队列 1 背景介绍 并发量非常大的系统&#x…

【2021.12.12】缓冲区溢出利用

文章目录 1.1 实验环境和开发工具1.2 任务描述1.3 分析过程1.4 结论1.4.1 利用漏洞1.4.2 修复漏洞 1.1 实验环境和开发工具 处理器 i5-8300H 内存(RAM) 8G 硬盘 476G 软件环境: Windows 10 开发工具: Visual studio 2019 IDA PRO7.5 1.2 …

本地缓冲区溢出分析

栈溢出是缓冲区溢出中最为常见的一种攻击手法,其原理是,程序在运行时栈地址是由操作系统来负责维护的,在我们调用函数时,程序会将当前函数的下一条指令的地址压入栈中,而函数执行完毕后,则会通过ret指令从栈…

关于缓冲区溢出的对策

从编译器的角度出发 以下两种方法均是编译器采取的关于缓冲区溢出的对策 Stackshield 主要思想是在函数调用之前,将return address的副本保存在一个安全的地方,函数返回时将返回地址与预先保存的返回地址比较,以判断缓冲区溢出是否发生。 …

浅析缓冲区溢出

最近一直在学习缓冲区溢出漏洞的攻击,但是关于这一块的内容还是需要很多相关知识的基础,例如编程语言及反汇编工具使用。所以研究透彻还需要不少的时间,这里简单的做一个学习的总结,通过具体的实验案例对缓冲区溢出进行简要的解析…

缓冲区溢出原理详解

下面将有实例引入缓冲区溢出的介绍&#xff1a; void main() { int i0; int a[]{1,2,3,4,5,6,7,8,9,10}; for(i0;i<10;i) { a[i]0;printf("Hello World!\n");} } 首先&#xff0c;这段代码会出现死循环&#xff0c;为什么&#xff1f;因为数组溢出了&…

C语言 缓存区溢出 3221225725

目录 问题描述解决办法&#xff1a; 问题描述 DEV-C报错 Process exited after 4.03 seconds with return value 3221225725 原因 数组定义的容量太大 - 五十万起步的样子 而且每次循环都会再定义一次&#xff0c;导致缓存区溢出 解决办法&#xff1a; 思路来源&#xff1a…

什么是缓冲区溢出?有什么危害?原因是什么?

缓冲区溢出是指当计算机向缓冲区填充数据时超出了缓冲区本身的容量&#xff0c;溢出的数据覆盖在合法数据上。 危害有以下两点&#xff1a; 1、程序崩溃&#xff0c;导致拒绝服务 2、跳转并且执行一段恶意代码 原因&#xff1a;造成缓冲区溢出的主要原因是程序中没有仔细检查用…

什么是缓冲区溢出?有说明危害?

缓存溢出 缓存溢出(Buffer overflow) &#xff0c;是指在存在缓存溢出安全漏洞的计算机中&#xff0c;攻击者可以用超出常规长度的字符数来填满-一个域&#xff0c;通常是内存区地址。在某些情况下&#xff0c;这些过量的字符能够作为“可执行”代码来运行。从而使得攻击者可以…

缓存区溢出的原理分析和防范

1.前言 缓冲区溢出(buffer-overflow)是一种非常普遍、同时非常危险的漏洞&#xff0c;在各种操作系统、应用软件中广泛存在。缓冲区溢出攻击是利用缓冲区溢出漏洞所进行的攻击&#xff0c;轻则可以导致程序失败、系统关机等&#xff0c;重则可以利用它执行非授权指令&#xff0…

缓存溢出

缓存溢出&#xff08;Buffer overflow&#xff09;&#xff0c;是指在存在缓存溢出安全漏洞的计算机中&#xff0c;攻击者可以用超出常规长度的字符数来填满一个域&#xff0c;通常是内存区地址。在某些情况下&#xff0c;这些过量的字符能够作为“可执行”代码来运行。从而使得…

逆向基础:软件手动脱壳技术入门

前言&#xff1a; 大家好&#xff0c;我是周杰伦 这里整合了一下之前自己学习软件手工脱壳的一些笔记和脱文&#xff0c;希望能给新学软件逆向和脱壳的童鞋们一点帮助。 1 一些概念 1.1 加壳 加壳的全称应该是可执行程序资源压缩&#xff0c;是保护文件的常用手段。加壳过…