还剩48页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
数据库查询教程欢迎来到《数据库查询教程》,这是一门为初学者和中级用户设计的全面性课程在接下来的课程中,我们将深入探讨数据库查询的基础知识、进阶技术以及实际应用场景本课程将从基本概念开始,逐步引导您掌握各种查询技术,包括单表查询、多表连接、子查询和高级查询优化等内容通过大量实例和实践练习,帮助您建立扎实的数据库查询技能什么是数据库?数据库定义数据库分类数据库是按照数据结构来组织、存按照数据模型可分为关系型数据储和管理数据的仓库它提供了数库、、非关系型数MySQL Oracle据的插入、查询、更新和删除等基据库、、层次型MongoDB Redis本操作,确保数据的一致性、安全数据库、网状数据库等每种类型性和可靠性数据库系统是人们存都有其特定的应用场景和优势储和管理信息的核心工具应用场景数据库广泛应用于企业信息系统、电子商务、金融服务、医疗记录管理、教育系统、科研数据处理等领域它是现代信息系统的基础设施,支撑着几乎所有的数字化业务关系型数据库简介MySQL OracleSQL Server开源的关系型数据库管理系统,以其商业数据库管理系统的代表,拥有强微软开发的关系型数据库产品,与可靠性、易用性和性能而闻名适用大的企业级功能在大型企业、金融平台深度集成提供全面的Windows于各种规模的应用,从小型网站到大机构和政府部门广泛应用提供高可商业智能和分析工具在企业级应用型企业级应用具有跨平台、多存储用性、安全性和可扩展性解决方案中占有重要地位,特别是在微软技术引擎支持等优势栈的环境中•强大的事务处理能力•开源免费,社区活跃•与微软生态系统完美集成完善的安全机制••轻量级,易于安装部署•强大的BI工具支持•适合大型企业应用•适合Web应用开发•企业级性能和可靠性数据库表的基本结构表()行()Table Row表是数据库中存储数据的基本结构,由行和列组成每个表通常对应行也称为记录,代表一个具体的数据实体例如,学生表中的一行表现实世界中的一个实体类型,如学生表、商品表等在关系型数据库示一个具体的学生,包含该学生的所有属性信息每行数据必须遵循中,数据以表的形式进行组织和管理表结构定义的格式列()主键与外键Column列也称为字段,代表实体的一个属性每一列都有特定的数据类型和主键是唯一标识表中每一行的字段,不能重复且不能为空外键是一约束条件,如学生表中可能包含姓名、年龄、性别等列列的定义决个表中引用另一个表主键的字段,用于建立表间关系,确保数据的引定了可以存储的数据类型和范围用完整性语言简介SQL定义SQL语言特点结构化查询语言(Structured Query声明式语言,告诉数据库做什么而非如),是一种专门用于管理关系Language何做,简洁且功能强大型数据库的标准计算机语言通用性主要功能各种关系型数据库系统都支持标准数据查询、数据操作、数据定义和数据,是数据库管理的通用语言控制等全面的数据库管理功能SQL语言于年由开发,后来成为和的标准它的出现彻底改变了数据管理方式,使非专业人员也能进行复杂的数据SQL1974IBM ANSIISO操作尽管各数据库厂商对有自己的扩展,但基本语法和功能保持一致,使其成为数据库专业人员必备的技能SQL语句分类SQL数据查询语言DQL-主要包含SELECT语句,用于从数据库检索数据数据操作语言DML-包括INSERT、UPDATE、DELETE,用于修改数据数据定义语言DDL-包括CREATE、ALTER、DROP,用于定义数据结构数据控制语言DCL-包括GRANT、REVOKE,用于权限管理SQL语句根据功能可分为四大类,每类语句有其特定的用途和语法结构数据查询语言(DQL)是本课程的重点,它允许我们从数据库中提取所需的信息数据操作语言(DML)用于修改数据内容,而不改变数据结构查询语言基础结构子句SELECT指定要查询的列(字段),可以是表中的实际列名,也可以是计算表达式或常量可以使用通配符*选择所有列•SELECT column1,column
2...•SELECT*选择所有列子句FROM指定数据来源,通常是一个或多个表名多表查询时需要在此处列出所有相关表•FROM table_name•FROM table1,table
2...子句WHERE设置查询条件,过滤返回的行条件表达式可以使用各种比较运算符和逻辑运算符组合•WHERE condition•WHERE column_name=valueSELECT、FROM和WHERE构成了SQL查询的基本骨架,这三个子句共同决定了查询的结果SQL语句的执行顺序与书写顺序不同首先执行FROM确定数据源,然后执行WHERE过滤数据,最后执行SELECT选择列语句详解SELECT语法形式示例说明选择特定列SELECT name,age FROM只返回指定的name和age列students;选择所有列SELECT*FROM students;返回表中的所有列使用表达式SELECT name,计算表达式并返回结果,可price*quantity AStotal FROM使用AS指定别名orders;使用函数SELECT UPPERname对列应用SQL函数并返回结FROM students;果选择常量值SELECT name,在校AS返回列值和固定常量值status FROM students;SELECT语句是SQL中最常用的命令,用于从数据库中检索数据它的灵活性使我们可以精确控制查询结果的内容和形式在实际应用中,我们通常需要根据具体需求选择特定的列,而不是使用通配符*查询所有列,这样可以减少数据传输量,提高查询效率子句用法FROM单表查询最基本的FROM用法,指定一个表作为数据源多表查询在FROM中列出多个表,实现表之间的关联子查询作为表在FROM中使用子查询结果作为虚拟表FROM子句用于指定查询的数据源,它告诉数据库系统我们要从哪些表中检索数据在单表查询中,FROM后面直接跟表名即可但在实际应用中,数据通常分布在多个相关表中,需要通过FROM子句指定多个表,并在后续条件中定义它们之间的关联关系除了物理表外,FROM子句还可以引用视图、子查询结果集或者表函数子查询在FROM子句中使用时需要为其指定别名,这个子查询结果将作为一个临时表参与后续查询例如FROM SELECT*FROM ordersWHERE amount1000AS large_orders条件筛选WHERE等值比较大小比较模糊匹配范围查询WHERE column=value WHEREprice100WHERE nameLIKE%张%WHERE ageBETWEEN18AND25筛选与指定值相等的记录使用、、=、=进行范使用LIKE进行字符串模式围筛选匹配查找指定范围内的值WHERE子句是SQL查询中用于筛选数据的关键部分,它定义了记录必须满足的条件才能包含在结果集中WHERE后面跟随的是一个逻辑表达式,数据库系统会根据这个表达式对所有记录进行判断,只返回表达式结果为TRUE的记录常用运算符逻辑与逻辑或逻辑非AND ORNOT用于组合多个条件,所有条件必须同时满足才返回用于组合多个条件,满足任一条件即返回记录用于否定一个条件,返回不满足该条件的记录记录•WHERE department=市场部OR•WHERE NOTstatus=已删除•WHERE age18AND gender=女department=销售部•要求状态不是已删除•要求年龄大于18且性别为女•要求部门为市场部或销售部•适用于排除特定条件的场景•适用于需要同时满足多个条件的场景•适用于满足多个条件之一即可的场景逻辑运算符是构建复杂查询条件的基础,它们允许我们将多个简单条件组合成更复杂的表达式在使用这些运算符时,要注意它们的优先级NOT优先级最高,其次是AND,最后是OR为避免歧义,建议使用括号明确表达条件组合的优先级排序ORDER BY升序排列降序排列多字段排序ASC DESC默认的排序方式,从小到大排序从大到小的排序方式,需要显式指定先按第一字段排序,相同值再按第二字段排序SELECT name,score SELECT name,scoreFROM studentsFROM studentsSELECT name,class,scoreORDER BYscore ASC;ORDER BYscore DESC;FROM studentsORDER BY classASC,score DESC;数值字段从小到大,字符串按字母顺序,数值字段从大到小,字符串按字母反序,日期从早到晚日期从晚到早可以为不同字段指定不同的排序方向子句用于对查询结果进行排序,它是语句的最后一部分之一,在、之后执行通过排序,我们可以使ORDER BYSQL WHEREGROUP BY查询结果按照特定的顺序展示,便于数据分析和展示分页查询LIMIT基本语法LIMIT[offset,]count设置返回行数上限单参数形式LIMIT10仅返回前10条记录双参数形式LIMIT10,5跳过10条后返回5条分页应用LIMIT page-1*size,size实现分页显示数据LIMIT子句是MySQL和PostgreSQL等数据库系统提供的一种限制结果集大小的方法,它可以指定查询返回的最大行数,并可选择性地跳过一定数量的行LIMIT通常与ORDER BY一起使用,确保分页数据的顺序一致去重DISTINCT原始数据去重多列去重DISTINCT表中可能存在重复值,例如同一部门有多名员使用DISTINCT关键字可以过滤掉重复行,只返DISTINCT可应用于多个列,此时会基于所有指工,查询部门列会出现重复部门名称在某些分回唯一值例如SELECT DISTINCT定列的组合进行去重例如SELECT析场景下,我们只关心有哪些不同的值,而不关department FROM employees将只返回公司中DISTINCT department,job_title FROM心重复出现的次数的不同部门名称,每个部门只出现一次employees将返回不同的部门和职位组合DISTINCT关键字是SQL中用于消除结果集中重复行的工具,它位于SELECT关键字之后,作用于查询的所有选定列当查询涉及多个列时,DISTINCT会基于所有列的组合进行去重,只有当所有列的值都相同时才被视为重复字段与表别名AS字段别名表别名为查询结果中的列指定一个更有意义或更简洁的名称,提高结果的可读为查询中使用的表指定短名称,简化多表查询中的表引用,特别是在自连性接查询中非常有用SELECT SELECT e.name,d.name ASdepartment_namefirst_name AS名,FROM employeesAS elast_name AS姓,JOIN departmentsAS dbirth_date AS出生日期ON e.dept_id=d.id;FROM employees;表别名同样可以省略AS关键字FROM employeese JOIN departments d也可以省略AS关键字,直接使用空格SELECT first_name名,last_name姓FROM employees;别名是SQL查询中的重要工具,它使查询语句更简洁,结果更易理解字段别名主要影响结果集的显示,而表别名则影响查询语句的编写方式在复杂查询中,合理使用表别名可以大大提高SQL语句的可读性和可维护性单表查询综合案例查询需求分析从学生表中查询所有女生的姓名、年龄和成绩,按成绩从高到低排序,只显示前10名语句编写SQLSELECTname AS姓名,age AS年龄,score AS成绩FROM studentsWHEREgender=女ORDER BYscore DESCLIMIT10;执行结果解析查询返回符合条件的前10名女生信息,包括她们的姓名、年龄和成绩,按成绩降序排列结果字段名显示为中文,便于阅读和理解这个综合案例展示了单表查询中常用子句的组合使用首先用SELECT指定需要的列并设置别名,用WHERE过滤性别条件,然后用ORDER BY按成绩降序排序,最后用LIMIT限制结果数量这种组合查询在实际应用中非常常见,例如在学生管理系统中生成各类排名报表聚合函数介绍COUNT计算符合条件的行数COUNT*计算所有行数,COUNTcolumn计算指定列非NULL值的数量常用于统计记录总数或有效值数量SUM计算指定列值的总和只适用于数值类型列,自动忽略NULL值常用于计算销售总额、总成本等AVG计算指定列值的平均值只适用于数值类型列,自动忽略NULL值常用于计算平均分数、平均价格等和MAX MIN分别查找指定列的最大值和最小值适用于数值、字符串和日期类型,自动忽略NULL值常用于查找极值或范围边界聚合函数是SQL中用于执行数据汇总计算的特殊函数,它们可以将多行数据合并为单个结果值这些函数通常用于数据分析、报表生成和统计计算等场景,是数据库查询中不可或缺的工具统计数量COUNT32常见用法处理值NULLCOUNT有三种常见的使用形式,分别适用于不同的统计需求COUNT*和COUNT1会计算所有行,而COUNTcolumn会忽略NULL值10x性能差异在大多数数据库中,COUNT*的优化程度最高,性能最好用法功能示例COUNT*统计总行数,包括NULL值SELECT COUNT*FROM students;COUNTcolumn统计指定列非NULL值的数量SELECT COUNTemailFROM students;COUNTDISTINCT column统计指定列非NULL的不同值数量SELECT COUNTDISTINCTdepartmentFROM employees;、求和与平均SUM AVG、查最大最小值MAX MIN函数函数实际应用场景MAX MIN用于查找指定列的最大值用于查找指定列的最小值和函数在业务分析中的典型应用MAX MIN•数值列返回最大数值•数值列返回最小数值•价格范围查找商品最高和最低价格•字符串列返回按字母顺序排最后的值•字符串列返回按字母顺序排最前的值•时间边界确定数据的时间跨度•日期列返回最新的日期•日期列返回最早的日期•排名分析结合子查询找出最高分数的学生SELECT MAXprice AS最高价格SELECT MINprice AS最低价格•库存管理识别库存最多和最少的商品FROM products;FROM products;和函数是寻找数据极值的强大工具,它们可以应用于数值、文本和日期类型的列这两个函数常用于确定数据范围、找出最佳或最MAX MIN差性能、识别异常值等场景在数据分析中,了解数据的边界值通常是理解整体分布的第一步分组GROUP BY确定分组依据根据分析需求,确定按哪些字段进行分组,如部门、日期、类别等编写子句GROUP BY在SELECT语句中添加GROUP BY子句,列出分组字段GROUP BYdepartment,year使用聚合函数对每个分组应用聚合函数计算汇总值SELECTdepartment,COUNT*AS员工数,AVGsalary AS平均工资对结果排序通常结合ORDER BY对分组结果进行排序,便于分析ORDER BYAVGsalary DESCGROUP BY子句是数据分析的核心工具,它允许我们根据一个或多个列的值将数据行分组,然后对每个组应用聚合函数GROUP BY的基本语法是SELECT column1,column2,aggregate_functioncolumn3FROM tableGROUP BYcolumn1,column2分组条件HAVING与的区别语法示例WHERE HAVINGHAVINGWHERE过滤行,在分组前应用;HAVING过滤分组,在分组后应用SELECT•WHERE不能使用聚合函数department,AVGsalary ASavg_salary•HAVING可以使用聚合函数FROM employees•WHERE作用于原始数据GROUP BYdepartment•HAVING作用于分组后的结果HAVING AVGsalary5000ORDER BYAVGsalary DESC;此查询返回平均工资超过5000的部门及其平均工资,按平均工资降序排列HAVING子句是GROUP BY查询的强大补充,它允许我们根据聚合计算的结果筛选分组在SQL查询的执行顺序中,HAVING在GROUP BY之后、ORDER BY之前执行,这意味着它可以引用GROUP BY创建的分组和SELECT中计算的聚合值在实际应用中,HAVING子句通常用于找出满足特定统计条件的组,如平均销售额超过1000元的产品类别或员工数量超过10人的部门这种分析对业务决策提供了重要支持,帮助识别表现优异或需要改进的业务领域多表查询简介连接类型关联基础根据数据匹配方式分为不同类型的连接通过共同字段建立表间关系,实现数据的横向组合•内连接INNER JOIN•主键-外键关系•外连接LEFT/RIGHT JOIN•相同业务属性•全连接FULL JOIN•交叉连接CROSS JOIN注意事项应用价值合理使用多表查询以避免性能问题多表查询是复杂数据处理的基础•明确连接条件,避免笛卡尔积•整合分散在不同表的相关数据•连接表数量越少越好•减少数据冗余,保持数据一致性•注意索引优化连接性能•实现复杂的业务逻辑查询多表查询是关系型数据库的核心优势之一,它允许我们从多个相关表中获取和组合数据在实际应用中,数据通常分布在多个表中以减少冗余、提高维护效率例如,一个电商系统可能将用户信息、订单信息和商品信息存储在不同的表中,通过多表查询可以获取完整的订单详情内连接INNER JOIN定义语法结构INNER JOIN内连接返回两个表中满足连接条件的行的组合只SELECT a.column1,b.column2FROM table1a有当连接字段在两表中都有匹配值时,记录才会被INNER JOINtable2b ONa.key=b.key连接条件返回内连接是最常用的连接类型,默认的JOIN关由ON子句指定,通常是比较两个表中的关联字段,键字就是INNER JOIN也可以使用更复杂的条件表达式数据筛选特点内连接会过滤掉任何一个表中不满足连接条件的行,相当于取两个表的交集如果连接字段在某表中有NULL值,或者在另一表中没有匹配值,则相关行不会出现在结果中SELECTo.order_id,c.customer_name,o.order_date,o.total_amountFROM orders oINNER JOIN customers cON o.customer_id=c.customer_idWHERE o.order_date=2023-01-01;内连接是多表查询的基础,它建立在表间关系的匹配上,只返回满足匹配条件的记录在处理业务数据时,内连接通常用于获取必须在所有相关表中都有对应记录的完整数据,如完整的订单信息、有效的用户交易等外连接LEFT/RIGHT JOIN左外连接右外连接应用场景对比LEFT JOINRIGHT JOIN返回左表中的所有行,即使右表中没有匹配行如果右表没返回右表中的所有行,即使左表中没有匹配行如果左表没LEFT JOIN常用于查找不匹配记录,如查找没有订单的客有匹配项,则右表列显示为NULL这种连接适用于需要保有匹配项,则左表列显示为NULL这种连接在功能上与户,可以通过WHERE条件过滤右表字段为NULL的记录实留主表所有记录的情况,例如显示所有客户的订单情况,包LEFT JOIN类似,只是主表和从表的角色互换在实际应用现RIGHT JOIN使用较少,通常可以通过调整表顺序转换括没有下单的客户中使用频率较低,因为通常可以通过调整表顺序转换为为LEFT JOIN两种外连接都能保留一个表的所有记录,是LEFT JOIN数据完整性分析的重要工具SELECT c.name,o.order_id SELECTc.name,o.order_idFROM customersc FROM orders oLEFT JOIN orderso RIGHTJOIN customerscON c.id=o.customer_id;ON o.customer_id=c.id;全外连接FULL OUTER JOIN全外连接定义FULL OUTERJOIN返回左表和右表中的所有行,无论它们是否有匹配项如果没有匹配项,则相应表的列显示为NULL相当于LEFT JOIN和RIGHTJOIN的组合,获取两表的并集语法结构SELECT a.column1,b.column2FROM table1a FULL OUTERJOINtable2b ONa.key=b.key连接条件由ON子句指定,通常是比较两个表中的关联字段SELECT e.employee_name,d.department_nameFROM employeeseFULL OUTERJOINdepartments dON e.department_id=d.department_id;中的替代方案MySQLMySQL不直接支持FULLOUTERJOIN,但可以通过组合LEFT JOIN和UNION来模拟SELECTe.employee_name,d.department_nameFROM employeeseLEFT JOINdepartments dONe.department_id=d.department_idUNIONSELECT e.employee_name,d.department_nameFROM employeeseRIGHT JOINdepartmentsdONe.department_id=d.department_idWHERE e.department_id IS NULL;全外连接是最包容的连接类型,它返回两个表中的所有行,不论它们是否有匹配项这种连接类型特别适用于需要完整视图的场景,如比较两个相关数据集的差异、检查数据完整性或生成综合报表例如,通过全外连接可以同时查看所有员工和所有部门,包括没有部门的员工和没有员工的部门与关键字ON USING子句子句选择建议ON USING最通用的连接条件设置方式,可以指定任意复杂的简化版的连接条件,专用于同名字段的等值连接根据具体情况选择最合适的方式条件表达式•要求连接字段在两表中名称相同•连接字段同名且是等值连接→USING•可以连接不同名称的字段•结果集中同名字段只出现一次•连接字段不同名或需要复杂条件→ON•支持多个条件组合(AND/OR)•代码更简洁,可读性更好•多表连接时保持一致的风格•可以包含非等值条件•考虑团队规范和可维护性SELECT order_id,nameSELECT o.order_id,c.name FROM ordersFROM orderso JOINcustomersJOIN customersc USINGcustomer_id;ON o.customer_id=c.idAND o.order_date2023-01-01;在多表连接查询中,正确设置连接条件是确保查询结果准确的关键ON和USING是两种常用的连接条件表达方式,它们各有优势和适用场景ON子句更灵活,可以处理各种复杂的连接逻辑;而USING子句更简洁,适合同名字段的等值连接交叉连接CROSS JOIN交叉连接定义1CROSS JOIN生成两个表的笛卡尔积,返回第一个表中的每一行与第二个表中的每一行的所有可能组合结果行数等于两个表行数的乘积语法结构两种等价的语法SELECT a.column1,b.column2FROM table1aCROSS JOINtable2b;SELECT a.column1,b.column2FROM table1a,table2b;使用注意事项交叉连接会产生大量数据,可能导致性能问题例如,两个各有1000行的表交叉连接会产生1,000,000行结果在大多数业务场景中,应避免无条件的交叉连接适用场景虽然应谨慎使用,但交叉连接在某些场景中很有用•生成所有可能的组合(如商品尺寸和颜色的全组合)•创建测试数据集•特定的数学运算和报表生成交叉连接是最基本的连接类型,但也是最容易导致性能问题的连接它不需要指定连接条件,直接返回两个表的笛卡尔积在实际应用中,无意的交叉连接通常是连接条件缺失或错误的结果,应该避免这种情况多表关联查询案例查询需求获取每位客户的订单总金额和订购商品数量,包括客户基本信息,并按订单总金额降序排列相关表分析需要关联三个表•customersid,name,email,...•ordersid,customer_id,order_date,...•order_itemsorder_id,product_id,quantity,price,...实现SQLSELECTc.id AS客户ID,c.name AS客户名称,c.email AS电子邮箱,COUNTDISTINCT o.id AS订单数量,SUMoi.price*oi.quantity AS订单总金额,SUMoi.quantity AS购买商品总数FROM customerscLEFT JOIN orderso ON c.id=o.customer_idLEFT JOIN order_items oiON o.id=oi.order_idGROUP BYc.id,c.name,c.emailORDER BYSUMoi.price*oi.quantity DESC;查询解析使用LEFT JOIN确保包含所有客户,即使没有订单;通过GROUP BY按客户分组;使用聚合函数计算每个客户的订单统计信息;最后按订单总金额降序排列结果这个多表关联查询案例展示了如何通过表连接和聚合函数组合多个相关表的数据,生成业务报表使用LEFT JOIN而不是INNER JOIN确保查询结果包含所有客户,包括那些没有订单的客户,这对全面分析客户行为很重要子查询简介子查询定义子查询分类子查询是嵌套在另一个查询(主查询)内的根据返回结果可分为标量子查询单值、行SELECT语句,用于为主查询提供数据或条件子查询单行多列、表子查询多行多列使用位置应用优势子查询可以用在SELECT、FROM、子查询可以分解复杂问题、减少连接操作、提WHERE、HAVING等子句中,根据位置有不高SQL可读性,是处理复杂查询的强大工具同的用法和限制子查询是SQL中一种强大的查询技术,它通过在一个查询内部嵌套另一个查询来处理复杂的数据检索需求子查询可以返回单个值、单行多列、多行单列或多行多列的结果,分别用于不同的应用场景例如,查找高于平均工资的员工,可以使用子查询计算平均工资,然后与主查询比较标量子查询定义特点示例用法标量子查询是返回单个值(一行一列)的子查询,可以在表标量子查询常用于计算聚合值、查找特定值或进行比较操达式中使用,就像使用常量或列名一样这种子查询必须保作证只返回一个值,否则会导致错误•只返回一行一列--查找高于平均工资的员工SELECT employee_name,salary•可以出现在需要单个值的位置FROM employees•常用于SELECT和WHERE子句WHERE salarySELECT AVGsalaryFROMemployees;使用场景标量子查询在许多业务场景中非常有用,特别是需要将聚合值用于条件判断或计算时•比较个体与整体(如高于平均值)•查找特定记录的相关信息•根据聚合值计算百分比•动态生成条件值标量子查询是子查询中最简单也是最常用的一种,它返回单个值,可以在需要单个值的任何位置使用在WHERE子句中,可以将标量子查询用于比较操作,如查找超过平均值的记录;在SELECT子句中,可以将其用作计算的一部分,如计算销售额占总销售额的百分比行子查询定义行子查询返回单行多列的结果,可以与行构造器ROW或多个值的括号表示进行比较,实现多列同时比较的功能语法column1,column2,...=SELECT column1,column2,...FROM...或者使用ROW关键字ROWcolumn1,column2,...=SELECT...示例--查找与指定员工相同部门和职位的其他员工SELECTname,department,positionFROM employeesWHEREdepartment,position=SELECT department,positionFROM employeesWHEREid=10001AND id!=10001;行子查询是一种特殊类型的子查询,它返回单行多列的数据,可以用于同时比较多个列值这种子查询在需要根据多个条件进行匹配的场景中非常有用,它可以替代复杂的AND条件组合,使SQL更简洁、更易读在MySQL、PostgreSQL和Oracle等主流数据库中,都支持行构造器和行比较操作,但具体语法可能略有不同例如,Oracle中可能需要使用AND连接多个单独的比较,而不是使用行比较行子查询在查找相似记录、比较复合键值或在复杂条件下进行记录匹配时特别有用表子查询定义特点在中使用与使用FROM IN/EXISTS表子查询返回多行多列的结果,类似于一个完整的表格SELECT d.department_name,summary.avg_salary--查找有订单的客户这种子查询可以出现在FROM子句中作为一个派生表,也FROM departmentsd SELECTcustomer_name可以与IN、EXISTS等操作符一起使用JOINFROM customers•返回多行多列的结果集SELECT department_id,AVGsalary ASWHERE customer_id INavg_salary SELECTDISTINCT customer_id•在FROM子句中需要别名FROMemployeesFROMorders•可以进行进一步的查询和处理GROUP BYdepartment_id;AS summaryONd.department_id=summary.department_id这个查询使用子查询找出所有有订单的客户ID,然后在主WHERE summary.avg_salary5000;查询中筛选出这些客户的信息这个查询首先计算每个部门的平均工资,然后与部门表连接,筛选出平均工资高于5000的部门表子查询是最灵活的子查询类型,它可以返回完整的数据集,就像一个临时表在FROM子句中使用表子查询时,必须为其指定别名,因为数据库需要一个名称来引用这个结果集这种用法通常被称为派生表或内联视图与用法IN EXISTS操作符IN检查一个值是否在一个值列表或子查询结果中操作符EXISTS检查子查询是否返回任何行性能对比IN适合外表小内表大,EXISTS适合外表大内表小特性IN EXISTS返回值要求子查询必须返回单列子查询可以返回任意列NULL值处理IN对NULL值判断不确定EXISTS只关心是否存在,不受NULL影响语法示例WHERE columnIN SELECT...WHERE EXISTSSELECT1FROM...WHERE...适用场景外部查询数据量小外部查询数据量大IN和EXISTS是SQL中用于子查询的两个重要操作符,它们都可以检查是否满足某种条件,但工作方式和性能特性有所不同IN会评估子查询的整个结果集,然后检查主查询的值是否在这个结果集中;而EXISTS只检查子查询是否返回至少一行,一旦找到匹配行就停止、高级子查询ANY ALL操作符操作符ANY ALLANY表示与子查询结果中的任意一个值比较为真ALL表示与子查询结果中的所有值比较都为真•columnANY...-大于子查询中的最小值•columnALL...-大于子查询中的最大值•column=ANY...-等同于IN操作符•column=ALL...-仅当子查询返回单值且相等时为真•columnANY...-小于子查询中的最大值•columnALL...-小于子查询中的最小值SELECT product_name,price SELECTdepartment_nameFROM products FROM departmentsWHEREpriceANYWHERE budgetALL SELECTprice SELECTAVGbudgetFROM premium_productsFROMdepartments;GROUP BYregion;查找价格低于任何一个高端产品的普通产品查找预算高于所有地区平均预算的部门ANY和ALL是两个强大的子查询操作符,它们允许进行更复杂的比较操作ANY操作符要求表达式与子查询结果中的至少一个值比较为真,而ALL操作符则要求与子查询结果中的所有值比较都为真这两个操作符结合各种比较运算符(、、=、等)可以构建非常灵活的查询条件联合查询UNION基本语法使用规则UNION UNION ALLUNION用于合并两个或多个UNION ALL合并结果集但不去除重UNION使用的关键规则SELECT语句的结果集,并去除重复复行,性能通常优于UNION•每个SELECT语句必须有相同行的列数SELECT column1,column2SELECT column1,column2•对应列的数据类型必须兼容FROM table1FROM table1•最终结果的列名取自第一个UNION UNIONALLSELECT语句SELECT column1,column2SELECT column1,column2FROM table2;FROM table2;排序要对UNION结果进行排序,ORDERBY只能出现在最后一个查询之后SELECT column1,column2FROM table1UNIONSELECT column1,column2FROM table2ORDER BYcolumn1;UNION操作符是将多个查询结果合并为单个结果集的强大工具它要求各个查询返回相同数量的列,且对应列的数据类型必须兼容UNION会自动去除重复行,如果需要保留所有行(包括重复项),应使用UNIONALL,后者通常性能更好,因为不需要额外的去重处理差集与交集EXCEPT INTERSECT操作EXCEPT操作INTERSECT返回第一个查询结果中存在但第二个查询结果中不返回两个查询结果中都存在的行存在的行1SELECT column1FROM table1SELECT column1FROM table1INTERSECTEXCEPTSELECT column1FROM table2;SELECT column1FROM table2;应用场景替代方案MySQL这些集合操作在数据分析中具有重要应用MySQL不直接支持EXCEPT和INTERSECT,需使用其他方式实现•对比分析不同数据集(如新旧客户)•数据验证和一致性检查•使用LEFT JOIN和ISNULL模拟EXCEPT•查找特定条件组合的记录•使用INNER JOIN或IN子查询模拟INTERSECTEXCEPT和INTERSECT是SQL中的集合操作符,它们与UNION一样,用于比较和组合多个查询的结果EXCEPT(在某些数据库中称为MINUS)返回第一个查询中存在但第二个查询中不存在的行;INTERSECT返回两个查询结果中都存在的行这些操作符对于比较不同数据集之间的差异和共同点非常有用视图简介SQL视图定义视图是基于SQL查询的结果集的虚拟表它不存储实际数据,而是存储查询定义,每次访问视图时都会执行这个查询视图可以包含一个或多个表的部分或全部数据,也可以包含其他视图的数据视图优势视图提供了多种优势,使其成为数据库设计的重要工具简化复杂查询,隐藏底层表结构,增强数据安全性,提供数据抽象层,实现向后兼容性,支持逻辑数据独立性视图限制视图也有一些限制需要注意可能影响性能(特别是复杂视图),更新操作可能受限,不支持索引(除了索引视图),可能存在权限和依赖关系问题,不同数据库系统对视图的支持有差异视图类型根据不同特性,视图可分为多种类型简单视图(单表无聚合)、复杂视图(多表或有聚合)、可更新视图、只读视图、物化视图(存储数据)、索引视图(带索引)等不同类型适用于不同的应用场景视图是SQL中一个重要的概念,它是一种虚拟表,基于一个或多个实际表的查询结果视图不存储数据本身,而是存储生成数据的查询语句当用户查询视图时,数据库系统会执行定义视图的查询,返回结果这种查询的查询机制使视图成为处理复杂数据关系和实现数据抽象的强大工具创建与管理视图创建视图CREATE VIEWview_name ASSELECTcolumn1,column2,...FROM table_nameWHERE condition;创建一个名为view_name的视图,基于指定的SELECT查询可以使用OR REPLACE选项更新现有视图修改视图ALTER VIEWview_name ASSELECTcolumn1,column2,...FROM table_nameWHERE new_condition;修改现有视图的定义在MySQL中,ALTER VIEW的功能与CREATE ORREPLACE VIEW相同删除视图DROP VIEW[IF EXISTS]view_name;删除指定的视图IF EXISTS选项可以防止在视图不存在时发生错误查询视图SELECT*FROM view_name;视图的查询方式与普通表相同,可以使用SELECT语句查询视图中的数据视图的创建和管理是数据库管理的重要部分创建视图时,可以指定查询语句,包括选择特定列、应用过滤条件、连接多个表或使用聚合函数等视图创建后,可以像查询普通表一样查询它,数据库系统会执行视图定义中的查询,返回结果视图实际案例数据安全视图CREATE VIEWemployee_public AS复杂查询简化SELECT id,name,department,positionFROM employees;CREATE VIEWorder_details AS隐藏敏感信息(如工资、电话、地址),只展示公开信息的员工视图授权给普通用户,保护敏感数据SELECT o.id,o.order_date,c.name ascustomer,p.name asproduct,oi.quantity,oi.price,oi.quantity*oi.price astotalFROM orderso报表统计视图JOINcustomersc ON o.customer_id=c.idJOIN order_items oiON o.id=oi.order_idJOIN productsp ONoi.product_id=p.id;CREATE VIEWsales_summary ASSELECTproduct_category,整合订单、客户、产品和订单项目信息的视图,将复杂的多表连接查询简化为单表查询YEARorder_date asyear,MONTHorder_date asmonth,SUMquantity*price astotal_sales,COUNTDISTINCT order_id asorder_countFROM order_detailsGROUP BY product_category,YEARorder_date,MONTHorder_date;按产品类别、年、月汇总销售数据的视图,用于生成销售报表和趋势分析视图在实际业务应用中有广泛的用途,上述案例展示了三种常见的视图应用模式数据安全视图通过只暴露非敏感字段,实现了细粒度的访问控制,避免了直接授予基表权限可能带来的安全风险这种方式特别适用于多角色访问同一数据库的场景,如员工目录、客户信息管理等索引对查询的影响常见性能优化方法查询结构优化索引使用策略•只查询需要的列,避免SELECT*•为WHERE、JOIN、ORDER BY中的列创建索引•使用适当的WHERE条件限制结果集•在高选择性列上创建索引•优化JOIN操作,保持连接表数量最小•考虑组合索引优化多条件查询•使用EXISTS代替IN处理大数据集•使用覆盖索引避免回表操作•避免在WHERE子句中对列使用函数•定期分析和维护索引•避免不必要的DISTINCT和UNION操作•注意过多索引可能降低写入性能数据结构与查询重写•使用视图简化复杂查询•适当时使用临时表或子查询•将大查询拆分为小查询•使用LIMIT限制返回行数•考虑预计算和缓存常用结果•根据执行计划分析优化查询路径查询性能优化是数据库开发的核心技能,它直接影响应用的响应速度和系统资源利用效率良好的查询优化通常从多个层面考虑查询结构、索引使用、数据结构等在编写查询时,应遵循只查询必要数据的原则,避免不必要的计算和数据传输查询调优工具分析执行计划性能分析性能监控工具EXPLAIN SHOW PROFILEEXPLAIN是最基本的查询分析工具,它显示数据库优SHOW PROFILE提供查询执行的详细时间信息数据库系统通常提供各种性能监控工具化器如何执行查询•MySQL:Performance Schema,sys schemaSETprofiling=1;•PostgreSQL:pg_stat_statements,auto_explainEXPLAIN SELECT*FROMordersSELECT*FROM large_table WHEREid•Oracle:Automatic WorkloadRepository AWRWHEREcustomer_id=1001;1000;SHOWPROFILE;•SQL Server:Dynamic ManagementViews DMVs关注的关键信息可以查看各阶段耗时这些工具可以监控查询性能、识别慢查询、分析资源•查询类型type•发送数据时间使用情况systemconsteq_refrefrangeindexALL•排序时间•使用的索引key•创建临时表时间•扫描的行数rows•等待锁时间•额外信息Extra查询调优工具是数据库开发人员和管理员的重要资源,它们提供了洞察查询执行细节的能力EXPLAIN命令是最常用的工具,它显示数据库优化器选择的执行计划,包括表的访问方法、连接类型、索引使用情况等信息通过分析EXPLAIN输出,可以识别查询中的性能瓶颈,如全表扫描、低效的连接方式或未使用的索引数据库安全与注入SQL注入风险SQLSQL注入是一种常见的安全漏洞,攻击者通过在用户输入中插入恶意SQL代码,使应用执行非预期的数据库操作这可能导致数据泄露、数据损坏或未授权访问易受攻击的代码//错误示例var username=userInput;var query=SELECT*FROM usersWHERE username=+username+;//如果userInput为admin OR1=1//最终查询变为SELECT*FROM usersWHERE username=admin OR1=1防护措施•使用参数化查询/预处理语句•对输入进行严格验证和转义•应用最小权限原则•使用存储过程封装数据库操作•启用数据库安全审计安全最佳实践//正确示例(使用参数化查询)var stmt=db.prepareSELECT*FROM usersWHERE username=;var rows=stmt.executeuserInput;参数化查询确保用户输入作为数据值处理,而不会被解释为SQL代码,有效防止注入攻击SQL注入是数据库应用面临的最严重安全威胁之一,它利用了应用程序构建SQL查询的方式中的漏洞当应用直接拼接用户输入到SQL字符串中,并且没有适当验证或转义这些输入时,就可能出现SQL注入风险攻击者可以通过精心构造的输入改变SQL语句的结构和逻辑,执行未授权的数据库操作典型业务场景案例一学生成绩管理数据结构主要表结构•studentsid,name,gender,class_id,...•coursesid,name,credit,teacher_id,...•scoresstudent_id,course_id,score,semester,...•classesid,name,grade,major_id,...案例需求生成学期成绩单报表,包括•每个学生的所有课程成绩•各科平均分、最高分、最低分•学生总成绩和排名•按班级统计及格率核心查询实现--学生个人成绩单SELECTs.name AS学生姓名,c.name AS课程名称,sc.score AS分数,CASEWHEN sc.score=90THEN优WHEN sc.score=80THEN良WHEN sc.score=70THEN中WHEN sc.score=60THEN及格ELSE不及格END AS等级FROMstudentssJOIN scoressc ONs.id=sc.student_idJOIN coursesc ONsc.course_id=c.idWHERE s.id=10001AND sc.semester=2023-1ORDER BYsc.score DESC;典型业务场景案例二电商订单数据结构订单查询需求销售统计分析核心表设计--用户订单详情查询--商品销售统计•usersid,username,password,email,phone,...SELECT SELECTo.id AS订单号,p.category_id,•productsid,name,price,stock,category_id,...o.order_time AS下单时间,c.name AS分类,•ordersid,user_id,order_time,status,total_amount,...u.username AS用户名,p.id AS商品ID,•order_itemsid,order_id,product_id,quantity,price,...p.name AS商品名称,p.name AS商品名称,•paymentid,order_id,payment_method,amount,status,...oi.quantity AS数量,SUMoi.quantity AS销售数量,oi.price AS单价,SUMoi.quantity*oi.priceAS销售金额,oi.quantity*oi.priceAS小计,COUNTDISTINCT o.id AS订单数o.total_amount AS总金额,FROM productspo.status AS订单状态,JOINorder_items oiON p.id=oi.product_idpm.payment_method AS支付方式JOIN ordersoONoi.order_id=o.idFROM orderso JOINcategories cON p.category_id=c.idJOIN usersu ONo.user_id=u.id WHEREo.status=已完成JOINorder_items oiONo.id=oi.order_id ANDo.order_time=2023-01-01JOIN productsp ONoi.product_id=p.id ANDo.order_time2023-06-01LEFTJOINpayment pmONo.id=pm.order_id GROUP BYp.category_id,c.name,p.id,p.nameWHERE o.id=202305120001;ORDERBY销售金额DESC;电子商务是关系型数据库应用的典型场景,涉及用户、商品、订单、支付等多个相关实体在电商系统中,订单查询是最常见的操作之一,它通常需要关联多个表来获取完整的订单信息,包括用户资料、商品详情、支付状态等上面的查询展示了如何通过多表连接实现详细的订单查询,提供完整的订单视图典型业务场景案例三常见错误与排查语法错误连接问题1最常见的错误类型,通常由拼写错误、缺少关键字或符号、括号不匹配等引起解决连接条件不正确或缺失,导致笛卡尔积或结果集缺少记录解决方法确保正确设置方法仔细检查SQL语法,使用IDE的语法检查功能,参考数据库文档中的正确语法连接条件,使用适当的连接类型INNER/LEFT/RIGHT,检查连接字段的数据类型是示例否匹配错误性能问题GROUP BYSELECT中包含非聚合列但未在GROUPBY中列出,或HAVING中使用非聚合函数查询执行缓慢,通常由缺少索引、不当的查询结构或大量数据导致解决方法使用解决方法确保SELECT中的每个非聚合列都出现在GROUPBY子句中,或者将非EXPLAIN分析执行计划,添加适当的索引,优化查询结构,限制结果集大小,考虑聚合列封装在聚合函数中分批处理大量数据在数据库查询开发过程中,错误是不可避免的了解常见错误类型及其排查方法,可以大大提高开发效率和查询质量语法错误是最基本的问题,通常由工具自动检测并提示;而逻辑错误和性能问题则可能更难发现,需要仔细分析查询逻辑和执行计划学习资源推荐深入学习数据库查询需要系统的学习资源和持续的实践以下是一些值得推荐的学习资源,覆盖从入门到高级的不同学习阶段经典书籍•《SQL必知必会》-入门级基础教程•《SQL学习指南》Learning SQL-全面介绍SQL语言•《SQL性能优化》SQL PerformanceExplained-深入理解索引和查询优化•《SQL进阶教程》-高级SQL技术和应用模式官方文档•MySQL官方文档-完整的参考资料•PostgreSQL文档-高级特性详细说明•Oracle Database文档库-企业级数据库最佳实践•SQL Server技术文档-微软提供的详细指南在线课程•SQL大师班Udemy-从基础到高级的系统课程•数据库系统概念Coursera-理论与实践结合•SQL性能调优实战LinkedIn Learning-专注性能优化•CodewithMosh的SQL课程-实用技能培训总结与答疑掌握核心查询技能能够编写高效、准确的SQL查询,满足各类业务需求理解数据库基础结构了解关系型数据库的基本概念和表间关系熟悉各类查询操作3单表查询、多表连接、子查询、聚合分析等具备性能优化意识索引设计、查询结构优化、执行计划分析建立持续学习基础了解学习资源,具备自主解决问题的能力本课程系统介绍了数据库查询的核心概念和技术,从基本的SELECT语句,到复杂的多表连接、子查询和性能优化通过理论讲解和实际案例相结合的方式,帮助学习者建立起完整的SQL查询知识体系重点内容包括理解数据库的基本结构、掌握各类SQL语句的用法、学习数据连接和聚合分析的方法、了解查询优化的原则和技巧数据库查询技能在现代信息系统中有着广泛的应用,无论是业务数据分析、报表生成、系统集成还是应用开发,都需要熟练掌握SQL查询希望本课程能为您的学习和工作提供帮助,建立起扎实的数据库查询基础学习数据库是一个持续的过程,鼓励大家在实际项目中不断实践和探索,遇到问题时查阅文档和专业资源,逐步提升数据库应用和优化的能力。
个人认证
优秀文档
获得点赞 0