SQL语法、语句+实例大全_第1页
SQL语法、语句+实例大全_第2页
SQL语法、语句+实例大全_第3页
SQL语法、语句+实例大全_第4页
SQL语法、语句+实例大全_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

SQL语法、语句+实例大全SQL(StructuredQueryLanguage,结构化查询语言)是用于管理关系型数据库的标准编程语言,核心用于数据库的查询、操纵、定义和控制。本文按SQL功能分类,整理常用语法、核心语句及实战实例,覆盖从基础入门到进阶应用的全场景,适配MySQL、Oracle、SQLServer等主流数据库,兼顾可读性与实用性,适合新手入门和开发者速查。一、SQL基础语法规则SQL语法具有简洁性和通用性,核心规则需严格遵循,避免语法错误,具体如下:关键字大小写不敏感:SELECT、from、Where作用完全一致,但为规范可读性,通常将关键字大写,表名、列名、值的大小写依赖具体数据库(如MySQL默认不区分,Oracle默认区分)。语句结束标识:多数数据库中,单条SQL语句需以分号(;)结尾,用于区分多条语句,避免执行混乱。空格与换行:SQL会忽略多余空格和换行,语句可写在一行或分多行,建议分多行排版,提升可读性。注释规则:单行注释以--开头,多行注释以/*开头、*/结尾,注释内容不执行,用于标注语句功能。字符串处理:字符串需用单引号(')包裹,双引号兼容性较差,不推荐使用。示例(规范写法):sql

--单行注释:查询学生表所有数据

SELECTname,ageFROMstudents;--语句后注释

/*多行注释:

查询年龄大于20的学生

包含姓名和年龄字段

*/

SELECTname,age

FROMstudents

WHEREage>20;二、SQL核心分类及语句实例SQL按功能可分为五大类:数据查询语言(DQL)、数据操纵语言(DML)、数据定义语言(DDL)、数据控制语言(DCL)、事务控制语言(TCL),以下分类别详细说明。(一)数据查询语言(DQL)核心功能:从数据库表中检索所需数据,最常用、最核心的SQL类别,核心关键字为SELECT,配合FROM、WHERE、GROUPBY等子句实现复杂查询。1.基础查询(SELECT)语法:SELECT字段名1,字段名2,...FROM表名[WHERE条件][ORDERBY字段名[ASC/DESC]][LIMIT数量];关键说明:*表示查询所有字段(开发中不推荐,效率低);AS可给字段起别名(可省略);DISTINCT用于去除结果集中的重复记录。实例:sql

--1.查询students表所有字段(不推荐)

SELECT*FROMstudents;

--2.查询students表中name、age、class字段,给class起别名“班级”

SELECTname,age,classAS班级FROMstudents;

--3.查询students表中不重复的班级(去重)

SELECTDISTINCTclassFROMstudents;

--4.查询students表中年龄大于18的学生,按年龄降序排列

SELECTname,ageFROMstudentsWHEREage>18ORDERBYageDESC;2.条件查询(WHERE)语法:SELECT字段名FROM表名WHERE筛选条件;常用筛选运算符:运算符类型具体运算符说明比较运算符=等于比较运算符>、<、>=、<=、<>(!=)大于、小于、大于等于、小于等于、不等于逻辑运算符AND、OR、NOT并且、或者、非范围运算符BETWEEN...AND...在指定数值/日期范围内(包含边界)集合运算符IN、NOTIN在/不在指定集合中模糊运算符LIKE、NOTLIKE模糊匹配,%匹配任意字符,_匹配单个字符空值判断ISNULL、ISNOTNULL判断字段是否为空(不可用=NULL)实例:sql

--1.查询年龄等于20的学生

SELECTname,ageFROMstudentsWHEREage=20;

--2.查询年龄在18-22之间(含)的学生

SELECTname,ageFROMstudentsWHEREageBETWEEN18AND22;

--3.查询班级为1班或3班的学生

SELECTname,classFROMstudentsWHEREclassIN(1,3);

--4.查询姓名以“张”开头的学生(模糊匹配)

SELECTnameFROMstudentsWHEREnameLIKE'张%';

--5.查询手机号不为空的学生

SELECTname,phoneFROMstudentsWHEREphoneISNOTNULL;

--6.查询年龄大于18且班级为2班的学生

SELECTname,age,classFROMstudentsWHEREage>18ANDclass=2;3.聚合查询(聚合函数)核心:对数据进行统计分析,常用聚合函数配合GROUPBY分组,HAVING筛选分组结果(区别于WHERE:WHERE筛选行,HAVING筛选分组)。常用聚合函数:COUNT():统计记录条数(COUNT(*)统计所有行,COUNT(字段名)排除空值);SUM():计算指定字段的总和(仅适用于数值类型);AVG():计算指定字段的平均值(仅适用于数值类型);MAX()/MIN():获取指定字段的最大值/最小值。语法:SELECT聚合函数(字段名)FROM表名[WHERE条件]GROUPBY分组字段[HAVING分组筛选条件];实例:sql

--1.统计students表中学生总人数

SELECTCOUNT(*)AS总人数FROMstudents;

--2.统计每个班级的学生人数

SELECTclassAS班级,COUNT(*)AS人数FROMstudentsGROUPBYclass;

--3.统计每个班级的平均年龄,筛选平均年龄大于20的班级

SELECTclassAS班级,AVG(age)AS平均年龄

FROMstudents

GROUPBYclass

HAVINGAVG(age)>20;

--4.计算1班学生的年龄总和、最大年龄和最小年龄

SELECTSUM(age)AS年龄总和,MAX(age)AS最大年龄,MIN(age)AS最小年龄

FROMstudents

WHEREclass=1;4.多表连接查询核心:关联多个表的字段,实现跨表数据检索,常用连接类型有INNERJOIN、LEFTJOIN、RIGHTJOIN、FULLOUTERJOIN。前提:需存在关联字段(如students表的class_id与classes表的id)。语法:SELECT字段名FROM表1连接类型表2ON表1.关联字段=表2.关联字段[WHERE条件];实例(以students表和classes表为例,关联字段:students.class_id=classes.id):sql

--1.内连接(INNERJOIN):只返回两表中匹配的记录

SELECTAS学生姓名,c.classNameAS班级名称

FROMstudentss

INNERJOINclassesc

ONs.class_id=c.id;

--2.左连接(LEFTJOIN):返回左表所有记录,右表无匹配则填充NULL

SELECTAS学生姓名,c.classNameAS班级名称

FROMstudentss

LEFTJOINclassesc

ONs.class_id=c.id;

--3.右连接(RIGHTJOIN):返回右表所有记录,左表无匹配则填充NULL

SELECTAS学生姓名,c.classNameAS班级名称

FROMstudentss

RIGHTJOINclassesc

ONs.class_id=c.id;

--4.全连接(FULLOUTERJOIN):返回两表所有记录,无匹配部分填充NULL

SELECTAS学生姓名,c.classNameAS班级名称

FROMstudentss

FULLOUTERJOINclassesc

ONs.class_id=c.id;5.子查询核心:嵌套在主查询中的独立查询,用于动态生成条件或中间结果,分为标量子查询、列子查询、行子查询、表子查询。语法:主查询[WHERE/HAVING/FROM](子查询);实例:sql

--1.标量子查询(返回单值):查询年龄大于平均年龄的学生

SELECTname,ageFROMstudentsWHEREage>(SELECTAVG(age)FROMstudents);

--2.列子查询(返回单列多行):查询属于1班或3班的学生(关联classes表id)

SELECTname,class_idFROMstudentsWHEREclass_idIN(SELECTidFROMclassesWHEREclassNameIN('1班','3班'));

--3.表子查询(返回多行多列):查询每个班级的平均年龄,再筛选平均年龄>20的班级

SELECT班级,平均年龄FROM(

SELECTclassAS班级,AVG(age)AS平均年龄FROMstudentsGROUPBYclass

)AStempWHERE平均年龄>20;

--4.相关子查询(依赖外部查询):查询每个班级中年龄大于该班级平均年龄的学生

SELECT,s.class,s.age

FROMstudentss

WHEREs.age>(SELECTAVG(age)FROMstudentsWHEREclass=s.class);6.分页查询核心:限制查询结果的数量,实现分页效果,不同数据库语法略有差异。实例:sql

--1.MySQL/PostgreSQL(LIMIT偏移量,每页条数;偏移量从0开始)

SELECTname,ageFROMstudentsORDERBYageDESCLIMIT0,10;--第1页,每页10条

SELECTname,ageFROMstudentsORDERBYageDESCLIMIT10,10;--第2页,每页10条

--2.Oracle(ROWNUM)

SELECTname,ageFROM(

SELECTname,age,ROWNUMrnFROMstudentsORDERBYageDESC

)WHERErnBETWEEN11AND20;--第2页,每页10条

--3.SQLServer(TOP)

SELECTTOP10name,ageFROMstudentsORDERBYageDESC;--第1页,每页10条

SELECTTOP10name,ageFROMstudentsWHEREidNOTIN(SELECTTOP10idFROMstudentsORDERBYageDESC);--第2页,每页10条(二)数据操纵语言(DML)核心功能:对数据库表中的数据进行增、删、改操作,核心关键字为INSERT(增)、UPDATE(改)、DELETE(删),操作后需配合事务控制(TCL)确保数据一致性。1.插入数据(INSERT)语法1(单条/多条插入):INSERTINTO表名(字段1,字段2,...)VALUES(值1,值2,...),(值1,值2,...);语法2(从其他表插入):INSERTINTO目标表(字段1,字段2,...)SELECT字段1,字段2,...FROM来源表[WHERE条件];实例:sql

--1.向students表插入单条数据(指定字段,推荐)

INSERTINTOstudents(name,age,class,phone)VALUES('张三',20,1,);

--2.向students表批量插入3条数据

INSERTINTOstudents(name,age,class,phone)

VALUES

('李四',19,2,),

('王五',21,1,),

('赵六',20,3,);

--3.从temp_students表(临时表)插入年龄>18的学生到students表

INSERTINTOstudents(name,age,class,phone)

SELECTname,age,class,phoneFROMtemp_studentsWHEREage>18;2.更新数据(UPDATE)语法:UPDATE表名SET字段1=值1,字段2=值2,...[WHERE条件];注意:未加WHERE条件会更新表中所有数据,需谨慎操作。实例:sql

--1.将张三的年龄更新为21

UPDATEstudentsSETage=21WHEREname='张三';

--2.将1班所有学生的年龄增加1

UPDATEstudentsSETage=age+1WHEREclass=1;

--3.更新李四的手机号和班级

UPDATEstudentsSETphone=,class=3WHEREname='李四';3.删除数据(DELETE)语法:DELETEFROM表名[WHERE条件];注意:未加WHERE条件会删除表中所有数据(可通过事务回滚恢复),与TRUNCATE(清空表,不可回滚)区别开。实例:sql

--1.删除姓名为赵六的学生记录

DELETEFROMstudentsWHEREname='赵六';

--2.删除3班所有学生记录

DELETEFROMstudentsWHEREclass=3;

--3.删除年龄小于18的学生记录

DELETEFROMstudentsWHEREage<18;(三)数据定义语言(DDL)核心功能:定义和管理数据库对象(数据库、表、字段、索引、视图等),核心关键字为CREATE(创建)、ALTER(修改)、DROP(删除)、TRUNCATE(清空),操作立即生效,部分操作不可回滚。1.数据库操作(CREATE/DROP)语法:创建数据库:CREATEDATABASE数据库名;删除数据库:DROPDATABASE数据库名;实例:sql

--1.创建名为school的数据库

CREATEDATABASEschool;

--2.删除名为school的数据库(谨慎操作,不可恢复)

DROPDATABASEschool;2.表操作(CREATE/ALTER/DROP/TRUNCATE)语法1(创建表):CREATETABLE表名(字段1数据类型[约束],字段2数据类型[约束],...);常用数据类型:INT(整数)、VARCHAR(长度)(字符串)、DATE(日期)、DATETIME(日期时间)、DECIMAL(总长度,小数位数)(小数)。常用约束:PRIMARYKEY(主键,唯一且非空)、NOTNULL(非空)、UNIQUE(唯一)、FOREIGNKEY(外键,关联其他表)。语法2(修改表):ALTERTABLE表名操作(ADD字段、MODIFY字段、DROP字段等);语法3(删除表):DROPTABLE表名;语法4(清空表):TRUNCATETABLE表名;(区别于DELETE:清空数据不删除表结构,不可回滚)实例:sql

--1.创建students表(含主键、非空约束)

CREATETABLEstudents(

idINTPRIMARYKEYAUTO_INCREMENT,--主键,自增

nameVARCHAR(50)NOTNULL,--姓名,非空

ageINT,--年龄

classVARCHAR(20),--班级

phoneVARCHAR(11)UNIQUE,--手机号,唯一

create_timeDATETIMEDEFAULTNOW()--创建时间,默认当前时间

);

--2.向students表添加gender(性别)字段

ALTERTABLEstudentsADDCOLUMNgenderVARCHAR(10);

--3.修改students表中age字段的类型(从INT改为TINYINT)

ALTERTABLEstudentsMODIFYCOLUMNageTINYINT;

--4.删除students表中的gender字段

ALTERTABLEstudentsDROPCOLUMNgender;

--5.清空students表所有数据(不可回滚)

TRUNCATETABLEstudents;

--6.删除students表(谨慎操作,不可恢复)

DROPTABLEstudents;3.索引操作(CREATE/DROP)核心:提升查询效率,针对频繁查询的字段创建索引,避免全表扫描。语法:创建索引:CREATEINDEX索引名ON表名(字段名);删除索引:DROPINDEX索引名ON表名;实例:sql

--1.为students表的name字段创建索引

CREATEINDEXidx_students_nameONstudents(name);

--2.为students表的class字段创建索引

CREATEINDEXidx_students_classONstudents(class);

--3.删除students表的name字段索引

DROPINDEXidx_students_nameONstudents;4.视图操作(CREATE/DROP)核心:虚拟表,基于查询结果创建,简化复杂查询,不存储实际数据,只存储查询语句。语法:创建视图:CREATEVIEW视图名AS查询语句;删除视图:DROPVIEW视图名;实例:sql

--1.创建视图v_students_class1,查询1班所有学生

CREATEVIEWv_students_class1AS

SELECTname,age,phoneFROMstudentsWHEREclass=1;

--2.查询视图数据(与查询表一致)

SELECT*FROMv_students_class1;

--3.删除视图v_students_class1

DROPVIEWv_students_class1;(四)数据控制语言(DCL)核心功能:管理数据库的访问权限和安全级别,核心关键字为GRANT(授权)、REVOKE(回收权限),仅管理员可执行。语法:授权:GRANT权限类型ON数据库.表名TO用户名;回收权限:REVOKE权限类型ON数据库.表名FROM用户名;常用权限类型:SELECT(查询)、INSERT(插入)、UPDATE(更新)、DELETE(删除)、ALL(所有权限)。实例:sql

--1.授予用户user1对school数据库中students表的查询和插入权限

GRANTSELECT,INSERTONschool.studentsTOuser1;

--2.授予用户user2对school数据库中所有表的所有权限

GRANTALLONschool.*TOuser2;

--3.回收用户user1对students表的插入权限

REVOKEINSERTONschool.studentsFROMuser1;

--4.回收用户user2对school数据库所有表的所有权限

REVOKEALLONschool.*FROMuser2;(五)事务控制语言(TCL)核心功能:管理数据库事务,确保数据的一致性和完整性,核心关键字为COMMIT(提交)、ROLLBACK(回滚)、SAVEPOINT(保存点),常用于DML操作后。事务特性(ACID):原子性、一致性、隔离性、持久性。语法:开启事务:STARTTRANSACTION;(可省略,默认自动开启)提交事务:COMMIT;(确认操作,永久保存数据)回滚事务:ROLLBACK;(取消操作,恢复到事务开始前状态)设置保存点:SAVEPOINT保存点名;(可回滚到指定保存点)实例(转账场景,确保转出和转入操作同时成功或同时失败):sql

--开启事务

STARTTRANSACTION;

--操作1:用户A转出100元(减少余额)

UPDATEuser_accountSETbalance=balance-100WHEREusername='A';

--操作2:用户B转入100元(增加余额)

UPDATEuser_accountSETbalance=balance+100WHEREusername='B';

--检查操作是否正确,正确则提交,错误则回滚

COMMIT;--提交事务,数据永久保存

--ROLLBACK;--若出现错误,执行回滚,恢复到事务开始前状态

--带保存点的事务示例

STARTTRANSACTION;

UPDATEuser_accountSETbalance=balance-50WHEREusername='A';

SAVEPOINTsp1;--设置保存点sp1

UPDATEuser_accountSETbalance=balance+50WHEREusername='C';

--若第二个操作错误,回滚到保存点sp1(仅取消第二个操作)

ROLLBACKTOsp1;

COMMIT;--提交第一个操作,取消第二个操作三、SQL进阶语句及实例1.窗口函数核心:在结果集的滑动窗口内执行计算(如排名、累计求和),不改变原表结构,常用函数:ROW_NUMBER()、RANK()、DENSE_RANK()、SUM()OVER(PARTITIONBY)。语法:SELECT字段名,窗口函数()OVER(PARTITIONBY分组字段ORDERBY排序字段[ASC/DESC])AS别名FROM表名;实例:sql

--1.计算每个班级学生的薪资排名(RANK():并列排名,跳过后续名次)

SELECT

name,

class,

salary,

RANK()OVER(PARTITIONBYclassORDERBYsalaryDESC)AS班级薪资排名

FROMstudents;

--2.计算每个班级学生的薪资排名(DENSE_RANK():并列排名,不跳过后续名次)

SELECT

name,

class,

salary,

DENSE_RANK()OVER(PARTITIONBYclassORDERBYsalaryDESC)AS班级薪资排名

FROMstudents;

--3.计算每个班级学生的累计薪资

SELECT

name,

class,

salary,

SUM(salary)OVER(PARTITIONBYclassORDERBYsalaryDESC)AS累计薪资

FROMstudents;2.公共表表达式(CTE)核心:定义临时结果集,提升查询可读性和复用性,支持递归(查询层级结构,如组织架构)。语法:WITH临时表名AS(查询语句)SELECT字段名FROM临时表名;实例(递归CTE查询组织架构):sql

--假设表org有id(员工ID)、name(员工姓名)、parent_id(上级ID)字段

WITHRECURSIVEOrgChartAS(

--基础查询:查询顶级上级(parent_id为NULL)

SELECTid,name,parent_id,1AS层级FROMorgWHEREparent_idISNULL

UNIONALL

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

SELECTo.id,,o.parent_id,oc.层级+1AS层级

温馨提示

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

评论

0/150

提交评论