常用经典SQL语句大全(完整新版)_第1页
常用经典SQL语句大全(完整新版)_第2页
常用经典SQL语句大全(完整新版)_第3页
常用经典SQL语句大全(完整新版)_第4页
常用经典SQL语句大全(完整新版)_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

常用经典SQL语句大全(完整新版)本文由数据库领域权威人士总结,涵盖SQL核心操作、进阶用法、实战场景,适配MySQL、Oracle、SQLServer等主流数据库,标注不同数据库语法差异,兼顾基础入门与实战优化,适合开发、运维、数据分析等各类从业者查阅使用,全程贴合最新数据库版本特性,摒弃过时语法,聚焦高频实用场景。一、SQL基础概述SQL(StructuredQueryLanguage)是关系型数据库的标准操作语言,核心作用是存取、查询、更新和管理数据,具有标准化、跨平台兼容性及易用性等优势,可适配各类主流关系型数据库系统。根据功能可分为五大类:数据定义语言(DDL)、数据查询语言(DQL)、数据操作语言(DML)、数据控制语言(DCL)、事务控制语言(TCL),各类语句协同构成完整的数据处理体系。二、数据定义语言(DDL)——定义数据库结构用于创建、修改、删除数据库对象(数据库、表、索引、视图等),操作不可逆,执行后直接生效,无需提交事务。(一)数据库操作创建数据库:指定字符集和排序规则,避免中文乱码

--标准语法

CREATEDATABASEIFNOTEXISTS数据库名CHARACTERSETutf8mb4COLLATEutf8mb4_unicode_ci;

--示例:创建名为test_db的数据库

CREATEDATABASEIFNOTEXISTStest_dbCHARACTERSETutf8mb4COLLATEutf8mb4_unicode_ci;查看所有数据库--通用语法

SHOWDATABASES;

--Oracle语法

SELECTNAMEFROMV$DATABASE;使用数据库USE数据库名;

--示例:使用test_db数据库

USEtest_db;删除数据库:谨慎操作,删除后数据无法恢复

--标准语法

DROPDATABASEIFEXISTS数据库名;

--示例:删除test_db数据库

DROPDATABASEIFEXISTStest_db;(二)表操作创建表:指定字段名、数据类型、约束(主键、外键、非空、唯一等),适配主流数据库特性

--标准语法(兼容MySQL/Oracle/SQLServer)

CREATETABLEIFNOTEXISTS表名(

字段1数据类型约束,

字段2数据类型约束,

...,

约束定义--主键、外键等

)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;--MySQL特有引擎设置

--示例:创建员工表employees,包含主键、非空、唯一约束

CREATETABLEIFNOTEXISTSemployees(

employee_idINTPRIMARYKEYAUTO_INCREMENT,--主键自增(MySQL)

emp_nameVARCHAR(50)NOTNULL,--非空约束

emp_noVARCHAR(20)UNIQUENOTNULL,--唯一+非空约束

genderCHAR(1)CHECK(genderIN('男','女')),--检查约束

hire_dateDATENOTNULL,--非空约束

department_idINT,--外键关联字段

--外键约束(关联部门表departments的department_id)

FOREIGNKEY(department_id)REFERENCESdepartments(department_id)ONDELETESETNULL

)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;

--Oracle主键自增写法(需先创建序列)

CREATESEQUENCEseq_emp_idSTARTWITH1INCREMENTBY1;

CREATETABLEemployees(

employee_idINTPRIMARYKEY,

emp_nameVARCHAR(50)NOTNULL,

--其他字段省略

);

--插入时使用序列

INSERTINTOemployees(employee_id,emp_name)VALUES(seq_emp_id.NEXTVAL,'张三');查看表结构--MySQL/SQLServer

DESC表名;

--或

DESCRIBE表名;

--Oracle

DESCRIBE表名;

--或

SELECT*FROMUSER_TAB_COLUMNSWHERETABLE_NAME='表名';修改表结构(ALTERTABLE):新增列、删除列、修改列属性、添加/删除约束

--1.新增列

ALTERTABLE表名ADD列名数据类型约束;

--示例:为employees表添加Department列

ALTERTABLEemployeesADDDepartmentVARCHAR(50);

--2.删除列

ALTERTABLE表名DROPCOLUMN列名;--标准SQL

--SQLServer简化写法:ALTERTABLE表名DROP列名;

--示例:移除employees表的Email列

ALTERTABLEemployeesDROPCOLUMNEmail;

--3.修改列属性(数据类型、长度等)

--MySQL语法

ALTERTABLE表名MODIFYCOLUMN列名新数据类型;

--SQLServer语法

ALTERTABLE表名ALTERCOLUMN列名新数据类型;

--示例(MySQL):修改Department列为VARCHAR(100)

ALTERTABLEemployeesMODIFYCOLUMNDepartmentVARCHAR(100);

--4.添加主键约束

ALTERTABLE表名ADDCONSTRAINT主键名PRIMARYKEY(字段1,字段2);--支持复合主键

--示例:为Orders表添加主键

ALTERTABLEOrdersADDCONSTRAINTpk_OrdersPRIMARYKEY(OrderID);

--5.删除主键约束

--SQLServer/Oracle

ALTERTABLE表名DROPCONSTRAINT主键名;

--MySQL

ALTERTABLE表名DROPPRIMARYKEY;删除表:谨慎操作,删除表结构及所有数据

--标准语法,删除表(若存在)

DROPTABLEIFEXISTS表名;

--示例:删除employees表

DROPTABLEIFEXISTSemployees;复制表结构/数据--1.仅复制表结构(不复制数据)

CREATETABLE新表名LIKE原表名;--MySQL特有

--通用写法(所有数据库适用)

CREATETABLE新表名ASSELECT*FROM原表名WHERE1=2;

--2.复制表结构+数据

CREATETABLE新表名ASSELECT*FROM原表名;

--示例:复制employees表的结构和数据到employees_backup

CREATETABLEemployees_backupASSELECT*FROMemployees;(三)索引操作索引可显著提高SELECT查询速度,但会增加INSERT、UPDATE、DELETE操作的开销,需合理创建。支持唯一索引、复合索引、普通索引等类型。创建索引--标准语法:CREATE(UNIQUE)INDEX索引名ON表名(字段1(ASC|DESC),字段2...);

--UNIQUE:唯一索引,确保索引列值唯一

--ASC/DESC:排序方式,默认ASC

--示例1:为employees表的emp_name列创建普通索引

CREATEINDEXidx_emp_nameONemployees(emp_name);

--示例2:为employees表的emp_name和emp_no创建复合唯一索引

CREATEUNIQUEINDEXidx_emp_name_noONemployees(emp_name,emp_no);

--示例3:创建覆盖索引(包含查询常用字段,提升查询效率)

CREATEINDEXidx_emp_dept_hireONemployees(department_id,hire_date)INCLUDE(emp_name,emp_no);--SQLServer/Oracle查看索引--MySQL

SHOWINDEXFROM表名;

--SQLServer

EXECsp_helpindex表名;

--Oracle

SELECT*FROMUSER_INDEXESWHERETABLE_NAME='表名';删除索引--标准语法

DROPINDEX索引名ON表名;--部分数据库不支持ON子句

--SQLServer:DROPINDEX索引名FROM表名;

--MySQL:DROPINDEX索引名ON表名;

--示例:删除employees表的idx_emp_name索引

DROPINDEXidx_emp_nameONemployees;(四)视图操作视图是虚拟表,基于SQL查询结果集,不存储实际数据,可简化复杂查询、控制数据访问权限。创建视图--标准语法

CREATEVIEW视图名AS

SELECT字段1,字段2,...FROM表名WHERE条件;

--示例:创建视图,展示研发部员工信息

CREATEVIEWview_rnd_employeesAS

SELECTemployee_id,emp_name,hire_dateFROMemployeesWHEREdepartment_id=101;查看视图--查看所有视图

--MySQL:SHOWTABLESWHERETABLE_TYPE='VIEW';

--SQLServer:SELECT*FROMsys.views;

--Oracle:SELECT*FROMUSER_VIEWS;

--查看视图结构

DESC视图名;

--查看视图的创建语句

--MySQL:SHOWCREATEVIEW视图名;

--SQLServer:EXECsp_helptext视图名;

--Oracle:SELECTTEXTFROMUSER_VIEWSWHEREVIEW_NAME='视图名';修改视图--标准语法

ALTERVIEW视图名AS

SELECT新字段列表FROM表名WHERE新条件;

--示例:修改视图,增加emp_no字段

ALTERVIEWview_rnd_employeesAS

SELECTemployee_id,emp_name,emp_no,hire_dateFROMemployeesWHEREdepartment_id=101;删除视图DROPVIEWIFEXISTS视图名;

--示例:删除view_rnd_employees视图

DROPVIEWIFEXISTSview_rnd_employees;三、数据查询语言(DQL)——检索数据(最常用)核心是SELECT语句,可实现单表查询、多表关联、聚合统计、排序、分页等功能,是日常开发中使用频率最高的SQL语句,语法灵活,需重点掌握。(一)基础查询查询所有字段:不推荐在生产环境使用(效率低、易受表结构变更影响)

SELECT*FROM表名;

--示例:查询employees表所有数据

SELECT*FROMemployees;查询指定字段:推荐用法,明确所需字段,提升查询效率

SELECT字段1,字段2,...FROM表名;

--示例:查询员工的姓名、工号、入职日期

SELECTemp_name,emp_no,hire_dateFROMemployees;别名查询:简化字段名/表名,提升可读性

--字段别名:字段名AS别名(AS可省略)

SELECTemp_nameAS姓名,emp_noAS工号FROMemployees;

--表别名:表名AS别名(多表查询常用)

SELECTe.emp_name,e.hire_dateFROMemployeesASe;去重查询:使用DISTINCT,去除重复记录

SELECTDISTINCT字段名FROM表名;

--示例:查询所有不重复的部门ID

SELECTDISTINCTdepartment_idFROMemployees;(二)条件查询(WHERE子句)通过WHERE指定查询条件,筛选符合要求的记录,支持多种条件运算符(=、!=、>、<、>=、<=、IN、BETWEEN、LIKE、ISNULL等)。sql

--1.等值查询(=)

SELECT*FROMemployeesWHEREdepartment_id=101;--查询研发部员工

--2.非等值查询(!=、<>)

SELECT*FROMemployeesWHEREsalary>8000;--查询工资大于8000的员工

--3.范围查询(BETWEEN...AND...):包含边界值

SELECT*FROMemployeesWHEREhire_dateBETWEEN'2020-01-01'AND'2023-12-31';--查询2020-2023年入职的员工

--4.多值查询(IN):匹配多个值,等价于多个OR

SELECT*FROMemployeesWHEREdepartment_idIN(101,102,103);--查询研发、产品、测试部员工

--反向:NOTIN(不匹配指定值)

SELECT*FROMemployeesWHEREdepartment_idNOTIN(101,102);

--5.模糊查询(LIKE):匹配指定模式,%匹配任意字符(0个/多个),_匹配单个字符

SELECT*FROMemployeesWHEREemp_nameLIKE'张%';--查询姓张的员工(前缀匹配,可命中索引)

SELECT*FROMemployeesWHEREemp_nameLIKE'%三';--查询名字以三结尾的员工(后缀匹配,无法命中索引)

SELECT*FROMemployeesWHEREemp_nameLIKE'_三_';--查询名字中间是三、长度为3的员工

--6.空值查询(ISNULL、ISNOTNULL):不能用=、!=判断空值

SELECT*FROMemployeesWHEREdepartment_idISNULL;--查询未分配部门的员工

SELECT*FROMemployeesWHEREdepartment_idISNOTNULL;--查询已分配部门的员工

--7.多条件组合(AND、OR、NOT):优先级NOT>AND>OR,可加括号改变优先级

SELECT*FROMemployeesWHEREdepartment_id=101ANDsalary>8000;--研发部工资大于8000的员工

SELECT*FROMemployeesWHERE(department_id=101ORdepartment_id=102)ANDhire_date>'2022-01-01';(三)排序查询(ORDERBY)对查询结果按指定字段排序,ASC(升序,默认)、DESC(降序),可多字段排序。sql

--单字段排序

SELECT*FROMemployeesORDERBYsalaryDESC;--按工资降序排列

--多字段排序:先按部门ID升序,再按工资降序

SELECT*FROMemployeesORDERBYdepartment_idASC,salaryDESC;

--动态排序(根据条件调整排序逻辑)

SELECTproduct_name,stock_quantity

FROMinventory

ORDERBY

CASE

WHENstock_quantity<10THEN1

WHENstock_quantityBETWEEN10AND50THEN2

ELSE3

END,

product_nameDESC;(四)分页查询不同数据库分页语法差异较大,核心是限制查询结果的条数和起始位置,避免大数据量查询卡顿。sql

--1.MySQL:LIMIT起始位置,条数(起始位置从0开始)

SELECT*FROMemployeesORDERBYemployee_idDESCLIMIT0,10;--第1页,10条/页

SELECT*FROMemployeesORDERBYemployee_idDESCLIMIT10OFFSET0;--等价写法

--2.SQLServer:TOP+OFFSET...FETCHNEXT(2012及以上版本)

SELECTTOP10*FROMemployeesORDERBYemployee_idDESC;--第1页

SELECT*FROMemployeesORDERBYemployee_idDESCOFFSET10ROWSFETCHNEXT10ROWSONLY;--第2页

--3.Oracle:ROWNUM(需嵌套查询)

SELECT*FROM(

SELECTe.*,ROWNUMrnFROMemployeeseORDERBYemployee_idDESC

)WHERErnBETWEEN11AND20;--第2页,10条/页(五)聚合查询(GROUPBY+聚合函数)聚合函数用于对数据进行统计计算,需配合GROUPBY分组,常用聚合函数:COUNT(计数)、SUM(求和)、AVG(平均值)、MAX(最大值)、MIN(最小值)。HAVING用于过滤分组后的结果(区别于WHERE:WHERE过滤行,HAVING过滤分组)。sql

--1.基础聚合:统计员工总数

SELECTCOUNT(*)AS员工总数FROMemployees;--COUNT(*)统计所有行,包含NULL

SELECTCOUNT(emp_name)AS员工总数FROMemployees;--COUNT(字段)统计非NULL行

--2.分组聚合:按部门分组,统计各部门员工数、平均工资、最高工资

SELECT

department_idAS部门ID,

COUNT(*)AS员工数,

AVG(salary)AS平均工资,

MAX(salary)AS最高工资,

MIN(salary)AS最低工资,

SUM(salary)AS工资总额

FROMemployees

GROUPBYdepartment_id;--分组字段必须是查询字段(除聚合函数外)

--3.HAVING过滤分组:筛选员工数大于5的部门

SELECT

department_idAS部门ID,

COUNT(*)AS员工数

FROMemployees

GROUPBYdepartment_id

HAVINGCOUNT(*)>5;--不能用WHERE,WHERE无法过滤分组结果

--4.复合分组统计:按部门和入职年份分组

SELECT

department_id,

EXTRACT(YEARFROMhire_date)AShire_year,

AVG(salary)ASavg_salary

FROMemployees

GROUPBYROLLUP(department_id,EXTRACT(YEARFROMhire_date));(六)多表关联查询(JOIN)用于从多个关联表中提取数据,核心是通过关联字段(如外键)建立表之间的联系,常用JOIN类型:INNERJOIN、LEFTJOIN、RIGHTJOIN、FULLJOIN(MySQL不直接支持,需用UNION模拟)。JOIN类型说明示例场景INNERJOIN(内连接)只返回两表中匹配的记录查询有订单的用户及订单信息LEFTJOIN(左连接)返回左表所有记录,右表匹配不到则为NULL查询所有用户及关联订单(无订单用户也显示)RIGHTJOIN(右连接)返回右表所有记录,左表匹配不到则为NULL查询所有订单及关联用户(无用户的订单也显示)FULLJOIN(全连接)返回两表所有记录,匹配不到则为NULL查询所有用户和所有订单的关联关系(MySQL需模拟)sql

--示例1:INNERJOIN(内连接)——查询员工及所属部门信息(只显示有部门的员工)

SELECTe.emp_name,e.emp_no,d.department_name

FROMemployeese

INNERJOINdepartmentsdONe.department_id=d.department_id;--ON指定关联条件

--示例2:LEFTJOIN(左连接)——查询所有员工及所属部门信息(无部门员工显示NULL)

SELECTe.emp_name,e.emp_no,IFNULL(d.department_name,'未分配')AS部门名称--IFNULL处理NULL值

FROMemployeese

LEFTJOINdepartmentsdONe.department_id=d.department_id;

--示例3:RIGHTJOIN(右连接)——查询所有部门及所属员工(无员工的部门显示NULL)

SELECTd.department_name,e.emp_name

FROMemployeese

RIGHTJOINdepartmentsdONe.department_id=d.department_id;

--示例4:模拟FULLJOIN(MySQL)——查询所有员工和所有部门的关联关系

SELECTe.emp_name,d.department_nameFROMemployeeseLEFTJOINdepartmentsdONe.department_id=d.department_id

UNION

SELECTe.emp_name,d.department_nameFROMemployeeseRIGHTJOINdepartmentsdONe.department_id=d.department_id;

--示例5:三表连接——查询订单、用户、产品信息

SELECTo.order_id,c.customer_name,duct_name,o.order_date

FROMorderso

INNERJOINcustomerscONo.customer_id=c.customer_id

LEFTJOINorder_detailsodONo.order_id=od.order_id

LEFTJOINproductspONduct_id=duct_id

WHEREo.order_date>'2025-01-01';(七)子查询将一个查询结果作为另一个查询的条件或数据源,分为非相关子查询(独立执行)和相关子查询(依赖外部查询),常用关键字:IN、NOTIN、EXISTS、NOTEXISTS。sql

--1.非相关子查询:子查询可独立执行,不依赖外部查询

--示例:查询工资高于平均工资的员工

SELECT*FROMemployeesWHEREsalary>(SELECTAVG(salary)FROMemployees);

--2.相关子查询:子查询依赖外部查询的字段,需逐行执行

--示例:查询有下属的员工(员工表中manager_id关联上级employee_id)

SELECTe.emp_nameAS上级姓名

FROMemployeese

WHEREEXISTS(

SELECT1FROMemployeese2WHEREe2.manager_id=e.employee_id

);--EXISTS判断子查询是否有结果,有则返回true

--3.子查询作为数据源:将子查询结果作为临时表

SELECTt.department_id,t.员工数FROM(

SELECTdepartment_id,COUNT(*)AS员工数FROMemployeesGROUPBYdepartment_id

)tWHEREt.员工数>5;

--4.IN与EXISTS对比:大量数据时EXISTS性能更优

--少量值匹配(适合IN)

SELECTusername,emailFROMuser_infoWHEREidIN(1,2,3);

--大量值匹配(适合EXISTS)

SELECTusername,emailFROMuser_infou

WHEREEXISTS(SELECT1FROMorder_infooWHEREo.user_id=u.id);(八)高级查询技巧窗口函数:支持跨行计算,无需分组即可实现排名、移动平均等功能,常用窗口函数:RANK()、DENSE_RANK()、ROW_NUMBER()、AVG()OVER()。

--示例1:按部门对员工工资排名(RANK():并列排名,跳过后续名次)

SELECT

emp_name,

department_id,

salary,

RANK()OVER(PARTITIONBYdepartment_idORDERBYsalaryDESC)AS工资排名

FROMemployees;

--示例2:计算各分类产品的平均价格及当前产品排名

SELECT

ProductID,

Category,

Price,

RANK()OVER(PARTITIONBYCategoryORDERBYPriceDESC)ASPriceRank,

AVG(Price)OVER(PARTITIONBYCategory)ASCategoryAvgPrice

FROMProducts;

--示例3:计算移动平均(近5条数据的平均温度)

SELECT

event_time,

temperature,

AVG(temperature)OVER(

ORDERBYevent_time

ROWSBETWEEN5PRECEDINGANDCURRENTROW

)ASmoving_avg

FROMsensor_data;递归查询(WITHRECURSIVE):适用于层级结构数据(如组织架构、分类目录),MySQL8.0+、Oracle、SQLServer支持。

--示例:查询组织架构,显示员工及其所有上级

WITHRECURSIVEorg_hierarchyAS(

--锚点查询:顶级员工(无上级,manager_id为NULL)

SELECTemployee_id,emp_name,manager_idFROMemployeesWHEREmanager_idISNULL

UNIONALL

--递归查询:关联下级员工

SELECTe.employee_id,e.emp_name,e.manager_id

FROMemployeese

INNERJOINorg_hierarchyohONe.manager_id=oh.employee_id

)

SELECT*FROMorg_hierarchy;UNION/UNIONALL:合并多个查询结果,UNION去重(效率低),UNIONALL不去重(效率高),要求两个查询的字段数、数据类型一致。

--示例:合并研发部和产品部的员工信息(去重)

SELECTemp_name,emp_noFROMemployeesWHEREdepartment_id=101

UNION

SELECTemp_name,emp_noFROMemployeesWHEREdepartment_id=102;

--合并结果(不去重)

SELECTemp_name,emp_noFROMemployeesWHEREdepartment_id=101

UNIONALL

SELECTemp_name,emp_noFROMemployeesWHEREdepartment_id=102;四、数据操作语言(DML)——操作表中数据用于插入、更新、删除表中的数据,操作后需提交事务(COMMIT)生效,可回滚(ROLLBACK)撤销操作,核心语句:INSERT、UPDATE、DELETE。(一)插入数据(INSERT)插入单条数据--标准语法:指定字段名(推荐,避免表结构变更报错)

INSERTINTO表名(字段1,字段2,...)VALUES(值1,值2,...);

--示例:插入一条员工数据

INSERTINTOemployees(emp_name,emp_no,gender,hire_date,department_id)

VALUES('张三','EMP001','男','2022-01-15',101);

--简化语法:不指定字段名(需按表字段顺序插入所有值,不推荐)

INSERTINTO表名VALUES(值1,值2,...);插入多条数据:效率高于单条插入,推荐批量插入优化

--标准语法

INSERTINTO表名(字段1,字段2,...)

VALUES(值1,值2,...),(值3,值4,...),...;

--示例:批量插入3条员工数据

INSERTINTOemployees(emp_name,emp_no,gender,hire_date,department_id)

VALUES

('李四','EMP002','女','2022-03-20',102),

('王五','EMP003','男','2022-05-10',101),

('赵六','EMP004','女','2022-07-01',103);

--扩展:插入查询结果(将查询到的数据直接插入表中)

INSERTINTOuser_info(username,age,gender,email)

SELECT'copy_user',age,gender,CONCAT('copy_',email)

FROMuser_info

WHEREid=1;--复制id=1的用户数据,修改用户名和邮箱(二)更新数据(UPDATE)谨慎操作,必须加WHERE子句(否则会更新表中所有数据),支持多表关联更新。sql

--1.单表更新

UPDATE表名SET字段1=值1,字段2=值2,...WHERE条件;

--示例:将EMP001的工资改为9000

UPDATEemployeesSETsalary=9000WHEREemp_no='EMP001';

--2.多表关联更新(根据关联表数据更新目标表)

--示例:给有已支付订单的用户年龄+1

UPDATEuser_infou

JOINorder_infooONu.id=o.user_id

SETu.age=u.age+1

WHEREo.order_status=1;

--3.动态计算更新

UPDATEinventory

SET

reorder_level=

CASE

WHENlead_time>7THENstock_quantity*0.3

ELSEstock_quantity*0.2

END,

last_updated=NOW()

WHEREproduct_category='Electronics';(三)删除数据(DELETE)谨慎操作,必须加WHERE子句(否则会删除表中所有数据),支持多表关联删除,删除后的数据可通过事务回滚恢复(未提交前)。sql

--1.单表删除

DELETEFROM表名WHERE条件;

--示例:删除emp_no为EMP004的员工

DELETEFROMemployeesWHEREemp_no='EMP004';

--2.多表关联删除

--示例:删除无订单的用户

DELETEuFROMuser_infou

LEFTJOINorder_infooONu.id=o.user_id

WHEREo.user_idISNULL;

--3.软删除(推荐,不真正删除数据,仅标记删除状态)

UPDATEorders

SETis_active=0,

delete_timestamp=NOW(),

delete_operator=CURRENT_USER

WHEREorder_date<'2020-01-01';

--4.清空表数据(TRUNCATE):删除所有数据,不可回滚,重置自增主键

TRUNCATETABLE表名;

--区别于DELETE:DELETE可加WHERE、可回滚,TRUNCATE效率更高、不可回滚五、数据控制语言(DCL)——控制访问权限用于管理数据库用户的创建、删除和权限分配,控制用户对数据库对象的操作权限,核心语句:CREATEUSER、DROPUSER、GRANT、REVOKE。(一)用户管理sql

--1.创建用户(MySQL)

CREATEUSERIFNOTEXISTS'用户名'@'主机地址'IDENTIFIEDBY'密码';

--示例:创建本地用户test_user,密码为123456

CREATEUSERIFNOTEXISTS'test_user'@'localhost'IDENTIFIEDBY'123456';

--Oracle创建用户

CREATEUSER用户名IDENTIFIEDBY密码DEFAULTTABLESPACE表空间;

--2.修改用户密码

--MySQL

ALTERUSER'用户名'@'主机地址'IDENTIFIEDBY'新密码';

--示例:修改test_user的密码为654321

ALTERUSER'test_user'@'localhost'IDENTIFIEDBY'654321';

--3.删除用户

--MySQL

DROPUSERIFEXISTS'用户名'@'主机地址';

--示例:删除test_user用户

DROPUSERIFEXISTS'test_user'@'localhost';

--Oracle

DROPUSER用户名CASCADE;--CASCADE:级联删除用户所有对象(二)权限管理常用权限:SELECT(查询)、INSERT(插入)、UPDATE(更新)、DELETE(删除)、CREATE(创建)、DROP(删除)、ALLPRIVILEGES(所有权限),可针对数据库、表、视图等对象分配权限。sql

--1.授予权限(GRANT)

--语法:GRANT权限1,权限2...ON数据库.表名TO'用户名'@'主机地址';

--示例1:授予test_user查询test_db数据库所有表的权限

GRANTSELECTONtest_db.*TO'test_user'@'localhost';

--示例2:授予test_user对employees表的插入、更新、删除权限

GRANTINSERT,UPDATE,DELETEONtest_db.employeesTO'test_user'@'localhost';

--示例3:授予所有权限(谨慎使用)

GRANTALLPRIVILEGESONtest_db.*TO'test_user'@'localhost';

--2.撤销权限(REVOKE)

--语法:REVOKE权限1,权限2...ON数据库.表名FROM'用户名'@'主机地址';

--示例:撤销test_user对employees表的删除权限

REVOKEDELETEONtest_db.employeesFROM'test_user'@'localhost';

--3.立即生效权限变更(MySQL)

FLUSHPRIVILEGES;六、事务控制语言(TCL)——管理事务事务是一组不可分割的SQL操作,要么全部执行成功,要么全部执行失败(原子性),核心语句:STARTTRANSACTION(开启事务)、COMMIT(提交事务)、ROLLBACK(回滚事务)、SAVEPOINT(设置保存点)。sql

--1.开启事务

STARTTRANSACTION;--或BEGIN;

--2.执行SQL操作(多个DML语句)

UPDATEaccountsSETBalance=Balance-100WHEREAccountID=1;--账户1扣款100

UPDATEaccountsSETBalance=Balance+100WHEREAccountID=2;--账户2加款100

--3.设置保存点(可选,用于部分回滚)

SAVEPOINTsp1;

--4.继续执行操作

UPDATEInventorySETStock=Stock-1WHEREP

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论