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

下载本文档

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

文档简介

SQL语法大全及实例说明:本文所有实例基于MySQL数据库,使用通用表结构(学生表student、课程表course、成绩表score),表结构如下,后续实例均围绕此表展开,便于理解和复用。一、基础表结构(实例依赖)sql

--1.学生表(student):存储学生基本信息

CREATETABLEstudent(

idINTPRIMARYKEYAUTO_INCREMENT,--学生ID(主键,自增)

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

ageINTDEFAULT0,--学生年龄(默认0)

genderCHAR(1)CHECK(genderIN('男','女')),--性别(只能是男/女)

classVARCHAR(20)NOTNULL,--班级

create_timeDATETIMEDEFAULTNOW()--录入时间(默认当前时间)

);

--2.课程表(course):存储课程信息

CREATETABLEcourse(

course_idINTPRIMARYKEYAUTO_INCREMENT,--课程ID(主键,自增)

course_nameVARCHAR(50)NOTNULL,--课程名称(非空)

teacherVARCHAR(50)NOTNULL,--授课老师

creditINTNOTNULLCHECK(credit>0)--学分(大于0)

);

--3.成绩表(score):存储学生课程成绩(关联学生和课程)

CREATETABLEscore(

score_idINTPRIMARYKEYAUTO_INCREMENT,--成绩ID(主键,自增)

student_idINTNOTNULL,--关联学生ID(外键)

course_idINTNOTNULL,--关联课程ID(外键)

scoreINTCHECK(scoreBETWEEN0AND100),--成绩(0-100分)

exam_dateDATENOTNULL,--考试日期

--外键约束:关联学生表和课程表,删除/更新时同步限制

FOREIGNKEY(student_id)REFERENCESstudent(id)ONDELETECASCADEONUPDATECASCADE,

FOREIGNKEY(course_id)REFERENCEScourse(course_id)ONDELETECASCADEONUPDATECASCADE,

--唯一约束:一个学生一门课程只能有一个成绩

UNIQUEKEY(student_id,course_id)

);

--插入测试数据(便于后续实例运行)

INSERTINTOstudent(name,age,gender,class)

VALUES('张三',18,'男','高一(1)班'),('李四',17,'女','高一(2)班'),('王五',18,'男','高一(1)班');

INSERTINTOcourse(course_name,teacher,credit)

VALUES('数学','张老师',3),('语文','李老师',2),('英语','王老师',3);

INSERTINTOscore(student_id,course_id,score,exam_date)

VALUES(1,1,90,'2026-01-15'),(1,2,85,'2026-01-16'),(2,1,78,'2026-01-15'),(3,3,92,'2026-01-17');二、SQL核心语法(按使用频率排序)2.1数据查询语言(DQL)——SELECT(最常用)功能:从表中查询指定数据,支持筛选、排序、分组、关联等,是SQL使用最频繁的语法。2.1.1基础查询(查询指定字段/所有字段)sql

--1.查询所有学生的所有信息(*表示所有字段,不推荐生产环境使用)

SELECT*FROMstudent;

--2.查询学生的姓名、年龄、班级(指定字段,推荐使用)

SELECTname,age,classFROMstudent;

--3.给字段起别名(AS可省略,便于阅读结果)

SELECTnameAS学生姓名,ageAS年龄,classAS班级FROMstudent;

SELECTname学生姓名,age年龄FROMstudent;--省略AS

--4.去重查询(DISTINCT,去除重复数据)

SELECTDISTINCTclassFROMstudent;--查询所有不重复的班级2.1.2条件查询(WHERE子句)功能:筛选符合条件的数据,支持比较运算符、逻辑运算符、模糊匹配等。sql

--1.比较运算符(=、>、<、>=、<=、!=/<>)

SELECTname,ageFROMstudentWHEREage>17;--查询年龄大于17的学生

SELECTname,classFROMstudentWHEREclass='高一(1)班';--查询1班的学生

SELECTname,ageFROMstudentWHEREage<>18;--查询年龄不等于18的学生(!=和<>等价)

--2.逻辑运算符(AND、OR、NOT)

SELECTname,age,genderFROMstudentWHEREage=18ANDgender='男';--18岁男生

SELECTname,classFROMstudentWHEREclass='高一(1)班'ORclass='高一(2)班';--1班或2班

SELECTname,ageFROMstudentWHERENOTage=18;--年龄不是18的学生

--3.模糊查询(LIKE,搭配%和_)

--%:匹配任意0个或多个字符;_:匹配任意1个字符

SELECTnameFROMstudentWHEREnameLIKE'张%';--姓名以“张”开头的学生

SELECTnameFROMstudentWHEREnameLIKE'%五';--姓名以“五”结尾的学生

SELECTnameFROMstudentWHEREnameLIKE'_四';--姓名第二个字是“四”的学生(共2个字)

--4.范围查询(BETWEEN...AND...、IN)

SELECTname,ageFROMstudentWHEREageBETWEEN17AND18;--年龄17-18岁(包含两端)

SELECTname,classFROMstudentWHEREclassIN('高一(1)班','高一(3)班');--班级在指定列表中

--5.空值查询(ISNULL、ISNOTNULL)

--注意:NULL不能用=判断,必须用ISNULL

SELECTnameFROMstudentWHEREageISNULL;--查询年龄为空的学生(本例中无此数据)

SELECTnameFROMstudentWHEREageISNOTNULL;--查询年龄不为空的学生2.1.3排序查询(ORDERBY)功能:对查询结果按指定字段排序,默认升序(ASC),可指定降序(DESC)。sql

--1.单字段排序

SELECTname,ageFROMstudentORDERBYage;--按年龄升序(默认ASC)

SELECTname,ageFROMstudentORDERBYageDESC;--按年龄降序

--2.多字段排序(先按班级升序,再按年龄降序)

SELECTname,class,ageFROMstudentORDERBYclassASC,ageDESC;2.1.4限制查询(LIMIT)功能:限制查询结果的条数,常用于分页查询(MySQL专属,Oracle用ROWNUM)。sql

--1.限制查询前2条数据

SELECTname,ageFROMstudentLIMIT2;

--2.分页查询(LIMIT起始索引,条数;起始索引从0开始)

SELECTname,ageFROMstudentLIMIT0,2;--第1页,每页2条(索引0-1)

SELECTname,ageFROMstudentLIMIT2,2;--第2页,每页2条(索引2-3)2.1.5分组查询(GROUPBY+HAVING)功能:按指定字段分组,对每组进行聚合计算(如计数、求和、平均值),HAVING用于筛选分组后的结果(区别于WHERE:WHERE筛选行,HAVING筛选分组)。sql

--1.按班级分组,统计每个班级的学生人数(COUNT()计数)

SELECTclass,COUNT(id)AS学生人数FROMstudentGROUPBYclass;

--2.按课程分组,计算每门课程的平均分、最高分、最低分(AVG()/MAX()/MIN())

SELECTcourse_id,AVG(score)AS平均分,MAX(score)AS最高分,MIN(score)AS最低分

FROMscore

GROUPBYcourse_id;

--3.分组后筛选(HAVING):查询学生人数大于1的班级

SELECTclass,COUNT(id)AS学生人数

FROMstudent

GROUPBYclass

HAVING学生人数>1;

--4.结合WHERE和HAVING:查询年龄>17的学生,按班级分组,筛选人数>1的班级

SELECTclass,COUNT(id)AS学生人数

FROMstudent

WHEREage>17

GROUPBYclass

HAVING学生人数>1;2.1.6多表关联查询(JOIN)功能:关联多个表(通过外键),查询跨表的数据,常用JOIN类型:INNERJOIN(内连接)、LEFTJOIN(左连接)、RIGHTJOIN(右连接)。sql

--1.内连接(INNERJOIN):只查询两个表中匹配的数据(学生+对应成绩)

SELECTAS学生姓名,c.course_nameAS课程名称,sc.scoreAS成绩

FROMstudents--给表起别名(s=student,c=course,sc=score)

INNERJOINscorescONs.id=sc.student_id--关联学生表和成绩表(学生ID匹配)

INNERJOINcoursecONsc.course_id=c.course_id;--关联成绩表和课程表(课程ID匹配)

--2.左连接(LEFTJOIN):查询左表所有数据,右表匹配不到的显示NULL(所有学生+其成绩,无成绩显示NULL)

SELECTAS学生姓名,c.course_nameAS课程名称,sc.scoreAS成绩

FROMstudents

LEFTJOINscorescONs.id=sc.student_id

LEFTJOINcoursecONsc.course_id=c.course_id;

--3.右连接(RIGHTJOIN):查询右表所有数据,左表匹配不到的显示NULL(所有课程+选该课的学生,无学生显示NULL)

SELECTAS学生姓名,c.course_nameAS课程名称,sc.scoreAS成绩

FROMstudents

RIGHTJOINscorescONs.id=sc.student_id

RIGHTJOINcoursecONsc.course_id=c.course_id;

--4.自连接(特殊JOIN):一张表自己关联自己(示例:查询和张三同班级的学生)

SELECTAS学生姓名,AS同班级同学

FROMstudents1

INNERJOINstudents2ONs1.class=s2.class--按班级关联

WHERE='张三'ANDs1.id!=s2.id;--排除自己2.2数据操作语言(DML)——INSERT/UPDATE/DELETE功能:对表中数据进行新增、修改、删除操作,操作后需提交(COMMIT)生效(MySQL默认自动提交)。2.2.1新增数据(INSERT)sql

--1.新增单条数据(指定所有字段,顺序和表结构一致)

INSERTINTOstudent(name,age,gender,class)

VALUES('赵六',17,'女','高一(2)班');

--2.新增单条数据(指定部分字段,未指定的字段取默认值)

INSERTINTOstudent(name,gender,class)

VALUES('孙七','男','高一(1)班');--age取默认值0,create_time取当前时间

--3.新增多条数据(批量新增,效率高于单条多次插入)

INSERTINTOscore(student_id,course_id,score,exam_date)

VALUES

(2,2,88,'2026-01-16'),

(2,3,95,'2026-01-17'),

(3,1,82,'2026-01-15');2.2.2修改数据(UPDATE)注意:必须加WHERE子句,否则会修改表中所有数据(极其危险!)。sql

--1.修改单条数据(修改张三的年龄为19)

UPDATEstudent

SETage=19

WHEREname='张三';

--2.修改多条数据(修改高一(2)班所有学生的年龄为18)

UPDATEstudent

SETage=18

WHEREclass='高一(2)班';

--3.修改多个字段(修改李四的年龄和班级)

UPDATEstudent

SETage=18,class='高一(1)班'

WHEREname='李四';2.2.3删除数据(DELETE)注意:1.必须加WHERE子句,否则删除表中所有数据;2.有外键关联的表,需先删除关联表的数据(或配置外键级联删除)。sql

--1.删除单条数据(删除姓名为孙七的学生)

DELETEFROMstudent

WHEREname='孙七';

--2.删除多条数据(删除高一(2)班的所有学生)

DELETEFROMstudent

WHEREclass='高一(2)班';

--3.删除关联数据(删除张三的所有成绩,再删除张三)

--因score表和student表有级联删除,直接删除student会自动删除关联的score数据

DELETEFROMstudent

WHEREname='张三';

--4.清空表数据(TRUNCATE,区别于DELETE)

--TRUNCATE:删除所有数据,重置自增主键,不可回滚;DELETE:可回滚,不重置自增

TRUNCATETABLEscore;--清空成绩表所有数据,score_id重新从1开始2.3数据定义语言(DDL)——CREATE/ALTER/DROP功能:定义数据库对象(表、索引、视图等),操作后立即生效,无需提交。2.3.1创建表(CREATETABLE)详见“一、基础表结构”,此处补充常见字段类型和约束。sql

--常见字段类型:VARCHAR(长度)(字符串)、INT(整数)、DATETIME(日期时间)、DATE(日期)、CHAR(长度)(固定长度字符串)

--常见约束:PRIMARYKEY(主键)、NOTNULL(非空)、UNIQUE(唯一)、CHECK(检查)、FOREIGNKEY(外键)

CREATETABLEteacher(

tea_idINTPRIMARYKEYAUTO_INCREMENT,--主键自增

tea_nameVARCHAR(50)NOTNULL,--非空

subjectVARCHAR(30)NOTNULL,--授课科目

phoneVARCHAR(11)UNIQUE,--手机号唯一(可空,但不能重复)

hire_dateDATE--入职日期(可空)

);2.3.2修改表(ALTERTABLE)功能:修改表结构(新增字段、修改字段、删除字段、修改约束等)。sql

--1.新增字段(给student表新增“phone”字段)

ALTERTABLEstudent

ADDCOLUMNphoneVARCHAR(11)UNIQUE;

--2.修改字段(修改phone字段的长度为13,可加COMMENT注释)

ALTERTABLEstudent

MODIFYCOLUMNphoneVARCHAR(13)COMMENT'学生手机号';

--3.删除字段(删除student表的phone字段)

ALTERTABLEstudent

DROPCOLUMNphone;

--4.修改表名(将teacher表改名为teacher_info)

ALTERTABLEteacher

RENAMETOteacher_info;

--5.添加主键(给teacher_info表的tea_id添加主键,若未添加)

ALTERTABLEteacher_info

ADDPRIMARYKEY(tea_id);

--6.添加外键(给score表添加外键,关联student表)

ALTERTABLEscore

ADDFOREIGNKEY(student_id)REFERENCESstudent(id)ONDELETECASCADEONUPDATECASCADE;2.3.3删除表(DROPTABLE)注意:有外键关联的表,需先删除关联表(或删除外键约束),否则无法删除。sql

--1.删除表(删除teacher_info表,无关联时)

DROPTABLEteacher_info;

--2.强制删除(若有关联,先删除外键约束,再删除表)

--先删除score表的外键约束(假设外键名是score_ibfk_1,可通过SHOWCREATETABLEscore查看)

ALTERTABLEscoreDROPFOREIGNKEYscore_ibfk_1;

--再删除student表

DROPTABLEstudent;2.4高级语法(常用进阶)2.4.1子查询(嵌套查询)功能:将一个查询结果作为另一个查询的条件或数据源,分为相关子查询和非相关子查询。sql

--1.非相关子查询(子查询可独立运行):查询数学成绩大于80分的学生姓名

--第一步:查询数学课程的course_id;第二步:查询该课程成绩>80的student_id;第三步:查询学生姓名

SELECTnameFROMstudent

WHEREidIN(

SELECTstudent_idFROMscore

WHEREscore>80ANDcourse_id=(

SELECTcourse_idFROMcourseWHEREcourse_name='数学'

)

);

--2.相关子查询(子查询依赖主查询):查询每门课程的最高分对应的学生姓名

SELECTc.course_name,,sc.score

FROMcoursec,students,scoresc

WHEREc.course_id=sc.course_id

ANDs.id=sc.student_id

ANDsc.score=(

SELECTMAX(score)FROMscoreWHEREcourse_id=c.course_id--子查询依赖主查询的course_id

);2.4.2视图(VIEW)功能:将查询结果保存为“虚拟表”,不存储实际数据,只存储查询语句,便于重复使用复杂查询。sql

--1.创建视图(创建“学生成绩视图”,包含学生姓名、课程名称、成绩)

CREATEVIEWstudent_score_viewAS

SELECTAS学生姓名,c.course_nameAS课程名称,sc.scoreAS成绩

FROMstudents

INNERJOINscorescONs.id=sc.student_id

INNERJOINcoursecONsc.course_id=c.course_id;

--2.查询视图(和查询普通表一样)

SELECT*FROMstudent_score_viewWHERE成绩>85;

--3.修改视图(修改视图的查询语句)

ALTERVIEWstudent_score_viewAS

SELECTAS学生姓名,c.course_nameAS课程名称,sc.scoreAS成绩,sc.exam_dateAS考试日期

FROMstudents

INNERJOINscorescONs.id=sc.student_id

INNERJOINcoursecONsc.course_id=c.course_id;

--4.删除视图

DROPVIEWstudent_score_view;2.4.3索引(INDEX)功能:提高查询效率(类似书籍目录),避免全表扫描,常用于查询频繁的字段。sql

--1.创建普通索引(给student表的name字段创建索引)

CREATEINDEXidx_student_nameONstudent(name);

--2.创建唯一索引(给student表的phone字段创建唯一索引,避免重复)

CREATEUNIQUEINDEXidx_student_phoneONstudent(phone);

--3.创建联合索引(给score表的student_id和course_id创建联合索引,优化多字段查询)

CREATEINDEXidx_score_stu_courseONscore(student_id,course_id);

--4.查看索引(查看student表的所有索引)

SHOWINDEXFROMstudent;

--5.删除索引

DROPINDEXidx_student_nameONstudent;2.4.4事务(TRANSACTION)功能:保证一组SQL操作的原子性(要么全部执行,要么全部不执行),用于避免数据不一致(如转账、订单支付)。sql

--事务的四大特性:原子性、一致性、隔离性、持久性(ACID)

--示例:转账操作(张三给李四转100元,需修改两个人的余额,要么都成功,要么都失败)

--1.开启事务(关闭自动提交)

STARTTRANSACTION;

--2.执行SQL操作(假设student表有balance字段)

UPDATEstudentSETbalance=balance-100WHEREname='张三';

UPDATEstudentSETbalance=balance+100WHEREname='李四';

--3.提交事务(所有操作生效)

COMMIT;

--4.回滚事务(若出现错误,撤销所有操作,回到事务开启前的状态)

--ROLLBACK;--出现异常时执行,比如张三余额不足时

--补充:设置事务隔离级别(避免脏读、不可重复读、幻读)

SETSESSIONTRANSACTIONISOLATIONLEVELREADCOMMITTED;--常用隔离级别2.5常用函数功能:简化数据处理,常用函数分为:聚合函数、字符串函数、日期函数、数学函数。sql

--1.聚合函数(常用于GROUPBY)

COUNT(id)--计数(统计非NULL值)

AVG(score)--平均值

MAX(score)--最大值

MIN(score)--最小值

温馨提示

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

评论

0/150

提交评论