版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
经典SQL语句大全(超全)SQL(StructuredQueryLanguage,结构化查询语言)是操作关系型数据库的标准语言,涵盖数据库创建、数据操作、查询分析、权限管理等全场景。本文按“基础入门→进阶查询→高级技巧→优化调试→常用场景”分类整理,包含日常开发90%以上高频语句,兼顾语法规范与实战示例,新手可入门、老手可速查。一、基础核心语句(必掌握)1.数据库操作(DDL:数据定义语言)用于创建、删除、修改数据库,核心是定义数据库结构,无数据交互。创建数据库:指定字符集(避免中文乱码),可选设置排序规则。
--基础创建
CREATEDATABASE数据库名;
--推荐写法(指定字符集和排序规则)
CREATEDATABASE数据库名CHARACTERSETutf8mb4COLLATEutf8mb4_unicode_ci;查看所有数据库:
SHOWDATABASES;使用数据库:切换到目标数据库,后续操作均针对该库。
USE数据库名;删除数据库:谨慎操作,删除后无法恢复。
DROPDATABASE数据库名;修改数据库:主要修改字符集和排序规则。
ALTERDATABASE数据库名CHARACTERSETutf8mb4COLLATEutf8mb4_unicode_ci;2.数据表操作(DDL)创建、修改、删除数据表,定义表结构(字段、类型、约束)。创建数据表:指定字段名、数据类型、约束(主键、非空、唯一等)。
--示例:创建员工表(含常用约束)
CREATETABLEemp(
emp_idINTPRIMARYKEYAUTO_INCREMENT,--主键,自增
emp_nameVARCHAR(50)NOTNULL,--非空,员工姓名
ageINTCOMMENT'员工年龄',--备注
genderCHAR(1)DEFAULT'男',--默认值
dept_idINT,--外键,关联部门表
hire_dateDATE,
UNIQUEKEY(emp_name)--唯一约束,姓名不能重复
)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;说明:ENGINE=InnoDB支持事务和外键,MyISAM不支持;AUTO_INCREMENT仅适用于整数主键。查看数据表:查看库内所有表、表结构。
--查看当前库所有表
SHOWTABLES;
--查看表结构(详细字段、类型、约束)
DESCRIBE表名;--简写:DESC表名
--查看表创建语句(含完整约束、引擎)
SHOWCREATETABLE表名;修改数据表:添加字段、修改字段、删除字段、修改表名。
--1.添加字段
ALTERTABLE表名ADD字段名数据类型[约束];
--示例:给emp表添加salary(工资)字段
ALTERTABLEempADDsalaryDECIMAL(10,2)NOTNULLDEFAULT0.00;
--2.修改字段(修改类型/约束,不修改字段名)
ALTERTABLE表名MODIFY字段名新数据类型[新约束];
--示例:修改age字段为非空
ALTERTABLEempMODIFYageINTNOTNULL;
--3.修改字段名(同时可修改类型/约束)
ALTERTABLE表名CHANGE旧字段名新字段名新数据类型[新约束];
--示例:将age改为emp_age,类型不变
ALTERTABLEempCHANGEageemp_ageINTNOTNULL;
--4.删除字段
ALTERTABLE表名DROP字段名;
--示例:删除emp表的gender字段
ALTERTABLEempDROPgender;
--5.修改表名
ALTERTABLE旧表名RENAMETO新表名;删除数据表:谨慎操作,删除表后数据和结构均消失。
--直接删除表
DROPTABLE表名;
--安全删除(表不存在时不报错)
DROPTABLEIFEXISTS表名;3.数据操作(DML:数据操纵语言)核心是对表中数据进行增、删、改,是日常开发最常用的语句。(1)新增数据(INSERT)sql
--1.单条数据插入(指定字段,推荐,字段顺序可与表结构不一致)
INSERTINTO表名(字段1,字段2,...)VALUES(值1,值2,...);
--示例:给emp表插入一条员工数据
INSERTINTOemp(emp_name,emp_age,dept_id,hire_date,salary)
VALUES('张三',25,1,'2024-01-15',8000.00);
--2.批量插入(高效,避免多次执行单条插入)
INSERTINTO表名(字段1,字段2,...)
VALUES(值1-1,值1-2,...),
(值2-1,值2-2,...),
(值3-1,值3-2,...);
--示例:批量插入3条员工数据
INSERTINTOemp(emp_name,emp_age,dept_id,hire_date,salary)
VALUES('李四',28,2,'2024-02-20',9500.00),
('王五',30,1,'2023-12-10',10000.00),
('赵六',22,3,'2024-03-05',7500.00);
--3.从其他表查询结果插入(批量导入数据)
INSERTINTO目标表名(字段1,字段2,...)
SELECT字段1,字段2,...FROM来源表名WHERE筛选条件;
--示例:从temp_emp表查询年龄>25的员工,插入到emp表
INSERTINTOemp(emp_name,emp_age,dept_id,hire_date,salary)
SELECTemp_name,emp_age,dept_id,hire_date,salaryFROMtemp_empWHEREemp_age>25;(2)修改数据(UPDATE)sql
--基础语法:修改符合条件的所有数据(必须加WHERE,否则修改全表!)
UPDATE表名SET字段1=值1,字段2=值2,...WHERE筛选条件;
--示例1:修改张三的工资为8500
UPDATEempSETsalary=8500.00WHEREemp_name='张三';
--示例2:修改部门1所有员工的工资上涨10%
UPDATEempSETsalary=salary*1.1WHEREdept_id=1;
--进阶:结合子查询修改(根据其他表数据修改当前表)
--示例:将与temp_emp表中姓名一致的员工,同步temp_emp的工资
UPDATEempe
SETe.salary=(SELECTt.salaryFROMtemp_emptWHEREt.emp_name=e.emp_name)
WHEREEXISTS(SELECT1FROMtemp_emptWHEREt.emp_name=e.emp_name);注意:UPDATE语句必须加WHERE子句,否则会修改表中所有数据,造成不可逆损失!(3)删除数据(DELETE)sql
--1.删除符合条件的数据(加WHERE,推荐)
DELETEFROM表名WHERE筛选条件;
--示例:删除emp表中年龄>50的员工
DELETEFROMempWHEREemp_age>50;
--2.删除表中所有数据(保留表结构,不重置自增主键)
DELETEFROM表名;
--3.快速删除表中所有数据(清空表,重置自增主键,效率极高)
TRUNCATETABLE表名;
--4.结合子查询删除(根据其他表数据删除)
--示例:删除emp表中,不存在于dept表(部门表)的员工(无所属部门)
DELETEFROMempe
WHERENOTEXISTS(SELECT1FROMdeptdWHEREd.dept_id=e.dept_id);区别:DELETE是逐行删除,可回滚;TRUNCATE是直接清空表,不可回滚,效率远高于DELETE。4.基础查询(DQL:数据查询语言)SQL最核心的功能,从表中提取所需数据,支持简单查询、条件筛选、排序、分页等。简单查询(查询全部/指定字段)--1.查询表中所有字段(*代表全部,开发中不推荐,效率低)
SELECT*FROM表名;
--2.查询指定字段(推荐,精准获取所需字段)
SELECT字段1,字段2,...FROM表名;
--3.给字段起别名(AS可省略,简化结果展示)
SELECTemp_nameAS员工姓名,salary工资FROMemp;
--4.去重查询(DISTINCT,去除结果集中重复的记录)
SELECTDISTINCTdept_idFROMemp;--查询所有不重复的部门ID条件查询(WHERE):筛选符合条件的数据,支持多种运算符。
--基础语法
SELECT字段1,字段2FROM表名WHERE筛选条件;
--常用运算符示例
--1.比较运算符(=、>、<、>=、<=、<>/-!=,不等于)
SELECT*FROMempWHEREsalary>8000;--查询工资大于8000的员工
SELECT*FROMempWHEREemp_age<>25;--查询年龄不等于25的员工
--2.逻辑运算符(AND、OR、NOT)
SELECT*FROMempWHEREdept_id=1ANDsalary>9000;--部门1且工资>9000
SELECT*FROMempWHEREemp_age<25ORsalary<7000;--年龄<25或工资<7000
SELECT*FROMempWHERENOTdept_id=2;--不在部门2的员工
--3.范围运算符(BETWEEN...AND...、IN、NOTIN)
SELECT*FROMempWHEREsalaryBETWEEN7000AND10000;--工资7000-10000(含边界)
SELECT*FROMempWHEREdept_idIN(1,2);--部门1或2的员工
SELECT*FROMempWHEREemp_ageNOTIN(25,28);--年龄不是25、28的员工
--4.模糊查询(LIKE、NOTLIKE,%匹配任意字符,_匹配单个字符)
SELECT*FROMempWHEREemp_nameLIKE'张%';--姓“张”的员工(张XX)
SELECT*FROMempWHEREemp_nameLIKE'%三';--名“三”的员工(X三)
SELECT*FROMempWHEREemp_nameLIKE'_四';--名字第二个字是“四”(X四,2个字)
SELECT*FROMempWHEREemp_nameNOTLIKE'李%';--不姓“李”的员工
--5.空值判断(ISNULL、ISNOTNULL,不能用=NULL)
SELECT*FROMempWHEREhire_dateISNULL;--未填写入职日期的员工
SELECT*FROMempWHEREhire_dateISNOTNULL;--已填写入职日期的员工排序查询(ORDERBY):对查询结果排序,默认升序(ASC),可指定降序(DESC)。
--基础语法:单字段排序
SELECT字段1,字段2FROM表名WHERE条件ORDERBY排序字段ASC/DESC;
--示例1:按工资降序排序(从高到低)
SELECTemp_name,salaryFROMempORDERBYsalaryDESC;
--示例2:按入职日期升序排序(从早到晚)
SELECTemp_name,hire_dateFROMempORDERBYhire_dateASC;
--进阶:多字段排序(先按字段1排序,字段1相同则按字段2排序)
SELECTemp_name,dept_id,salaryFROMemp
ORDERBYdept_idASC,salaryDESC;分页查询(LIMIT/ROWNUM/TOP):限制查询结果数量,实现分页,不同数据库语法略有差异。
--1.MySQL/PostgreSQL(最常用,LIMIT偏移量,每页条数;偏移量从0开始)
--示例:查询第1页,每页10条(偏移量0,取10条)
SELECT*FROMempORDERBYemp_idDESCLIMIT0,10;
--示例:查询第2页,每页10条(偏移量10,取10条)
SELECT*FROMempORDERBYemp_idDESCLIMIT10,10;
--2.Oracle(ROWNUM,需嵌套查询)
SELECT*FROM(
SELECTemp.*,ROWNUMrnFROMempWHEREROWNUM<=20--取前20条
)WHERErn>10;--排除前10条,即第2页(11-20条)
--3.SQLServer(TOP,取前N条)
--示例:取前10条员工数据
SELECTTOP10*FROMempORDERBYemp_idDESC;二、进阶查询语句(高频实战)1.聚合查询(GROUPBY+聚合函数)对数据进行统计分析,常用聚合函数:COUNT(统计条数)、SUM(求和)、AVG(平均值)、MAX(最大值)、MIN(最小值),结合GROUPBY分组,HAVING过滤分组结果。sql
--基础语法:GROUPBY分组字段+聚合函数
SELECT分组字段,聚合函数(字段)AS别名FROM表名WHERE条件GROUPBY分组字段;
--示例1:按部门分组,统计每个部门的员工人数、平均工资、最高工资
SELECTdept_id部门ID,
COUNT(*)员工人数,
AVG(salary)平均工资,
MAX(salary)最高工资,
MIN(salary)最低工资
FROMemp
WHEREhire_dateISNOTNULL--先筛选有入职日期的员工
GROUPBYdept_id;--按部门ID分组
--示例2:按部门和性别分组(多字段分组),统计每组人数
SELECTdept_id部门ID,gender性别,COUNT(*)人数
FROMemp
GROUPBYdept_id,gender;
--进阶:HAVING过滤分组结果(区别于WHERE:WHERE过滤行,HAVING过滤分组)
--示例:查询平均工资>8000的部门,统计人数和平均工资
SELECTdept_id部门ID,
COUNT(*)员工人数,
AVG(salary)平均工资
FROMemp
GROUPBYdept_id
HAVINGAVG(salary)>8000;--过滤平均工资>8000的分组2.多表连接查询(JOIN)当需要从多个关联表中提取数据时使用,核心是通过“关联字段”(如外键)连接表,常用JOIN类型:INNERJOIN、LEFTJOIN、RIGHTJOIN、FULLJOIN。前提:假设有两张表——emp(员工表,dept_id关联部门表)、dept(部门表,dept_id为主键,含dept_name部门名称)。sql
--1.INNERJOIN(内连接):只返回两张表中关联字段匹配的记录(交集)
--示例:查询员工姓名、部门名称(只显示有对应部门的员工)
SELECTe.emp_name员工姓名,d.dept_name部门名称
FROMempe
INNERJOINdeptdONe.dept_id=d.dept_id;--关联条件:员工表.dept_id=部门表.dept_id
--2.LEFTJOIN(左连接):返回左表(emp)所有记录,右表(dept)匹配不到则显示NULL
--示例:查询所有员工的姓名和部门名称(无部门的员工,部门名称显示NULL)
SELECTe.emp_name员工姓名,d.dept_name部门名称
FROMempe
LEFTJOINdeptdONe.dept_id=d.dept_id;
--3.RIGHTJOIN(右连接):返回右表(dept)所有记录,左表(emp)匹配不到则显示NULL
--示例:查询所有部门及该部门的员工(无员工的部门,员工姓名显示NULL)
SELECTe.emp_name员工姓名,d.dept_name部门名称
FROMempe
RIGHTJOINdeptdONe.dept_id=d.dept_id;
--4.FULLJOIN(全连接):返回两张表所有记录,匹配不到的字段显示NULL(MySQL不支持,需用UNION替代)
--示例:查询所有员工和所有部门,无论是否匹配
SELECTe.emp_name员工姓名,d.dept_name部门名称
FROMempe
LEFTJOINdeptdONe.dept_id=d.dept_id
UNION
SELECTe.emp_name员工姓名,d.dept_name部门名称
FROMempe
RIGHTJOINdeptdONe.dept_id=d.dept_id;
--进阶:多表连接(3张及以上)
--示例:查询员工姓名、部门名称、岗位名称(新增post表,post_id关联emp表)
SELECTe.emp_name员工姓名,d.dept_name部门名称,p.post_name岗位名称
FROMempe
INNERJOINdeptdONe.dept_id=d.dept_id
INNERJOINpostpONe.post_id=p.post_id;3.子查询(嵌套查询)将一个查询结果作为另一个查询的条件或数据源,分为“相关子查询”和“非相关子查询”,常用于复杂筛选。sql
--1.非相关子查询(子查询可独立执行,不依赖主查询)
--示例1:查询工资高于平均工资的员工
SELECTemp_name,salaryFROMemp
WHEREsalary>(SELECTAVG(salary)FROMemp);--子查询:计算平均工资
--示例2:查询部门1中,工资高于部门1平均工资的员工
SELECTemp_name,salaryFROMemp
WHEREdept_id=1ANDsalary>(
SELECTAVG(salary)FROMempWHEREdept_id=1--子查询:计算部门1平均工资
);
--2.相关子查询(子查询依赖主查询的字段,需逐行执行)
--示例:查询每个部门中,工资最高的员工(姓名、部门ID、工资)
SELECTe.emp_name,e.dept_id,e.salaryFROMempe
WHEREe.salary=(
SELECTMAX(salary)FROMempWHEREdept_id=e.dept_id--子查询依赖主查询的dept_id
);
--3.子查询结合IN/NOTIN
--示例:查询有员工的部门(部门表中,存在于员工表的部门)
SELECTdept_id,dept_nameFROMdept
WHEREdept_idIN(SELECTDISTINCTdept_idFROMemp);
--4.子查询结合EXISTS/NOTEXISTS(效率高于IN,适合大数据量)
--示例:查询有员工的部门(与上面示例效果一致,效率更高)
SELECTdept_id,dept_nameFROMdeptd
WHEREEXISTS(SELECT1FROMempeWHEREe.dept_id=d.dept_id);4.合并查询(UNION/UNIONALL)将两个或多个查询结果合并为一个结果集,要求两个查询的字段数量、字段类型一致。sql
--1.UNION:合并结果集,自动去重(效率低,需排序去重)
--示例:查询部门1和部门2的员工,去重
SELECTemp_name,dept_idFROMempWHEREdept_id=1
UNION
SELECTemp_name,dept_idFROMempWHEREdept_id=2;
--2.UNIONALL:合并结果集,不去重(效率高,推荐,无重复数据时使用)
--示例:查询部门1和部门2的员工,保留重复数据(若有)
SELECTemp_name,dept_idFROMempWHEREdept_id=1
UNIONALL
SELECTemp_name,dept_idFROMempWHEREdept_id=2;提示:若确认两个结果集无重复数据,优先使用UNIONALL,避免去重带来的性能损耗。三、高级SQL语句(复杂场景)1.窗口函数(WindowFunction)窗口函数可在不改变基本表结构的情况下,为查询结果添加额外的计算列,无需使用GROUPBY分组,常用于排名、累积计算等场景,支持PARTITIONBY(分组)、ORDERBY(排序)。sql
--基础语法
SELECT字段1,字段2,
窗口函数()OVER(PARTITIONBY分组字段ORDERBY排序字段)AS别名
FROM表名;
--常用窗口函数及示例
--1.排名函数:ROW_NUMBER()、RANK()、DENSE_RANK()
--示例:按部门分组,对员工工资降序排名
SELECTemp_name,dept_id,salary,
ROW_NUMBER()OVER(PARTITIONBYdept_idORDERBYsalaryDESC)ASrn,--唯一排名(无并列)
RANK()OVER(PARTITIONBYdept_idORDERBYsalaryDESC)ASrk,--并列排名(有空缺)
DENSE_RANK()OVER(PARTITIONBYdept_idORDERBYsalaryDESC)ASdrk--并列排名(无空缺)
FROMemp;
--2.累积计算函数:SUM()、AVG()、COUNT()
--示例:按入职日期排序,计算工资的累积总和
SELECTemp_name,hire_date,salary,
SUM(salary)OVER(ORDERBYhire_date)ASrunning_total--累积工资
FROMemp;
--3.前后行函数:LAG()(取前N行数据)、LEAD()(取后N行数据)
--示例:查询每个员工的工资,以及前1名、后1名员工的工资
SELECTemp_name,salary,
LAG(salary,1,0)OVER(ORDERBYsalaryDESC)ASprev_salary,--前1行工资,无则显示0
LEAD(salary,1,0)OVER(ORDERBYsalaryDESC)ASnext_salary--后1行工资,无则显示0
FROMemp;2.公共表表达式(CTE:CommonTableExpressions)临时定义一个子查询结果集,可被多次引用,简化复杂查询的语法,提高可读性和可维护性,分为“普通CTE”和“递归CTE”。sql
--1.普通CTE(非递归)
--语法:WITHCTE名称AS(子查询)主查询
--示例:计算每个部门的平均工资,再查询工资高于部门平均工资的员工
WITHdepartment_avgAS(
SELECTdept_id,AVG(salary)ASavg_salaryFROMempGROUPBYdept_id--CTE:部门平均工资
)
SELECTe.emp_name,e.dept_id,e.salary,d.avg_salary
FROMempe
JOINdepartment_avgdONe.dept_id=d.dept_id
WHEREe.salary>d.avg_salary;
--2.递归CTE(用于遍历层次化数据,如组织架构、物料清单)
--示例:查询员工层级结构(根据manager_id关联,找到每个员工的上下级)
WITHRECURSIVEemployee_hierarchyAS(
--锚点成员:顶层管理者(无上级,manager_id为NULL)
SELECTemp_id,emp_name,manager_id,1ASlevel
FROMemp
WHEREmanager_idISNULL
UNIONALL
--递归成员:关联下级员工(员工的manager_id=上级的emp_id)
SELECTe.emp_id,e.emp_name,e.manager_id,eh.level+1
FROMempe
JOINemployee_hierarchyehONe.manager_id=eh.emp_id
)
SELECT*FROMemployee_hierarchy;--查询所有员工的层级关系3.透视表(PIVOT)与解透视(UNPIVOT)透视表将行转换为列,用于数据汇总展示;解透视是透视的反向操作,将列转换为行,用于数据格式转换。sql
--1.透视表(PIVOT):行转列
--示例:将销售数据表(sales_data:product产品、month月份、sales销售额),转换为按产品、月份汇总的透视表
SELECT*FROM(
SELECTproduct,month,salesFROMsales_data--源数据
)ASsource_table
PIVOT(
SUM(sales)FORmonthIN('Jan','Feb','Mar','Apr')--按月份转列,汇总销售额
)ASpivot_table;
--2.解透视(UNPIVOT):列转行
--示例:将按月汇总的销售表(sales_data:product产品、sales_jan一月销售额、sales_feb二月销售额),转换为行格式
SELECTproduct,month,salesFROM(
SELECTproduct,sales_jan,sales_feb,sales_marFROMsales_data
)ASsource_table
UNPIVOT(
salesFORmonthIN(sales_jan,sales_feb,sales_mar)--将列转为行,指定月份字段
)ASunpivoted_table;4.合并语句(MERGE/UPSERT)合并语句可根据与源表的连接结果,在目标表中同时完成插入、更新、删除操作,常用于数据同步场景(如同步两张表的客户数据)。sql
--语法:MERGEINTO目标表USING源表ON关联条件
--示例:同步source_table(源表)和target_table(目标表)的客户数据
MERGEINTOtarget_tableASt
USINGsource_tableASs
ONt.customer_id=s.customer_id--关联条件:客户ID一致
WHENMATCHEDTHEN--匹配到:更新目标表数据
UPDATESET=,t.email=s.email,t.phone=s.phone
WHENNOTMATCHEDTHEN--未匹配到:插入源表数据到目标表
INSERT(customer_id,name,email,phone)VALUES(s.customer_id,,s.email,s.phone)
WHENNOTMATCHEDBYSOURCETHEN--目标表有、源表无:删除目标表数据(可选)
DELETE;5.条件表达式(CASEWHEN)用于在SQL查询中实现条件逻辑,类似编程语言中的if-else,可用于字段赋值、筛选条件、排序等场景。sql
--1.用于字段赋值(根据条件给字段起别名)
--示例:根据工资给员工分级
SELECTemp_name,salary,
CASE
WHENsalary>=10000THEN'铂金会员'
WHENsalary>=8000THEN'黄金会员'
WHENsalary>=6000THEN'白银会员'
ELSE'普通会员'
ENDAScustomer_level
FROMemp;
--2.用于筛选条件(WHERE子句中)
--示例:查询部门1的高工资员工(工资>9000)和部门2的普通工资员工(工资>7000)
SELECTemp_name,dept_id,salary
FROMemp
WHERECASE
WHENdept_id=1THENsalary>9000
WHENdept_id=2THENsalary>7000
END;
--3.用于排序(ORDERBY子句中)
--示例:先按部门ID排序,部门1的员工排在最前面,其余按工资降序排序
SELECTemp_name,dept_id,salary
FROMemp
ORDERBYCASEWHENdept_id=1THEN0ELSE1END,salaryDESC;四、SQL优化语句(提升执行效率)SQL优化的核心是“最小化数据访问、利用索引优势、简化查询逻辑”,以下是高频优化语句和技巧,结合优化原则提升执行效率。索引相关优化:索引是提升查询效率的核心,合理创建和使用索引,避免索引失效。
--1.创建索引(单字段索引)
CREATEINDEXidx_emp_salaryONemp(salary);--给emp表的salary字段创建索引
--2.创建联合索引(多字段,遵循最左匹配原则)
CREATEINDEXidx_emp_dept_salaryONemp(dept_id,salary);--部门ID+工资,优先匹配dept_id
--3.删除冗余索引(避免重复索引,减少写入开销)
DROPINDEXidx_emp_salaryONemp;
--4.查看索引
SHOWINDEXFROMemp;
--避免索引失效的技巧(关键)
--❶不使用SELECT*,明确指定字段(可使用覆盖索引,避免回表)
SELECTemp_name,salaryFROMempWHEREdept_id=1;--若有联合索引(dept_id,salary),直接命中索引
--❷不在索引字段上使用函数(如SUBSTR、DATE_FORMAT)
--错误:索引失效,全表扫描
SELECT*FROMempWHEREDATE(hire_date)='2024-01-01';
--正确:索引生效
SELECT*FROMempWHEREhire_dateBETWEEN'2024-01-0100:00:00'AND'2024-01-0123:59:59';
--❸避免使用!=、NOTIN、<>等否定运算符(可能导致索引失效)
--错误:索引失效
SELECT*FROMempWHEREdept_id!=1;
--正确:索引生效
SELECT*FROMempWHEREdept_id<1ORdept_id>1;查询语句优化:简化查询逻辑,减少不必要的操作。
--1.用LIMIT限制结果集(避免返回大量无关数据)
SELECT*FROMempWHEREdept_id=1LIMIT10;--只取前10条,提升效率
--2.分页优化(避免偏移量过大,利用索引定位)
--错误:偏移量10000,需扫描10020条数据,效率低
SELECT*FROMempORDERBYemp_idDESCLIMIT10000,20;
--正确:利用主键索引定位,效率极高
SELECT*FROMempWHEREemp_id>10000LIMIT20;
--3.用EXISTS替代IN(大数据量下,EXISTS效率更高)
--错误:大数据量时效率低
SELECT*FROMempWHEREdept_idIN(SELECTdept_idFROMdeptWHEREdept_nameLIKE'销售%');
--正确:效率更高
SELECT*FROMempeWHEREEXISTS(SELECT1FROMdeptdWHEREd.dept_id=e.dept_idANDd.dept_nameLIKE'销售%');
--4.避免子查询嵌套过深,拆解复杂查询(用CTE或多表连接替代)
--错误:嵌套过深,效率低
SELECT*FROMempWHEREdept_idIN(SELECTdept_idFROM(SELECTdept_idFROMdeptWHEREdept_name='技术部')t);
--正确:简化为单条子查询或连接
SELECT*FROMempeJOINdeptdONe.dept_id=d.dept_idWHEREd.dept_name='技术部';其他优化技巧--1.定期清理表碎片(MySQL),提升查询和写入效率
OPTIMIZETABLEemp;
--2.用UNIONALL替代UNION(无重复数据时),减少去重开销
--3.避免在WHERE子句中使用NULL判断(ISNULL除外),尽量给字段设置默认值
--4.批量操作替代单条操作(如批量插入、批量更新),减少数据库连接次数五、权限管理语句(DCL:数据控制语言)用于管理数据库用户的权限(如查询、新增、修改、删除权限),核心是GRANT(授予权限)和REVOKE(收回权限)。sql
--1.创建数据库用户(指定密码和主机)
CREATEUSER'用户名'@'主机地址'IDENTIFIEDBY'密码';
--示例:创建用户test,允许本地访问,密码123456
CREATEUSER'test'@'localhost'IDENTIFIEDBY'123456';
--示例:创建用户test,允许所有主机访问(%代表所有主机)
CREATEUSER'test'@'%'IDENTIFIEDBY'123456';
--2.授予权限(GRANT)
--基础语法:GRANT权限1,权限2...ON数据库.表名TO'用户名'@'主机地址';
--示例1:授予test用户,对emp表的查询、新增、修改权限
GRANTSELECT,INSERT,UPDATEONtest_db.empTO'test'@'localhost';
--示例2:授予test用户,对test_db数据库所有表的所有权限(除了授权权限)
GRANTALLPRIVILEGESONtest_db.*TO'test'@'localhost';
--示例3:授予test用户,所有数据库所有表的所有权限(谨慎使用)
GRANTALLPRIVILEGESON*.*TO'test'@'%';
--3.收回权限(REVOKE)
--基础语法:REVOKE权限1,权限2...ON数据库.表名FROM'用户名'@'主机地址';
--示例:收回test用户对emp表的修改权限
REVOKEUPDATEONtest_db.empFROM'test'@'localhost';
--示例:收回test用户的所有权限
REVOKEALLPRIVILEGESON*.*FROM'test'@'%';
--4.查看用户权限
SHOWGRANTSFOR'test'@'localhost';
--5.删除用户
DROPUSER'test'@'localhost';六、事务控制语句(TCL:事务控制语言)事务是一组不可分割的SQL操作,要么全部执行成功,要么全部执行失败(原子性),核心是保证数据一致性,常用语句:STARTTRANSACTION、COMMIT、ROLLBACK、SAVEPOINT。sql
--1.开启事务(MySQL默认自动提交,需手动开启事务)
STARTTRANSACTION;--简写:BEGIN;
--2.执行SQL操作(多个操作,组成事务)
UPD
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 幼儿园厨师节演讲稿
- 文档编写和版本控制规范
- 《PLC控制技术及应用》课件-中国传统文化中的数制智慧
- 跌倒坠床的急救护理应急措施
- 血液病患者肿瘤标志物监测护理
- 社会利益协调平衡承诺书4篇
- 企业行政办公模板化系统
- 工程项目安全生产诚信承诺书(5篇)
- 钟丽老年护理学老年综合征
- 流程改进优化方案设计工具
- 社区415国家安全教育日
- 印刷厂安全教育培训计划
- 修井作业安全培训课件
- 具身智能+军事应用智能侦察机器人可行性研究报告
- 2025年中央纪委机关公开遴选公务员面试题深度解析与预测趋势
- 湖南省衡阳市一中2026届高三第一次月考数学试卷(含答案)
- 患者身份识别管理标准WST840-2025学习解读课件
- 基于SLP法的京东物流园3C类仓库布局优化研究
- 一带一路战略与国际合作考核试题及答案探讨2025年
- 2025中国临床肿瘤学会CSCO肿瘤厌食-恶病质综合征诊疗指南解读课件
- 租用员工车辆管理制度
评论
0/150
提交评论