还剩48页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
初级技能培训SQL欢迎参加初级技能培训课程!本次培训专为数据库初学者打造,将全面SQL介绍数据库查询语言的基础知识通过系统学习语法、查询技巧与实际SQL应用,您将能够熟练掌握数据库操作的核心技能课程概述培训目标掌握基础知识与应用技能,能够独立解决数据查询和管理问题SQL培训对象数据库初学者、从业人员、对数据分析有兴趣的各行业人士IT课程内容语法基础、数据操作技巧、查询优化方法、实际应用案例分析SQL学习成果培训日程安排第一部分SQL基础概念介绍基本原理、数据库环境搭建与核心术语(节)SQL1-10第二部分数据查询语句详解语句、条件筛选、多表连接与复杂查询(节)SELECT11-25第三部分数据操作语句掌握、、等数据操作方法(INSERT UPDATEDELETE26-35节)第四部分高级特性与应用学习索引、视图、存储过程等进阶功能(节)36-49第五部分总结与展望回顾核心知识点,规划后续学习路径(节)50什么是?SQL定义与起源主要特点全称为结构化查询语言最显著的特点是高度非过程化,用户只需告诉系统做什么SQL StructuredQuery SQL,是专门用于管理关系型数据库的标准编程语言,而不必指定怎么做这种声明式的特性使其易于学习和使Language它最早于1974年由IBM研究员Donald D.Chamberlin和用提出,初期称为Raymond F.Boyce SEQUEL语言简洁明了,语法结构统一,具有强大的表达能力无SQL经过多年发展,SQL已成为国际标准化组织ISO和美国国家标论是数据库管理员、开发人员还是普通用户,都能快速上手并有准协会ANSI认可的标准语言,被广泛应用于各类数据库系统效利用中的特点SQL高度非过程化SQL是一种描述性语言,用户只需指定要做什么,而不必指定怎么做数据库系统会自行决定如何高效执行这些操作,大大简化了用户的工作两种使用方式SQL既可作为自含式语言直接使用,适合数据库管理员和普通用户;也可作为嵌入式语言嵌入到高级编程语言中,适合程序开发人员进行应用程序开发语法结构统一SQL语言具有统一的语法结构和命令体系,遵循简单明了的设计理念,使用英文单词和句子结构,易于理解和记忆,降低了学习门槛功能完善SQL提供了全面的数据库操作功能,包括数据定义、查询、操作和控制等各个方面,能够满足数据库管理和应用的各种需求的主要功能SQL数据查询功能使用SELECT语句从数据库中检索数据数据定义功能使用CREATE、DROP、ALTER语句定义数据库对象数据操作功能使用INSERT、UPDATE、DELETE语句操作数据数据控制功能使用GRANT、REVOKE语句控制数据访问权限SQL作为一种专门的数据库语言,提供了全面的数据管理功能通过SELECT语句,用户可以灵活地查询和检索数据库中的信息CREATE、DROP和ALTER语句允许用户创建、删除和修改数据库对象的结构在日常数据维护中,INSERT、UPDATE和DELETE语句使用频率很高,分别用于添加、修改和删除数据记录而GRANT和REVOKE语句则负责数据库的安全控制,保证数据访问的合法性和安全性关系数据库的三级模式外模式用户视图层,包含多个用户视图模式基本表层,数据库的逻辑结构内模式存储文件层,数据的物理存储结构关系数据库系统采用三级模式架构,有效分离了用户应用与物理存储,提高了数据独立性外模式是用户看到的数据视图,为不同用户提供个性化的数据访问界面,隐藏了不需要的数据细节模式是数据库的中间层,定义了数据库的逻辑结构,包含各种基本表及其关系内模式则描述数据在物理存储设备上的组织方式,处理索引、存取路径等底层细节语言支持对这三级模式的完整操作,使用户能够在不同层次上操作数据库SQL基本概念解析基本表存储文件视图基本表是独立存在的存储文件是基本表在视图是从一个或多个实体,对应关系数据物理存储上的实现形基本表导出的虚拟库中的一个关系每式,包含实际数据和表,不实际存储数个基本表有唯一的名各种索引结构这一据,而是存储查询定称,由行和列组成,层对用户是透明的,义视图可简化查询是数据库中最基本的由数据库管理系统自操作,提高安全性,存储单位动维护实现数据独立索引索引是提高查询效率的数据结构,类似于书的目录通过建立索引,可以快速定位和访问表中的数据,大幅提升查询性能数据库环境准备创建测试环境安装环境与工具创建测试数据库和用户账号,设置适当的权限导选择数据库系统安装所选数据库系统及相应的客户端工具例如入示例数据或创建测试表,为后续学习和实践做好根据需求选择合适的数据库系统,常用的有MySQL可安装MySQL Server和MySQL准备确保数据库服务正常运行,并能通过客户端MySQL、SQL Server和Oracle初学者推荐使Workbench,SQL Server可安装SSMSSQL工具成功连接用MySQL,它开源免费,安装简单,有丰富的学Server ManagementStudio习资源这些工具提供图形界面,便于执行SQL语句、查看各系统特点MySQL轻量级适合Web应用,SQL结果和管理数据库对象Server集成Windows环境,Oracle企业级高性能示例数据库介绍表名主要字段描述部门表DEPT部门编号、名称、主管存储部门基本信息学生表S学号、姓名、性别、年存储学生基本信息龄、所属部门课程表COURSE课程号、课程名、先修课存储课程基本信息程、学分成绩表SC学号、课程号、成绩存储学生选课成绩教师表PROF教师编号、姓名、年龄、存储教师基本信息部门、工资教学表Teach教师编号、课程号存储教师授课关系本课程将使用上述关系表作为示例数据库,这些表涵盖了常见的教育管理场景,具有丰富的数据关系通过这些表,我们可以练习各种查询和操作,从简单的单表查询到复杂SQL的多表联合查询数据查询基础确定查询需求明确需要获取的数据内容和条件编写SELECT语句构造符合语法的查询语句应用过滤条件使用WHERE子句筛选数据结果排序用ORDER BY调整输出顺序数据查询是SQL中最基本也是最常用的功能,通过SELECT语句实现一个完整的查询过程通常包括确定查询目标、编写查询语句、应用筛选条件和对结果进行排序等步骤在实际应用中,查询语句的复杂度可能各不相同,从简单的单表全字段查询到复杂的多表连接查询,但基本框架都是一致的掌握了基础查询技能,就能应对大多数数据检索需求语句基本语法SELECTSELECT[列名1,列名2,...]指定要查询的列FROM[表名]指定数据来源的表WHERE[条件表达式]设置数据筛选条件ORDER BY[列名][ASC|DESC]对结果集进行排序SELECT语句是SQL查询的核心,其基本结构由几个关键部分组成首先是SELECT关键字后面跟随要检索的列名,可以是一个或多个列,也可以用星号*表示所有列FROM子句指定数据来源的表名WHERE子句用于设置筛选条件,只返回满足条件的行ORDER BY子句则控制结果的排序方式,可以按一个或多个列进行升序ASC或降序DESC排列需要注意的是,SQL关键字不区分大小写,但为了提高代码可读性,通常建议使用大写表示查询列的选择选择特定列选择所有列使用列名列名表名指定SELECT1,2FROM使用表名查询表中所有列SELECT*FROM需要的列计算列列设置别名在中使用表达式创建计算结果列使用关键字为列指定更友好的名称SELECT AS在语句中,我们可以灵活选择需要查询的列使用星号可以快速查询所有列,但在大型表中可能影响性能,也会返回不必要的数据明SELECT*确指定所需列名是更好的实践,可以提高查询效率并减少网络传输列别名通过关键字实现,使结果集的列名更直观易懂例如,姓名学生姓名学生表计算列则允许我们在查询中进行计算,AS SELECTAS FROM如单价数量总价订单表这些技巧使查询结果更符合实际需求SELECT*AS FROM子句条件表达式WHERE比较运算符逻辑运算符特殊运算符•等于=•与AND•BETWEEN...AND在指定范围内•不等于或!=•或OR•IN在列表中的值•大于•非NOT•LIKE模糊匹配•大于等于=用于连接多个条件表达式•IS NULL空值判断•小于•小于等于=WHERE子句是SQL查询中进行数据筛选的关键部分,通过各种条件表达式限定返回的数据行在实际应用中,常见的条件表达式示例如WHERE成绩=60(查询及格的成绩),WHERE课程号=C001(查询特定课程),或组合条件WHERE成绩=60AND课程号=C001(查询特定课程的及格成绩)模糊查询LIKE百分号%通配符下划线_通配符百分号代表任意数量(包括零个)的任意字符例如,张可下划线表示单个任意字符例如,明匹配两个字符且第二个%_以匹配任何以张开头的字符串,如张
三、张明明、张字是明的名字,如李明、王明,但不匹配张明明等百分号也可以出现在模式的中间或开头,如明(包含明多个下划线可以组合使用,如明匹配三个字符且最后一个%%__字的任何名字)、明(以明结尾的名字)字是明的名字下划线也可以与百分号结合使用,如明%_%模糊查询是中非常实用的功能,通过运算符和通配符实现在处理文本数据时特别有用,比如查找包含特定文字的记录、按SQL LIKE名称前缀或后缀筛选等使用模糊查询时需注意性能问题,因为大量的通配符匹配可能导致全表扫描空值处理NULL的概念NULL表示未知或无效的值,而不是空字符串或零在数据库中,NULL是一个特殊的标记,表示该字段没有值或值未知这与空字符串、零0或空格完全不同理解NULL的概念对于正确处理数据库中的缺失值至关重要NULL的检测由于NULL的特殊性质,不能使用普通的比较运算符(如=或)来检测NULL值必须使用专门的IS NULL或IS NOT NULL运算符例如,WHERE电话IS NULL可以查找没有填写电话号码的记录错误的写法是WHERE电话=NULL,这将不会返回任何结果NULL的运算NULL参与的算术运算和比较运算结果通常为NULL例如,任何值加上NULL结果都是NULL;NULL与其他值比较的结果是UNKNOWN(未知),而不是TRUE或FALSE处理可能含有NULL的列时,可以使用IFNULL或COALESCE等函数进行替换处理查询结果排序升序排列降序排列使用ORDER BY列名ASC对结果进行升序排序,ASC为默认值,可以省使用ORDER BY列名DESC对结果进行降序排序例如,ORDER BY略例如,ORDER BY成绩ASC将按成绩从低到高排序成绩DESC将按成绩从高到低排序,常用于查询前几名或最高值的场景多列排序按位置排序通过指定多个列名,可以实现多级排序例如,ORDER BY部门ASC,除了使用列名,还可以使用列的位置编号排序例如,ORDER BY2表工资DESC先按部门升序排列,同一部门内再按工资降序排列示按结果集中的第二列排序这种方式不够直观,一般不推荐使用ORDER BY子句在SQL查询中起着至关重要的作用,它允许我们按照特定的顺序展示查询结果,使数据更有条理、更易于理解和分析ORDER BY子句总是放在查询语句的最后部分,在执行完WHERE、GROUP BY等操作后才进行排序查询练习1基础查询示例查询结果分析第一个查询展示了基本的列选择功能,只返回学生表中的三个特定列,减少了不必要--查询所有学生的学号、姓名和年龄的数据传输SELECT学号,姓名,年龄FROM S;第二个查询使用了WHERE子句进行条件筛选,只返回计算机系的学生记录,展示了基本的数据过滤功能--查询计算机系的所有学生信息第三个查询结合了ORDER BY子句,对查询结果按成绩降序排列,便于查看高分学生SELECT*情况FROM SWHERE所属部门=计算机系;第四个查询展示了LIKE操作符和通配符的使用,实现了按姓氏的模糊查询功能--按成绩降序查询学生的学号和对应分数SELECT学号,成绩FROM SCORDER BY成绩DESC;--查询姓李的学生信息SELECT*FROM SWHERE姓名LIKE李%;聚合函数COUNT SUMAVG MAX计算行数或非NULL值的个数计算指定列的所有值之和只能用计算指定列的平均值只能用于数返回指定列的最大值可用于数值、计算所有行数,于数值类型的列例如,值类型的列,且会忽略值日期或字符类型例如,COUNT*SELECT NULLSELECT列名计算该列非成绩成绩表计算所例如,工资成绩成绩表查找最COUNTNULL SUMFROM SELECT AVGMAXFROM值的个数例如,SELECT有成绩的总和FROM教师表计算平均工资高分数学生表计算学COUNT*FROM生总人数MIN返回指定列的最小值可用于数值、日期或字符类型例如,SELECT年龄学生表查找最MINFROM小年龄分组查询GROUP BY分组查询基础分组查询注意事项子句用于将查询结果按一个或多个列的值分组,通常与聚在使用时,子句中的列要么出现在子GROUP BYGROUP BYSELECT GROUP BY合函数结合使用,对各组数据进行统计分析分组查询是数据分析中非句中,要么被聚合函数包围,否则会导致语法错误这是因为对于分组常重要的功能,能够揭示数据的内在模式和趋势后的数据,只有分组列和聚合计算结果才有唯一确定的值子句可以包含多个列,表示按这些列的组合进行分组例GROUP BY--基本语法如,部门职称将数据按部门和职称的组合分组,能够更GROUP BY,SELECT列名1,聚合函数列名2细致地分析数据FROM表名GROUP BY列名1;默认情况下,GROUP BY不对分组结果排序如需排序,应使用子句ORDER BY--示例计算各部门的平均工资SELECT部门,AVG工资AS平均工资FROM教师表GROUP BY部门;子句HAVING数据源原始表数据,包含多行记录WHERE过滤在分组前对原始数据行进行筛选GROUP BY分组按指定列对数据进行分组HAVING过滤对分组后的结果进行筛选HAVING子句用于对GROUP BY分组后的结果进行筛选,类似于WHERE子句对原始数据的筛选HAVING子句的主要特点是它可以使用聚合函数作为筛选条件,而WHERE子句不能例如,要筛选平均分在80分以上的课程,可以使用SELECT课程号,AVG成绩AS平均分FROM成绩表GROUP BY课程号HAVING AVG成绩80HAVING与WHERE的区别在于执行时机不同,WHERE在分组前筛选行,而HAVING在分组后筛选组子查询基础子查询定义子查询类型子查询是嵌套在另一个查询中的SELECT语•单行子查询返回单个值,常用于比较句,也称为内部查询或嵌套查询外部查询操作称为主查询子查询可以返回单个值、一个•多行子查询返回多个值,常用于IN操列的多个值或多行多列的结果集,为主查询作提供数据来源或筛选条件•相关子查询引用外部查询的列,每行执行一次子查询位置•WHERE子句作为筛选条件•FROM子句作为派生表•SELECT列表作为计算列•HAVING子句对分组结果筛选子查询是SQL中非常强大的功能,能够实现复杂的数据查询和分析例如,要查询比平均分高的学生,可以使用SELECT学号,成绩FROM成绩表WHERE成绩SELECTAVG成绩FROM成绩表这里的内部查询计算平均分,外部查询使用这个结果进行筛选多表查询基础笛卡尔积连接条件1不加条件的多表连接,产生所有可能的行组通过子句限定有效的表间关系WHERE合4结果集多表连接组合多表中满足条件的相关数据根据连接条件关联多个表的数据多表查询是中非常重要的功能,允许从多个相关表中获取和组合数据当不指定连接条件时,查询会生成笛卡尔积,即第一个表中的每一行与SQL第二个表中的每一行组合,这通常会产生大量无意义的数据为了获得有意义的结果,必须使用连接条件限定表之间的关系例如,查询学生及其所属部门信息学号姓名部门名称SELECT S.,S.,D.FROM学生表部门表所属部门部门编号这里的连接条件确保了学生与正确的部门信息关联S,D WHERES.=D.连接查询类型内连接外连接内连接INNER JOIN只返回两表中匹配的行,不匹配的行被排除在结果集之外这是最常用外连接包括左外连接LEFT JOIN、右外连接RIGHT JOIN和全外连接FULL JOIN左的连接类型,适合查询两表之间有确定关联的数据外连接返回左表所有行,右表不匹配则为NULL;右外连接相反;全外连接返回两表所有行SELECT S.姓名,C.课程名FROM学生表S INNER JOIN成绩表SC--左外连接示例ON S.学号=SC.学号SELECT S.姓名,SC.成绩INNER JOIN课程表C FROM学生表S LEFTJOIN成绩表SCON SC.课程号=C.课程号;ON S.学号=SC.学号;查询练习2查询每门课程的平均分SELECT课程号,AVG成绩AS平均分FROM成绩表GROUP BY课程号ORDER BY平均分DESC;查询选修课程数超过3门的学生信息SELECT S.学号,S.姓名,COUNTSC.课程号AS选课数FROM学生表S INNERJOIN成绩表SCON S.学号=SC.学号GROUP BYS.学号,S.姓名HAVING COUNTSC.课程号3;查询没有学生选修的课程信息SELECT C.*FROM课程表C LEFTJOIN成绩表SCON C.课程号=SC.课程号WHERE SC.学号IS NULL;查询学生及其选修课程的详细信息SELECT S.姓名,C.课程名,SC.成绩FROM学生表S INNERJOIN成绩表SCON S.学号=SC.学号INNERJOIN课程表CON SC.课程号=C.课程号ORDER BYS.姓名,C.课程名;数据操作语言DMLINSERT UPDATE向表中添加新的数据行修改表中已有数据的值事务处理DELETE保证操作的完整性和一致性从表中删除数据行数据操作语言是用于操作数据库中数据的命令集合通过,我们可以实现数据的添加、修改和删除,这些操作是数DML SQLDML据库日常维护和应用程序数据处理的基础操作通常是事务性的,这意味着可以在提交前回滚变更这一特性对于保证数据完整性非常重要,特别是在执行批量操作或复杂DML业务逻辑时通过开始事务,然后执行操作,最后通过提交或回滚事务BEGIN TRANSACTIONDML COMMITROLLBACK插入数据INSERT基本语法INSERT INTO表名VALUES值1,值2,...;这种形式需要提供表中所有列的值,且顺序必须与表定义的列顺序一致适用于表结构简单或插入完整记录的情况指定列插入INSERT INTO表名列1,列2,...VALUES值1,值2,...;这种形式可以只提供部分列的值,未指定的列将使用默认值或NULL列名和值的顺序必须对应更灵活且推荐使用多行插入INSERT INTO表名VALUES行1值1,行1值2,...,行2值1,行2值2,...,...;这种形式可以一次插入多行数据,提高批量插入的效率各行的值数量和类型必须一致查询结果插入INSERT INTO表名列1,列2,...SELECT列A,列B,...FROM源表WHERE条件;这种形式可以将查询结果直接插入到目标表中,非常适合数据迁移或复制查询结果的列数和类型必须与目标列匹配修改数据UPDATE基本语法UPDATE表名SET列名=值WHERE条件;UPDATE语句用于修改表中已有数据的值通过SET子句指定要修改的列和新值,WHERE子句限定要修改的行如果省略WHERE子句,将更新表中所有行,这通常不是我们想要的结果多列更新UPDATE学生表SET姓名=张明,年龄=20WHERE学号=S001;可以在一个UPDATE语句中同时修改多个列的值,各列之间用逗号分隔这比多次执行单列更新更高效,也能保证数据的一致性使用表达式UPDATE成绩表SET成绩=成绩+5WHERE课程号=C001;SET子句中可以使用表达式,基于当前值计算新值这对于批量调整数值型数据非常有用,如加减百分比、四舍五入等操作删除数据DELETE基本语法与使用DELETE与TRUNCATE的区别是操作,可以在事务中回滚,而是操DELETE DMLTRUNCATE DDL--删除满足条件的行作,执行后立即生效,不能回滚删除数据时会记录日志,DELETEDELETE FROM表名而几乎不记录日志,所以通常比TRUNCATE TRUNCATEDELETEWHERE条件;快很多--删除表中所有数据DELETE可以使用WHERE子句有条件地删除部分数据,而DELETE FROM表名;TRUNCATE只能删除表中的所有数据另外,TRUNCATE会重置表的自增计数器,而DELETE不会删除全表数据时的选择如果需要保留删除操作的可回滚能力,或需语句用于从表中删除数据行通过子句指定要删除DELETE WHERE要触发器执行,应使用;如果追求高性能且不需要回滚,可DELETE的行,如果省略子句,将删除表中所有数据行,但表结构保WHERE使用TRUNCATE持不变执行操作时应格外小心,特别是在生产环境中建议先使用DELETE语句测试条件,确认要删除的是正确的行,然后再SELECT WHERE执行操作DELETE数据操作练习向学生表中插入新学生记录--插入完整学生记录INSERT INTO学生表学号,姓名,性别,年龄,所属部门VALUES S010,王芳,女,19,计算机系;--插入部分列,其余使用默认值INSERT INTO学生表学号,姓名,所属部门VALUES S011,李明,物理系;修改指定课程的学分--将C002课程的学分增加1UPDATE课程表SET学分=学分+1WHERE课程号=C002;--将所有计算机相关课程的学分统一设为4UPDATE课程表SET学分=4WHERE课程名LIKE%计算机%;删除未选修任何课程的学生记录--使用子查询找出没有选课记录的学生DELETE FROM学生表WHERE学号NOT INSELECT DISTINCT学号FROM成绩表;将某门课程的所有成绩提高5分--将C001课程的所有成绩提高5分,但不超过100分UPDATE成绩表SET成绩=CASEWHEN成绩+5100THEN100ELSE成绩+5ENDWHERE课程号=C001;数据定义语言DDLALTER DROP修改已有数据库对象的结构删除数据库对象CREATETRUNCATE创建数据库对象,如数据库、表、视图等清空表数据但保留表结构数据定义语言DDL是用于定义和管理数据库对象的SQL命令集合通过DDL,我们可以创建、修改和删除数据库中的各种对象,如数据库本身、表、视图、索引等与DML不同,DDL操作通常是立即提交的,不能回滚这意味着执行DDL后,更改立即生效,且不能通过事务机制撤销因此,在执行DDL操作前,尤其是在生产环境中,应该仔细计划并确认操作的正确性数据类型SQL类型分类数据类型描述示例字符型CHARn固定长度字符串ABC字符型VARCHARn可变长度字符串张三数值型INT整数10,-5数值型NUMERICp,s定点数,p是总位数,
123.45s是小数位数数值型FLOAT浮点数
3.14159日期时间型DATE日期2023-01-01日期时间型TIME时间14:30:00日期时间型DATETIME日期和时间2023-01-0114:30:00其他类型BIT位值0,1其他类型TEXT长文本大段文字描述选择合适的数据类型对数据库设计至关重要,它直接影响存储空间、查询性能和数据完整性不同的数据库系统可能对数据类型有细微差异,但基本概念是相通的创建数据库CREATE DATABASE基本语法--创建基本数据库CREATE DATABASE数据库名;--示例CREATE DATABASEschool;这是创建数据库的最简单形式,使用默认设置如字符集和排序规则在生产环境中,通常需要指定更多参数以确保数据库满足特定需求指定字符集--创建指定字符集的数据库CREATE DATABASE数据库名CHARACTER SET字符集;--示例CREATE DATABASEschoolCHARACTER SETutf8mb4;字符集决定了数据库如何存储和处理文本数据选择合适的字符集对于支持多语言非常重要UTF8是通用的Unicode编码,支持大多数语言的字符utf8mb4是MySQL中的UTF8变体,支持包括emoji在内的所有Unicode字符指定排序规则--创建指定字符集和排序规则的数据库CREATE DATABASE数据库名CHARACTER SET字符集COLLATE排序规则;--示例CREATE DATABASEschoolCHARACTER SETutf8mb4COLLATE utf8mb4_unicode_ci;排序规则定义了数据库如何比较和排序字符串它影响ORDER BY、GROUP BY等操作的结果,以及字符串比较的大小写敏感性_ci结尾的排序规则表示大小写不敏感case insensitive,_cs表示大小写敏感case sensitive创建表CREATE TABLE基本语法创建学生表示例CREATE TABLE表名CREATE TABLE学生表列名1数据类型1[约束条件],学号CHAR10PRIMARY KEY,列名2数据类型2[约束条件],姓名VARCHAR20NOT NULL,...,性别CHAR2CHECK性别IN男,女,[表级约束]出生日期DATE,;所属部门VARCHAR30REFERENCES部门表部门编号,入学时间DATE DEFAULTGETDATE,备注TEXT;创建表时,需要定义表名、列名、数据类型和各种约束条件表名应当明确表示表的内容,列名应当清晰描述字段含义,数据类型应当根据数据特性选择这个示例创建了一个学生表,包含学号主键、姓名非空、性别检查约束、出生日期、所属部门外键、入学时间默认值和备注字段各种约束条件确保了数据的完整性和一致性表约束条件主键约束PRIMARY KEY外键约束FOREIGN KEY唯一标识表中的每一行,不允许重复或NULL值一个表维护表间的引用完整性,确保外键值在引用表的相应列中只能有一个主键,但可以由多个列组成复合主键例存在例如部门编号FOREIGN KEY如学号部门表部门编号CHAR10PRIMARY KEYREFERENCES唯一约束UNIQUE非空约束NOT NULL确保列中的值唯一,但允许值与主键不同适用确保列不接受值,强制要求填写数据例如姓名NULLNULL于如邮箱、手机号等需要唯一但非主键的字段例如邮VARCHAR20NOT NULL箱VARCHAR50UNIQUE默认约束DEFAULT检查约束CHECK为列指定默认值,当INSERT语句未提供该列的值时使限制列可接受的值范围,确保数据符合业务规则例如用例如入学时间年龄年龄年龄DATE DEFAULTGETDATE INTCHECK=0AND150修改表结构ALTER TABLE添加列--在表中添加新列ALTER TABLE学生表ADD电话VARCHAR20;--添加带约束的列ALTER TABLE学生表ADD电子邮件VARCHAR50UNIQUE;修改列--修改列的数据类型ALTER TABLE学生表MODIFY姓名VARCHAR30NOT NULL;--修改列名和数据类型SQL Server语法ALTER TABLE学生表ALTER COLUMN姓名VARCHAR30NOTNULL;删除列--删除表中的列ALTER TABLE学生表DROP COLUMN备注;添加约束删除表和数据库基本操作安全措施在执行删除操作前,特别是在生产环境中,应当采取以下安全措施--删除表DROP TABLE表名;•数据备份在删除前进行完整备份,以便需要时可以恢复•检查依赖关系确认是否有其他对象依赖于要删除的对象--删除数据库•使用事务如可能,在事务中执行操作,以便出错时回滚DROP DATABASE数据库名;•权限控制限制删除权限,只授予必要的用户--清空表内容但保留表结构•先测试后实施先在测试环境验证操作的影响TRUNCATE TABLE表名;某些数据库系统提供了额外的安全选项,如MySQL的外键约束检查SETFOREIGN_KEY_CHECKS=0或SQL Server的依赖关系追踪DROP操作会永久删除对象及其所有数据,这是不可逆的操作删除表会同时删除表的结构、数据、索引、触发器、约束和权限等所有相关对象删除数据库则会删除数据库中的所有表和其他对象TRUNCATE TABLE是一种特殊的删除操作,它会清空表中的所有数据,但保留表结构与DELETE FROM表名不同,TRUNCATE操作不可回滚,且通常执行更快索引INDEX索引的作用索引是数据库中提高查询效率的重要数据结构,类似于书籍的目录它可以大幅加快数据检索速度,但会占用额外的存储空间并可能降低数据修改操作的性能索引类型常见的索引类型包括普通索引提高查询速度、唯一索引确保唯一性、主键索引自动创建的特殊唯一索引、全文索引用于全文搜索和聚集索引决定物理存储顺序创建索引可以在创建表时指定索引,也可以通过CREATE INDEX语句为已有表添加索引例如CREATE INDEX idx_学生_姓名ON学生表姓名;或CREATE UNIQUEINDEXidx_学生_邮箱ON学生表电子邮件;删除索引当索引不再需要或影响性能时,可以通过DROP INDEX语句删除例如DROP INDEXidx_学生_姓名ON学生表;不同数据库系统的语法可能略有不同合理使用索引是数据库优化的关键通常应为经常用于查询条件WHERE子句、排序条件ORDER BY和连接条件JOIN的列创建索引但索引并非越多越好,因为每个索引都会占用存储空间并影响数据修改性能视图VIEW视图定义创建视图基于SQL查询结果集的虚拟表使用CREATE VIEW语句定义视图的结构视图优点使用视图3简化查询、提高安全性、数据独立像使用普通表一样查询视图视图是数据库中的一个重要对象,它提供了一种访问数据的抽象层视图本身不存储数据,而是存储查询定义,每次访问视图时都会执行底层的查询这使得视图能够始终提供最新的数据,同时隐藏底层表的复杂性创建视图的基本语法是CREATE VIEW视图名AS SELECT语句例如,可以创建一个学生成绩视图CREATE VIEW学生成绩视图AS SELECT S.学号,S.姓名,C.课程名,SC.成绩FROM学生表S JOIN成绩表SC ONS.学号=SC.学号JOIN课程表C ONSC.课程号=C.课程号;使用视图后,复杂的连接查询可以简化为SELECT*FROM学生成绩视图WHERE姓名=张三;事务管理ACID特性事务的四个关键特性原子性Atomicity事务中的所有操作要么全部完成,要么全部不做一致性Consistency事务执行前后,数据库从一个一致状态变到另一个一致状态隔离性Isolation并发执行的事务之间不会互相影响持久性Durability一旦事务提交,其结果就是永久性的事务是数据库管理系统执行过程中的一个逻辑单位,由一组相关的数据库操作组成事务管理确保在并发操作和系统故障情况下维护数据的完整性和一致性事务的基本操作包括START TRANSACTION开始事务、COMMIT提交事务和ROLLBACK回滚事务典型的事务处理流程是开始事务→执行一系列操作→如果全部成功则提交事务,如果出现错误则回滚事务例如,银行转账时,从A账户扣款和向B账户存款必须作为一个事务处理,确保要么两个操作都成功,要么都不执行存储过程存储过程定义与特点创建与调用存储过程存储过程是预先编译并存储在数据库中的一组SQL语句集合,可以像函数一样--创建存储过程SQL Server语法被调用和执行它是数据库编程的重要组成部分,提供了一种在数据库服务器CREATE PROCEDUREGetStudentCourses端执行业务逻辑的方式@学号CHAR10存储过程的主要特点包括预编译执行、支持参数传递、可包含复杂的业务逻AS辑、可以返回多个结果集或输出参数、支持事务处理和错误处理等BEGINSELECT C.课程名,SC.成绩FROM成绩表SCJOIN课程表C ONSC.课程号=C.课程号WHERE SC.学号=@学号;END;--调用存储过程CALL GetStudentCoursesS001;存储过程可以接收输入参数、执行操作并返回结果通过CALL或EXECUTE语句调用,语法根据数据库系统而异存储过程是封装数据库操作的理想方式,可以提高代码复用性和安全性触发器触发事件触发器激活执行触发器代码完成操作INSERT,UPDATE,DELETE自动执行预定义的操作实现业务规则或数据验证原始操作与触发器操作一起完成触发器类型创建触发器示例触发器根据执行时机可分为两类--创建AFTER INSERT触发器MySQL语法•BEFORE触发器在触发事件如INSERT执行前触发,可用于验证数据或修改要插CREATE TRIGGERafter_student_insert入的数据AFTER INSERTON学生表FOR EACHROW•AFTER触发器在触发事件成功执行后触发,通常用于审计日志、级联更新等操作BEGIN触发器还可以是行级触发器FOR EACHROW或语句级触发器行级触发器对影响的每--自动创建学生用户账号一行数据执行一次,语句级触发器对整个SQL语句只执行一次INSERT INTO用户账号表用户名,密码,学号VALUESNEW.学号,默认密码,NEW.学号;END;在上面的示例中,每当有新学生记录插入到学生表时,触发器会自动为该学生创建一个用户账号这种自动化机制可以确保数据的一致性和完整性常见SQL函数字符串函数•CONCATs1,s
2...连接字符串•SUBSTRINGs,start,length提取子字符串•UPPERs转换为大写•LOWERs转换为小写•LENGTH/LENs返回字符串长度•REPLACEs,old,new替换字符串数值函数•ROUNDn,d四舍五入到d位小数•CEIL/CEILINGn向上取整•FLOORn向下取整•ABSn绝对值•MODn,m取余•POWERn,m幂运算日期函数•NOW/CURRENT_TIMESTAMP当前日期时间•CURDATE/CURRENT_DATE当前日期•DATEDIFFd1,d2计算日期差•DATE_FORMATd,f格式化日期•DATEADD/DATE_ADD日期加减•EXTRACT提取日期部分条件函数•CASE WHEN...THEN...END条件表达式•IFexpr,v1,v2简化的条件表达式•IFNULL/COALESCE处理NULL值•NULLIF比较两个表达式高级查询技巧SQL窗口函数公共表表达式CTE窗口函数也称为分析函数允许在查询中进行复杂的分析计算,既可以分组又不CTE使用WITH子句创建一个命名的临时结果集,可以在查询中多次引用它使会减少结果集的行数常见的窗口函数包括复杂查询更易于理解和维护•ROW_NUMBER为结果集的每一行分配唯一的序号WITH高分学生AS•RANK为结果集的每一行分配排名,相同值获得相同排名,排名不连续SELECT学号,AVG成绩AS平均分•DENSE_RANK为结果集的每一行分配排名,相同值获得相同排名,FROM成绩表排名连续GROUPBY学号•NTILEn将结果集分成n个桶,并指示每行属于哪个桶HAVING AVG成绩85SELECTS.姓名,H.平均分SELECT学号,课程号,成绩,FROM高分学生H JOIN学生表SRANK OVERPARTITION BY课程号ORDER BY成绩DESC AS排ON H.学号=S.学号名ORDER BYH.平均分DESC;FROM成绩表;递归CTE是一种特殊形式,可以引用自身,常用于查询层次结构数据,如组织机构、文件系统等透视表查询则允许将行数据转换为列,或将列数据转换为行,实现数据的重新排列性能优化基础SQL查询语句优化索引优化策略优化查询语句可以从多方面入手避免使用SELECT*,只查询需要的查询分析工具合理使用索引是提高查询性能的关键应为WHERE子句、JOIN条件和列;减少JOIN操作和子查询嵌套层数;使用LIMIT/TOP限制结果集大EXPLAIN语句是分析SQL查询性能的基本工具,它显示查询的执行计ORDERBY中频繁使用的列创建索引但索引不是越多越好,每个索引小;优化WHERE条件顺序,将高选择性条件放在前面;避免在划,包括表的访问方式、连接方法、索引使用情况等通过EXPLAIN都会占用存储空间并可能降低写入性能WHERE子句中对列使用函数,这会阻止索引使用可以找出查询中的性能瓶颈,如全表扫描、低效索引等问题要避免在低选择性列如性别、状态等取值较少的列上创建单列索引,不同数据库系统可能使用不同的命令,如MySQL使用EXPLAIN,而应考虑将其作为复合索引的一部分定期分析和重建索引也是维护性SQL Server使用EXPLAIN PLAN或查询执行计划,Oracle使用能的重要措施EXPLAIN PLAN等注入与防护SQLSQL注入概念防护措施SQL注入是一种代码注入技术,攻击者通过在用户输入中插入SQL代码,使应防范SQL注入的主要方法包括用程序执行非预期的SQL语句这种攻击可能导致数据泄露、数据损坏或未授•参数化查询/预处理语句使用占位符代替直接拼接用户输入,数据库会权访问将参数值视为数据而非代码例如,考虑以下查询•输入验证检查用户输入的格式、长度和类型,拒绝可疑输入•转义特殊字符对单引号等特殊字符进行转义处理--原始查询•最小权限原则应用程序使用的数据库账户只应拥有必要的最小权限SELECT*FROM用户表WHERE用户名=输入值AND密码=输入•使用ORM框架许多现代框架提供了内置的SQL注入防护值;--如果输入值为admin----参数化查询示例伪代码--查询变为PreparedStatement stmt=connection.prepareStatementSELECT*FROM用户表WHERE用户名=admin--AND密码=SELECT*FROM用户表WHERE用户名=AND密码=;输入值;stmt.setString1,用户名输入;stmt.setString2,密码输入;ResultSet rs=stmt.executeQuery;在这个例子中,--是SQL注释符号,导致密码检查被注释掉,从而允许未经授权的登录数据导入导出SQL导出数据导入数据批量处理SQL提供多种方式将数据导出到外部文件,导入数据常用的方法有LOAD DATA处理大量数据时,使用事务可以提高效率并包括SELECT...INTO OUTFILE语句INFILE语句MySQL、BULK确保数据完整性将导入操作包装在事务MySQL、BCP工具SQL Server、INSERTSQL Server、IMPORT命令中,可以在出错时回滚,避免部分数据导入EXPORT命令Oracle等导出格式可以是Oracle等这些工具允许从外部文件批量造成的不一致对于特别大的数据集,可以CSV、TSV、SQL脚本等导入数据到数据库表中考虑分批导入--MySQL导出示例--MySQL导入示例SELECT*FROM学生表LOAD DATAINFILEINTO OUTFILE/tmp/students.csv/tmp/students.csvFIELDS TERMINATEDBY,INTO TABLE学生表ENCLOSED BYFIELDS TERMINATEDBY,LINES TERMINATEDBY\n;ENCLOSED BYLINES TERMINATEDBY\n;常见格式数据交换的常见格式包括CSV逗号分隔值、SQL脚本包含INSERT语句、XML结构化标记语言和JSONJavaScript对象表示法不同格式适用于不同场景,CSV适合简单表格数据,SQL脚本适合完整数据库备份,XML和JSON适合复杂结构数据不同数据库系统的差异SQL特性MySQL SQLServer OraclePostgreSQL分页查询LIMIT offset,OFFSET-FETCH ROWNUM或LIMIT countcountROW_NUMBE OFFSEToffsetR自增列AUTO_INCRE IDENTITYSEQUENCE对象SERIAL或MENT IDENTITY字符串连接CONCAT函数+运算符||运算符||运算符或CONCAT日期函数NOW,GETDATE,SYSDATE,NOW,DATE_ADD DATEADDADD_MONTH CURRENT_DAS TE条件语句IF或CASE IIF或CASE CASE或CASEDECODENULL处理IFNULL ISNULLNVL COALESCE在实际开发中,需要注意不同数据库系统间的SQL差异,特别是在跨数据库迁移时主要差异点包括语法结构、数据类型、函数名称、特性支持程度等了解这些差异有助于编写兼容性更好的SQL代码在实际项目中的应用SQL企业资源规划ERP系统客户关系管理CRM系电子商务平台数据仓库与商业智能统电商平台依赖管理产品目是数据仓库和商业智能分SQL SQLSQL在ERP系统中发挥着核心CRM系统使用SQL存储和分析录、库存状态、用户账户、订析的基础语言,用于构建ETL作用,处理采购、库存、生客户信息、互动记录、销售机单处理和支付信息等关键数流程、创建多维分析模型、生产、销售、财务等各个模块的会、合同状态等数据通过高据高并发环境下的查询优化成报表和仪表盘通过复杂的数据管理通过复杂的数据库效的数据查询和统计分析,帮和事务处理对保证平台性能和SQL查询,从海量数据中提取设计和查询优化,确保系统能助企业了解客户需求,提高销数据一致性至关重要有价值的业务洞察够高效处理企业运营中的各类售转化率和客户满意度事务总结与展望高级数据库设计与优化掌握复杂系统的数据建模与性能调优数据分析与商业智能运用SQL进行高级数据分析和决策支持数据库编程与高级特性存储过程、触发器与事务管理应用多表查询与数据操作4实现复杂查询和高效数据维护SQL基础语法与概念5掌握核心语法和数据库基本原理通过本次培训,我们系统地学习了SQL的基础概念、查询语法、数据操作技巧和高级特性从简单的SELECT语句到复杂的多表连接查询,从基本的数据操作到事务管理和性能优化,我们已经建立了全面的SQL技能框架SQL学习是一个持续的过程,建议通过以下方式继续提升参与实际项目积累经验;学习高级SQL技术如存储过程、触发器开发;深入理解数据库原理和查询优化;探索数据分析和商业智能领域推荐资源包括SQL在线教程网站、数据库官方文档、专业书籍《SQL必知必会》和技术社区如Stack Overflow等。
个人认证
优秀文档
获得点赞 0