还剩48页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
初级技能培训SQL欢迎参加本次实用技能快速入门培训本课程专为零基础学习者设计,SQL通过系统化的教学内容,帮助你轻松掌握基础知识和实用技能SQL在接下来的课程中,我们将从基础概念出发,逐步深入到数据操作、查SQL询分析等实际应用场景无论你是数据分析新手,还是希望提升数据库操作能力的职场人士,这门课程都能满足你的学习需求培训内容总览1基础模块概念、数据库基础、表结构、基本查询语句适合零基础学习SQL者,建立思维框架SQL2操作模块数据增删改查、条件筛选、排序分组掌握日常数据操作基本技能,能够独立完成简单数据处理任务3进阶模块多表连接、子查询、函数使用、视图创建提升数据分析能力,解决复杂业务场景问题4实战模块简介SQL定义发展历史SQL(结构化查询语言)是专门用起源于世纪年代的SQL SQL2070IBM于管理关系型数据库系统的标准化项目,最初名为System R编程语言它允许用户以结构化的年,成为美SEQUEL1986SQL方式访问、操作和管理数据库中的国国家标准协会的标准,ANSI数据不仅仅是一种查询语年成为国际标准化组织SQL1987ISO言,它还包括数据定义、数据操作的标准经过多次修订,形成了和数据控制功能、、SQL-92SQL:1999等多个版本标准SQL:2003数据分析地位在当今数据驱动的商业环境中,已成为数据分析师、业务分析师的必备技SQL能它是连接业务与数据的桥梁,使非技术人员也能直接从数据库中提取有价值的信息,支持决策制定常见数据库系统Oracle SQLServer企业级数据库的代表,拥有强大的稳微软开发的关系型数据库产品,与定性和安全性,适用于大型企业关键系统集成紧密在政府、Windows业务系统广泛应用于金融、电信等教育和中型企业广泛应用,尤其在使MySQL行业,如中国银行、中国移动等均使用技术栈的企业中占有重要地.NET用数据库位PostgreSQL世界上最流行的开源关系型数据库系Oracle统之一,以其可靠性、易用性和性能先进的开源数据库,支持复杂查询和著称被大量中小企业和应用采地理信息系统功能近年来在Web GIS用,如、早期科技创新企业中应用增多,如、WordPress FacebookUber架构等均有采用Instagram数据库与表结构数据库数据的集合体,相当于文件系统中的文件夹表数据的逻辑组织形式,由行和列构成字段列/表中的单个数据属性,如姓名、年龄记录行/表中的单条完整数据,包含所有字段值图实体关系图是描述数据库结构的图形化工具,能直观展示表之间的关系主键是表中唯一标识每条记录的字段,而外键ERPrimary Key则用于建立表间的关联关系,确保数据完整性和一致性Foreign Key安装与连接数据库下载安装包访问官方网站,选择适合操作系统的安装包下载MySQL mysql.com用户可选择,包含常用组件;用户可Windows MySQLInstaller MacOS使用包;用户可通过软件包管理器安装DMG Linux安装配置运行安装程序,根据向导提示选择安装类型(通常建议选择开发者默认设置)设置用户密码,这是访问数据库的超级管理员凭证,root请务必牢记根据需要配置网络设置和服务启动方式连接测试安装或其他管理工具,创建新连接输入服务MySQL Workbench器地址通常为、端口默认、用户名和密码使用localhost3306命令行连接主机名用户名数据库名,然后输mysql-h-u-p入密码成功连接后,可执行查看现有数SHOW DATABASES;据库列表语言分类SQL数据定义语言数据操作语言DDLDML用于定义数据库对象的结构,用于操作数据库中的数据,包如创建、修改或删除数据库和括数据的增加、查询、修改和表主要包括、删除主要包括、CREATE SELECT、、、、ALTER DROPINSERT UPDATE等命令例如等命令例如TRUNCATE DELETECREATE TABLE studentsSELECT*FROM students查询所有id INT,name WHERE age18创建一个包年龄大于岁的学生信息VARCHAR5018含学生和姓名的表ID数据控制语言DCL用于控制数据库的访问权限和事务处理主要包括、、GRANT REVOKE、等命令例如COMMIT ROLLBACKGRANT SELECTON授予用户查询特定表的权限database.table TOuser@localhost语法基础SQL大小写敏感性注释语法语句结束标识关键字和函数名不区分大小写,如支持两种注释方式单行注释使用大多数语句使用分号作为结束标SQL SQL SQL;、或都是有效(两个连字符)开头;多行注释使识在命令行中执行时,分号告诉SELECT selectSeLeCt--SQL的但为提高代码可读性,通常将关键用开始,结束注释对代码维护解释器一条完整语句的结束但在某些/**/字大写,将表名和字段名小写需要注非常重要,良好的注释能帮助他人理解编程环境或应用程序中,可能不需要分意的是,在某些数据库系统中,表名和你的语句用途和逻辑号建议养成添加分号的习惯,以确保SQL字段名可能区分大小写,尤其是在兼容性Linux系统上语句入门SELECT子句SELECT是数据查询的基础,用于指定需要检索的列(字段)可以列SELECT出多个字段名(用逗号分隔),或使用星号表示选择所有字段例*如或SELECT employee_name,salary SELECT*子句FROM指定数据来源(通常是表名),告诉数据库从哪个表中检索数据FROM可以同时指定多个表进行联合查询例如或FROM employeesFROM employees,departments查询执行过程当执行语句时,数据库会依次处理(确定数据源)SELECT FROM→(过滤数据)(分组)(过滤分WHERE→GROUP BY→HAVING组)(投影列)(排序)(限制→SELECT→ORDER BY→LIMIT结果数量)理解这个顺序有助于编写正确的查询语句案例演练SELECT查询语句说明应用场景查询表中的获取完整客户资料SELECT*FROM customers所有列和所有行customers;只查询表中获取客户联系方式SELECT name,phone customers的和两列FROM customers;name phone查询表中不统计客户分布城市SELECT DISTINCT customers重复的值city FROMcitycustomers;姓使用关键字为列指定优化查询结果显示SELECT name AS AS名电话别名,phone ASFROM customers;在实际工作中,需要根据业务需求选择合适的查询方式使用虽然方便,但会增加网*络传输负担,影响查询效率;明确指定需要的列可以提高查询性能同时,合理使用列别名可以让结果更加直观易懂条件筛选WHERE基本条件表达式逻辑运算符子句用于过滤满足指定条件要求多个条件同时满足,如WHERE AND的行,通常放在子句之后条FROM WHEREsalary5000AND件表达式通常包含字段名、比较运算技术部department=符和比较值例如WHEREage只要求满足其中任一条件,如OR表示筛选年龄大于等于的=1818北京WHERE city=OR city=记录上海条件取反,如NOT WHERENOT已删除status=比较运算符等于,如男=WHERE gender=或不等于,如销售部!=WHERE department、、、大于、大于等于、小于、小于等于,如==WHERE price100常见用法举例WHERE1联合多个条件筛选数据2值判断NULL使用和可以组合多个条件在中,表示未知或AND ORSQL NULL进行复杂筛选例如不适用的值,需要使用特殊的SELECT*IS或运算符进FROM employeesWHERE NULLIS NOT NULL研发部行判断例如department=OR SELECT*产品部department=AND FROM customers WHERE这条语句查询查找没有登记salary10000phone IS NULL研发部或产品部中薪资超过电话号码的客户不能用等号的员工注意使用括号明进行值判断10000=NULL NULL确运算优先级3数据范围筛选使用可以简化范围查询例如BETWEEN...AND...SELECT*FROM查询价格在到products WHERE price BETWEEN100AND500100之间的产品这等价于对于日期500price=100AND price=500范围,可以使用WHERE order_date BETWEEN2023-01-01AND2023-01-31排序ORDER BY基本排序语法子句用于对查询结果进行排序,位于语句的末尾默认为升ORDER BYSELECT序排列,可选择降序例如ASC DESCSELECT*FROM students按学生成绩从高到低排序排序可以显著提高数据浏ORDER BYscore DESC览的便捷性多字段排序当需要按多个字段排序时,先按第一个字段排序,值相同的记录再按第二个字段排序,依此类推例如SELECT*FROM employees ORDER BY先按部门名称升序排序,同一部门内再按department ASC,salary DESC薪资降序排序这常用于生成层次化报表使用列位置排序也可以使用列表中的列位置(序号)进行排序,尤其是当列名较SELECT长或使用了表达式时例如SELECT name,birth_year,2023-按计算出的birth_year ASage FROMpeople ORDER BY3DESC年龄降序排序但这种方法可读性较差,不推荐在生产环境使用去重查询DISTINCT关键字用于消除查询结果中的重复行,确保结果集中的每一行都是唯一的它放在关键字之后,作用于后面指定的所有列例如DISTINCT SELECT查询公司中所有不重复的部门名称SELECT DISTINCTdepartment FROM employees当应用于多个列时,它会将这些列的组合值视为一个整体来判断重复例如将返DISTINCT SELECT DISTINCT city,province FROMaddresses回不同的城市和省份组合会增加查询处理开销,因为数据库需要进行额外的排序和比较操作,在大型表中应谨慎使用DISTINCT限制与分页LIMIT基本用法LIMIT限制返回指定数量的记录分页查询结合偏移量实现数据分页展示性能优化减少数据传输量提高查询速度子句用于限制查询结果的行数,通常用于分页显示或获取前条记录基本语法为偏移量行数例如LIMIT NLIMIT[,]SELECT*查询价格最高的个产品FROM productsORDER BYprice DESC LIMIT1010在实现分页功能时,可以结合偏移量使用表示跳过前条记录,获取第条记录SELECT*FROM articlesLIMIT20,102021-30(第页,每页条)计算公式页码每页条数每页条数需要注意的是,当偏移量很大时,查询性能会下降310LIMIT-1*,插入数据INSERT准备插入确定目标表和待插入字段指定数据提供对应字段的具体值执行插入系统校验并写入数据确认结果返回操作状态或影响行数语句用于向表中添加新行数据基本语法为表名列列INSERT INTOINSERT INTO1,2,...值值例如VALUES1,2,...INSERT INTOcustomers name,email,phone VALUES张三,zhangsan@example.com,13812345678当需要一次插入多行数据时,可以使用产INSERT INTOproducts name,price VALUES品产品产品这种批量插入方式比多次执行单行插入效率更高A,
99.9,B,
199.9,C,
299.9对于自增主键字段或有默认值的字段,可以在插入时省略,系统会自动填充插入数据案例分析插入方式示例说明SQL完整插入按表结构顺序提供所有字段值INSERT INTOusers李明男VALUES1,,28,北京,;指定字段插入只提供部分字段值,其他使用INSERT INTOusers默认值name,age,city VALUES王芳上海,25,;批量插入一次插入多条记录,提高效率INSERT INTOlogsaction,time VALUES登录查询,NOW,,退出NOW,,NOW;查询结果插入将查询结果直接插入到另一个INSERT INTO表report_users SELECT id,name,city FROMusersWHERE age30;在实际应用中,语句的字段顺序可以灵活调整,只要与中的值一一对应即可强烈建议INSERT VALUES始终显式指定字段名,这样可以避免因表结构变化(如增加新字段)导致的插入错误当插入失败时,可能是因为违反了字段约束(如唯一性、非空等)或数据类型不匹配更新数据UPDATE定位数据设置新值使用条件确定需要更新的记录通过子句指定要修改的字段及其新值WHERE SET验证结果执行更新确认更新操作是否成功及影响的行数系统根据条件查找并修改匹配的记录语句用于修改表中已存在的数据基本语法为表名列值列值条件例如UPDATE UPDATESET1=1,2=2,...WHERE UPDATEemployees优秀给绩效优秀的员工加薪SET salary=salary*
1.1WHERE performance=10%在使用时,子句至关重要,它决定了哪些行会被更新如果省略子句,将更新表中的所有行,这可能导致灾难性后果更新操作还UPDATE WHERE WHERE可以使用表达式或函数,如减少库存并记录最后销售时间UPDATE productsSET stock=stock-1,last_sold=NOW WHERE id=101删除数据DELETE基本删除语法条件删除与全表清空表名条件使用子句可以精确控制要删DELETE FROMWHEREWHERE除的记录范围如果省略条WHERE例如DELETE FROM customers件,将删除表中所有数据建议在执WHERE last_order_date行大规模删除前,先使用进SELECT删除一年多没有下2020-01-01行验证SELECT*FROM table单的客户记录语句从表中DELETE确认筛选条件正确WHERE...移除满足条件的行,操作不可逆,应谨慎使用与区别DELETE TRUNCATE是操作,逐行删除数据,可回滚,保留表结构和索引;DELETE DML是操作,一次性清空表,不可回滚,重置自增计数器,处理大TRUNCATE DDL表时效率更高根据需求选择合适的方式创建表CREATE TABLE语句用于创建新的数据表基本语法为表名列名数据类型约束列名数据类型约束例如CREATE TABLECREATE TABLE11[],22[],...CREATE TABLEstudentsid INTPRIMARY KEYAUTO_INCREMENT,name VARCHAR50NOT NULL,age INTCHECK age0,genderCHAR1,class VARCHAR20,enrollment_date DATEDEFAULT CURRENT_DATE;常用的数据类型包括整型、字符串、日期时间、小数等定义主键,INT/BIGINT VARCHAR/TEXT DATE/DATETIME DECIMALPRIMARY KEY设置自动递增,确保字段不为空,设置默认值表名和字段名应使用有意义的名称,遵循命名规范AUTO_INCREMENT NOT NULL DEFAULT字段约束和数据完整性约束NOT NULL确保字段值不能为,强制要求必须提供值例如NULL nameVARCHAR100NOT表示姓名字段必须有值这有助于保证数据的完整性和有效性,防止出现无意义的空NULL记录约束UNIQUE保证字段在表中所有行中的值都是唯一的例如确保不email VARCHAR50UNIQUE会有两个用户使用相同的电子邮件地址可以对多个字段组合实施唯一约束UNIQUEdepartment_id,employee_id约束DEFAULT为字段设置默认值,当插入新行时如果未指定该字段的值,将使用默认值例如status正常或VARCHAR20DEFAULTregistration_date DATEDEFAULT自动记录注册日期CURRENT_DATE约束CHECK定义字段值必须满足的条件例如确保age INTCHECK age=0AND age150年龄在合理范围内约束提供了灵活的数据验证机制,可以实现复杂的业务规则CHECK表结构修改ALTER TABLE添加字段修改字段删除字段使用子句向现有表添加使用修改字段的数使用删除不需要的字ADD COLUMNMODIFY COLUMNDROP COLUMN新字段据类型或约束段ALTER TABLE employees ADDALTER TABLEproducts MODIFYALTER TABLEcustomers DROPCOLUMNemail VARCHAR100;COLUMN price DECIMAL10,2COLUMN fax;NOTNULL;也可以指定新字段的位置在生产环境中删除字段前应谨慎评估影使用可以同时修改响,确保没有依赖该字段的代码或查CHANGE COLUMNALTER TABLEemployeesADD字段名和定义询COLUMN birth_date DATEAFTERname;ALTER TABLEusers CHANGECOLUMNuser_name usernameVARCHAR50;与表操作DROP TRUNCATE使用场景比较DROP TABLETRUNCATETABLE完全删除表结构和数用于完全移除不DROP据,不可恢复语法保留表结构但删除所有再需要的表;数据,重置自增计数用于清空DROP TABLE[IF TRUNCATE表名使用器语法表数据但保留结构;而EXISTS]IF可避免表不存EXISTS TRUNCATETABLE DELETEWITH在时产生错误删除表名执行速度快于则用于有选择WHERE后,表的定义、索引、,尤其是对大地删除部分数据根据DELETE权限全部消失,需重新表操作不记录在事务需求选择合适的操作,创建才能使用在开发日志中,通常不能回权衡效率和风险在操环境可用于快速重建表滚适用于需要清空表作前备份数据是良好实结构但保留结构的场景,如践测试数据重置单行函数与表达式字符串函数日期时间函数数值与转换函数连接字符串当前日期和时间四舍五入CONCATs1,s2,...:NOW:ROUND:例例例CONCATfirst_name,,INSERT INTOlogs VALUESROUNDprice*
0.9,2AS系统启动last_name ASfull_name NOW,discount_price转换大小写格式化日期处理值UPPERs/LOWERs:DATE_FORMAT:IFNULL:NULL例例例暂无评论UPPERemail=DATE_FORMATbirth_date,%Y IFNULLcomment,年月日TEST@EXAMPLE.COM%m%dAS display_comment返回字符串长度计算日期差类型转换LENGTHs:DATEDIFF:CAST:例例例LENGTHphone11DATEDIFFend_date,CAST2023-01-01AS DATEstart_date ASdays多行函数与聚合运算COUNT SUM行数统计求和计算符合条件的行数统计所有行,只统计非值例计算指定列的数值总和例计算订单总金额只适用于数值类型字COUNT*COUNTcolumn NULLSUMorder_amount计算不同部门数量段COUNTDISTINCT departmentAVGMAX/MIN平均值最大最小值/计算指定列的平均值例计算平均评分值会被忽略,不参与计算查找列中的最大或最小值例找出最贵商品适用于数字、日期甚至字符串按AVGrating NULLMAXprice字母顺序聚合函数通常与一起使用,对数据进行分组统计例如GROUP BYSELECT department,COUNT*AS employee_count,AVGsalary ASavg_salary FROM employees GROUP按部门统计员工数和平均薪资BY department分组查询GROUP BY多表连接基础JOIN内连接INNER JOIN只返回两表中匹配的行左连接LEFT JOIN返回左表所有行,右表不匹配则为NULL右连接RIGHT JOIN返回右表所有行,左表不匹配则为NULL全连接FULL JOIN返回所有行,不匹配则对应表为NULL子句用于基于相关字段的关系将多个表中的行组合起来最常用的是内连接,它只返回在两个表中都有匹配的行语法为列列JOIN INNERJOIN SELECTa.1,b.表表关联字段关联字段例如2FROM1a INNERJOIN2b ON a.=b.SELECT orders.order_id,customers.name FROM orders INNERJOIN将订单与客户信息关联customers ONorders.customer_id=customers.id左连接保留左表的所有行,即使在右表中没有匹配项这对于查找缺失的关联特别有用,如查询没有订单的客户LEFT JOINSELECT customers.name,orders.order_id FROMcustomers LEFT JOIN ordersON customers.id=orders.customer_id WHEREorders.order_id IS NULL连接查询典型应用主表与明细表关联SELECT c.name,o.order_date,o.total_amount FROMcustomers cJOIN orders o ON c.id=o.customer_id WHEREo.order_date=2023-01-01ORDER BYo.order_date DESC;常用于订单系统,将客户信息与其对应的订单记录关联,生成包含客户姓名和订单详情的完整报表多表复合查询SELECT p.name AS product_name,c.name AScategory,s.quantity,s.date FROM products pJOIN categoriesc ONp.category_id=c.id JOINsales sONp.id=s.product_id WHEREs.date BETWEEN2023-01-01AND2023-03-31;将产品、类别和销售记录三表关联,获取产品销售情况及其所属类别,适用于销售分析报告查找缺失关联SELECT e.name,e.department,p.project_name FROM employees eLEFT JOINproject_assignments paON e.id=pa.employee_id LEFTJOIN projectspON pa.project_id=p.id WHEREp.id ISNULL;查找未分配项目的员工,通过左连接保留左表所有记录,然后筛选出关联表中对应字段为的记录NULL子查询()用法Subquery基本子查询结构和用法IN EXISTS子查询是嵌套在另一个查询内部的语句,操作符用于在子查询返回的结果集中查找匹配SELECT IN可以出现在、、或SELECT FROMWHERE子句中例如HAVINGSELECT name FROMcustomers WHERESELECT name,salary FROM employees id IN SELECTDISTINCTcustomer_idWHERE salarySELECT AVGsalary FROM orders WHERE amount1000FROM employees用于检查子查询是否返回任何行,常用EXISTS此查询找出薪资高于公司平均水平的员工子查于关联子查询询必须放在括号中,可以返回单值、单列多值或SELECT nameFROM departments d多列多值WHERE EXISTSSELECT1FROMemployees eWHERE e.department_id=d.id ANDe.salary10000子查询与连接比较连接操作直接合并多个表的行,通常更高效子查询则更直观,尤其适合复杂条件查询例如,查找有高价值订单的客户可以用连接SELECTDISTINCTc.nameFROMcustomers cJOIN orderso ONc.id=o.customer_idWHERE o.amount1000或用子查询实现相同功能选择哪种方法取决于查询的复杂性和个人偏好复杂子查询实例标量子查询返回单个值的子查询,可以在表达式中使用SELECT name,salary,SELECT AVGsalary FROMemployeesAS company_avg,salary-SELECT AVGsalaryFROMemployeesAS diffFROMemployeesORDER BYdiffDESC;这个查询计算每个员工的薪资与公司平均水平的差异相关子查询引用外部查询列的子查询,每行执行一次SELECT d.name ASdepartment,e.name ASemployee,e.salary FROMdepartmentsd JOINemployees eON d.id=e.department_id WHEREe.salary=SELECT MAXsalaryFROMemployeesWHERE department_id=d.id;找出每个部门薪资最高的员工多层嵌套子查询子查询中再包含子查询SELECT nameFROM productsWHERE category_idINSELECT idFROMcategories WHEREparent_id=SELECT idFROM categoriesWHERE name=电子产品;查找电子产品类别的所有子类别中的产品视图()概念View视图定义与创建视图的优势可更新视图视图是基于一个或多个表的预定义查简化复杂查询将常用的复杂查询保存某些视图支持通过、INSERT UPDATE询,表现为一个虚拟表创建语法为视图,提高代码可读性和复用性和操作更新数据,前提是DELETE视图名CREATE VIEWAS SELECT增强数据安全限制对敏感数据的访视图只基于单个表
1.语句例如问,如只显示员工部分信息不包含聚合函数、、
2.DISTINCTCREATE VIEWemployee_details等CREATE VIEWGROUP BYASSELECT e.id,e.name,e.salary,public_employee_info ASSELECTd.nameASdepartment FROM包含表的主键
3.id,name,department FROMemployees e JOINdepartmentsd对于不满足条件的视图,可以使用触发employees;ON e.department_id=d.id;提供数据抽象层隐藏底层表结构,在器或触发器实现更新功INSTEAD OF表结构变更时保持应用程序接口稳定创建后可以像表一样查询能SELECT*FROMemployee_details WHEREsalary10000;索引()简介Index索引作用索引类似于书籍的目录,帮助数据库系统快速定位数据,而不需要扫描整个表适当的索引可以显著提高查询性能,尤其对大型表和频繁查询的列但过多索引会增加存储空间并降低数据修改操作的性能索引类型主要索引类型包括索引(最常用,适合等值和范围查询)、哈希索引(只适合等值查询,速度快)、全文索引(用于文本搜索)和空间索引(用于地理数据)不同数B-Tree据库系统支持的索引类型可能有所不同创建与管理创建索引CREATE INDEX idx_name ONtable_namecolumn1,column2;创建唯一索引CREATE UNIQUEINDEX idx_email ONusersemail;删除索引DROP INDEXidx_name ONtable_name;查看表索引语法SHOW INDEXFROM table_name;MySQL权限与用户管理权限类型说明适用场景允许查询表中的数据只读用户,报表查询SELECT允许添加修改删除数据数据录入员,应用程序INSERT/UPDATE/DEL//ETE允许创建修改删除数据数据库管理员,开发人员CREATE/ALTER/DROP//库对象允许授予权限给其他用户管理员,安全负责人GRANT用户创建与授权是数据库安全管理的核心创建新用户CREATE USER其中指定允许连接的主机,可以是username@host IDENTIFIEDBY password;host具体、通配符或IP localhost授予权限权限列表数据库表例如GRANT ON.TO username@host;GRANT授予人力资源人员查询SELECT,INSERT ONcompany.employees TOhr_staff@%;和添加员工记录的权限回收权限权限列表数据库表REVOKE ON.FROM应遵循最小权限原则,只授予用户完成工作所需的最小权限username@host;事务()基本概念Transaction原子性一致性Atomicity Consistency事务是不可分割的工作单位,要么全部执行,事务执行前后,数据库从一个一致状态转变要么全部不执行为另一个一致状态持久性隔离性Durability Isolation事务一旦提交,其结果就是永久性的,即使多个事务并发执行时,一个事务的执行不应系统发生故障也不会丢失影响其他事务事务用于确保数据库操作的完整性和一致性,尤其在涉及多表或多步骤操作时基本事务控制语句包括或(开BEGIN STARTTRANSACTION始事务)、(提交事务)和(回滚事务)例如转账操作COMMIT ROLLBACKBEGIN;UPDATE accountsSET balance=balance-1000WHERE id=1;UPDATE accountsSET balance=balance+1000错误WHEREid=2;IF THENROLLBACK;ELSE COMMIT;END IF;错误处理与调试常见错误类型调试技巧SQL语法错误关键字拼写错误、缺少括号分解复杂查询将大型查询分解为小部或分号等如分单独测试SELECT*FORM(正确应为)users FROM使用分析EXPLAIN EXPLAIN逻辑错误条件不正确、查看查询执行计划,找出性JOIN SELECT...条件过滤不当、聚合函数使用能瓶颈WHERE不当等增量构建从简单查询开始,逐步添加权限错误没有表的操作权限报错条件和表,确保每一步都正确如Access deniedfor user...查看最后一个错误某些系统支持查询数据类型错误尝试插入不兼容的数据错误信息,如的MySQL SHOW类型如将字符串插入数字字段ERRORS调试工具数据库客户端工具通常提供语法高亮、代码提示和错误标记功能查询日志可记录慢查询或错误,帮助定位问题利用语句验证子查询或表达式的中间结果SELECT使用注释暂时禁用查询的某些部分,进行问题隔离数据批量导入与导出准备数据导入数据数据处理导出结果组织源数据为或格使用专用命令将数据批量导验证、清洗和转换已导入的将处理后的数据导出为所需CSV SQL式入数据库数据格式数据导入中可使用命令从文件批量导入数据语法MySQL LOADDATA INFILECSVLOAD DATAINFILE data.csv INTOTABLE target_table FIELDSTERMINATED BY,ENCLOSED BYLINESTERMINATED BY\n IGNORE1LINES;数据导出使用将查询结果导出到文件语法SELECT...INTO OUTFILESELECT id,name,email INTOOUTFILE/tmp/users.csv FIELDSTERMINATED BY,ENCLOSED BYLINESTERMINATED BY\n FROMusers;脚本与自动化SQL创建脚本SQL将常用查询保存为文件,包含注释和错误处理.sql批处理执行使用命令行工具批量运行语句集合SQL定时调度设置系统任务定期自动执行脚本SQL脚本是包含一系列命令的文本文件,可以批量执行以完成复杂任务创建脚本时,应添加清晰的注释说明脚本目的和各部分功能,使用变SQL SQL量简化参数传递,并包含错误处理逻辑批量执行示例将脚本执行结果保存到日志文件mysql-u username-p database_namescript.sqloutput.log定时任务示例使用操作系统的调度工具(如的、的计划任务)定期执行数据备份、报表生成等操作例如,下每天凌Linux cronWindows Linux晨点运行数据库备份密码202***/usr/bin/mysqldump-u root-p database/backup/db_$date+\%Y\%m\%d.sql实用案例订单数据分析SQL1实用案例考勤管理SQL285%
92.5%5平均出勤率研发部出勤率异常考勤数全公司上月平均考勤率表现最好的部门需要人工审核的记录案例统计员工月度出勤情况1SELECT e.id,e.name,e.department,COUNTDISTINCT DATEa.checkin_time ASdays_present,COUNTDISTINCTDATEa.checkin_time/
22.0*100AS attendance_rate FROMemployees eLEFTJOINattendance aON e.id=a.employee_idWHERE a.checkin_time BETWEEN2023-01-01AND2023-01-31GROUP BYe.id,e.name,e.department ORDER BYattendance_rate DESC;案例检测异常打卡记录2SELECT e.name,a.checkin_time,a.checkout_time,TIMESTAMPDIFFHOUR,a.checkin_time,a.checkout_time ASwork_hoursFROM attendancea JOINemployeeseONa.employee_id=e.id WHEREa.checkin_time2023-01-01AND a.checkin_time10:00:00OR a.checkout_time17:00:00OR TIMESTAMPDIFFHOUR,a.checkin_time,a.checkout_time8ORDER BYa.checkin_time;实用案例客户去重与数据清洗SQL3客户数据去重数据归一化处理地址数据清洗找出并合并重复客户记录标准化电话号码格式统一省市区格式步骤找出可能的重复记录--1SELECT UPDATE customers SETphone=UPDATEcustomersSET address=c
1.id,c
1.name,c
1.email,c
1.phone,CONCAT REPLACEREPLACEREPLACE省省市市区区c
2.id,c
2.name,c
2.email,c
2.phone SUBSTRINGREPLACEREPLACEREPaddress,,|,,|,,|省FROMcustomersc1JOIN customersLACEphone,-,,,,+86,,WHERE address LIKE%%OR市c2ONc
1.idc
2.id ANDc
1.email=1,3,-,addressLIKE%%OR addressLIKE区c
2.email ORc
1.phone=c
2.phone ORSUBSTRINGREPLACEREPLACEREP%%;然后可以用提取--SUBSTRING_INDEXSOUNDEXc
1.name=LACEphone,-,,,,+86,,各部分SELECTSOUNDEXc
2.name ORDER BY4,4,-,SUBSTRING_INDEXaddress,|,1ASc
1.email,c
1.phone;SUBSTRINGREPLACEREPLACEREPprovince,LACEphone,-,,,,+86,,SUBSTRING_INDEXSUBSTRING_IND8WHERE phoneIS NOTNULL;EXaddress,|,2,|,-1AS cityFROMcustomers;性能优化入门查询优化编写高效语句是性能优化的基础SQL索引优化为常用查询条件创建合适的索引数据库配置调整数据库服务器参数以优化性能表结构设计良好的数据库设计是性能的根本保障查询优化基本方法只查询需要的列,避免;限制结果集大小,使用;优化条件,将过滤性强的条件放在前面;避免在1SELECT*2LIMIT3WHERE4查询中使用函数处理索引列,如应改为WHERE YEARdate_column=2023WHERE date_column BETWEEN2023-01-01AND2023-12-31索引优化常见思路为子句中经常出现的列创建索引;为操作中的关联字段创建索引;考虑创建联合索引覆盖常见查询;定期分析1WHERE2JOIN34和重建索引以保持效率使用命令可以查看执行计划,了解索引使用情况和潜在问题EXPLAIN SQL调优典型案例SQL优化前优化后改进说明只选择必要的列,减少数据传输量SELECT*FROMordersWHERE create_timeSELECTid,customer_id,amount FROMorders2023-01-01WHERE create_time2023-01-01使用全文索引替代前置通配符SELECT*FROM productsWHERE nameLIKE%SELECT*FROM productsWHERE MATCHnameLIKE手机手机%AGAINST使用标准语法并指定具体列SELECT c.name,o.*FROMcustomersc,ordersoSELECT c.name,o.id,o.amount FROMcustomers JOINWHEREc.id=o.customer_id cJOIN orderso ONc.id=o.customer_id慢查询定位使用数据库提供的慢查询日志功能,记录执行时间超过阈值的查询如设置然后MySQL SET GLOBAL slow_query_log=1;SETGLOBALlong_query_time=1;分析文件找出性能瓶颈slow_query_log索引失效常见原因在索引列上使用函数或计算;使用不等于操作符(、);使用连接多个条件;使用前置通配符优化方法包括重写查询或调整索引12!=3OR4LIKE%abc策略通过对比执行计划中的和等指标,可以量化优化效果EXPLAIN rowstype常用开发工具SQLMySQL Workbench官方提供的图形界面工具,功能全面,包括数据库设计、开发、管理和维护提供图可视化设计、编辑器、服务器管理等功能适合数据库的专业开MySQL ERSQL MySQL发人员使用界面设计合理,但学习曲线相对陡峭DBeaver开源的通用数据库工具,支持几乎所有主流数据库系统,包括、、、等提供统一的界面操作不同数据库,具有强大的编辑MySQL PostgreSQLOracle SQLServer SQL器、数据导出导入功能支持插件扩展,适合需要同时使用多种数据库的开发者Navicat商业数据库管理工具,界面美观、操作简单,适合初学者提供数据库连接、查询、设计、导入导出等全套功能有针对不同数据库的专版和全功能的版本具有Premium数据同步、模型设计、自动完成等高级功能,但需要付费使用常见问题答疑SQL值处理使用误区NULL GROUP BY问题为什么问题为什么中的非聚合列必WHERE column=SELECT不起作用?须在中出现?NULL GROUP BY解答表示未知,不能用等号解答这是标准要求,确保结果集NULLSQL比较应使用或中每一行都有确定的值例如ISNULLIS NOT运算符例如NULL WHEREemail SELECTdepartment,name,查找没有电子邮件的用户ISNULLAVGsalaryFROMemployees参与的算术运算结果均为是不正确NULL GROUPBY department,使用或的,因为部门内可能有多个值NULL IFNULLname函数处理空值正确方式是将加入COALESCE nameGROUP,或只查询聚合值BY与子查询选择JOIN问题什么情况下应该使用,什么情况下用子查询?JOIN解答通常更适合关联多表数据展示;子查询适合作为条件筛选或派生表大多数JOIN可以用子查询改写,反之亦然,但通常性能更好,尤其是对大数据集具体选JOIN JOIN择取决于查询复杂度、可读性和实际性能测试练习题基础数据查询1题目要点查询表中价格在元之间的所有产品信息,按价格升序排列条件范围、products100-500WHERE ORDER BY查询表中所有北京、上海和广州的客户姓名和电话,结果按城市名排多条件、运算符customers ORIN序查询表中年月的所有订单,显示订单、日期和金额日期函数、范围查询orders20231ID查询表中薪资前名的员工信息,包括姓名、部门和薪资、employees10ORDERBYLIMIT查询表中每个类别的产品数量,只显示数量超过个的类别、products5GROUPBYHAVING参考答案
1.SELECT*FROMproductsWHEREpriceBETWEEN100AND500ORDERBYprice ASC;北京上海广州
2.SELECT name,phone FROMcustomersWHEREcity IN,,ORDERBYcity;
3.SELECTid,order_date,amount FROMordersWHEREorder_date BETWEEN2023-01-01AND2023-01-31;
4.SELECT name,department,salaryFROMemployeesORDERBY salaryDESCLIMIT10;
5.SELECT category,COUNT*ASproduct_count FROMproducts GROUPBY categoryHAVING COUNT*5;练习题表结构操作2创建图书管理表创建一个表,包含(主键自增)、(书名,不可为空)、(作者)、(价格,有默认值)、(出版日期)和books idtitle authorprice publish_date(分类)字段category添加与修改字段为表添加一个字段,用于标记图书状态(已借出可借阅),默认值为可借阅然后修改字段为类型books status/priceDECIMAL10,2创建索引和约束为字段创建全文索引以支持搜索功能为字段添加约束,确保价格大于为字段创建普通索引以加速分类查询title priceCHECK0category参考答案
1.CREATETABLEbooksid INTPRIMARY KEYAUTO_INCREMENT,title VARCHAR100NOTNULL,author VARCHAR50,priceDECIMAL10,2DEFAULT
0.00,publish_date DATE,category VARCHAR50;可借阅
2.ALTER TABLEbooks ADDCOLUMN statusVARCHAR20DEFAULT;ALTER TABLEbooks MODIFYCOLUMN priceDECIMAL10,2;
3.CREATE FULLTEXTINDEXidx_title ONbookstitle;ALTERTABLEbooks ADDCONSTRAINT chk_price CHECKprice0;CREATE INDEXidx_category ONbookscategory;练习题综合数据分析3拓展阅读与学习资源经典教材推荐《基础教程》适合零基础入门;《进阶教程》深入讲解复杂查询和优化;《高性能》是进阶必读书籍,详细介绍SQL SQL SQL MySQLMySQL性能优化;《编程艺术》注重编程思想和最佳实践SQL SQL在线学习资源教程提供中文基础教程;菜鸟教程有丰富的实例;博客平台包含大量技术W3School SQLw3school.com.cn runoob.com SQLCSDN SQL文章和问题解答;各主流数据库官方文档,如文档、文档等,提供最权威的参考资料MySQL dev.mysql.com/doc/Oracle docs.oracle.com培训小结与答疑数据操作结构定义、、等数、INSERT UPDATEDELETE CREATETABLE ALTERTABLE据修改语句,掌握增删改基本操作等表结构操作,能够创建和修改数据数据查询理解事务概念,确保数据操作的安全表了解字段类型选择和约束条件设性和一致性置的基本原则、、、SELECT WHEREORDERBY多表关联等基础查询语法,构成日GROUPBY常数据分析的核心能熟练编写简单各种操作和子查询技术,实现复JOIN查询,使用条件筛选、排序和分组聚杂数据关联分析理解表之间的关合系,能够设计和查询关联数据在本次培训中,我们系统学习了的基础知识和实用技能从语言基础到复杂查询,从数据操作到性能优化,建立了完整的技能框架这些技能将帮助你在工SQLSQL作中更高效地处理数据,提升数据分析能力感谢参与与后续建议进阶学习路径实践应用案例深入学习高级技术,如窗口函数、递归查询、巩固基础知识SQL将所学知识应用到实际工作中,尝试优化现有查询存储过程等探索特定数据库系统的专有功能,如定期复习本次培训内容,练习基本SQL语句建议从小型项目开始,设计自己的数据库并实现完整功MySQL的InnoDB引擎特性了解数据库性能优每天花分钟编写简单查询,使语法和概念能参与开源项目或在上分享你的解化、索引设计和查询优化的进阶技巧考虑参加数15-30GitHub SQL融入日常思维使用在线练习平台如LeetCode的决方案,获取反馈和建议实践是最有效的学习方据库认证考试,如Oracle、Microsoft或MySQL专题或进行实战训练,从简单到式的官方认证SQL HackerRank复杂逐步提升恭喜你完成初级技能培训!希望这次学习对你有所帮助接下来,我们将推出进阶课程,内容包括复杂查询技术、性能优化实战、存储过程与触发器SQLSQL等高级主题敬请关注我们的后续培训安排,期待与你在数据世界的探索之旅中再次相会!。
个人认证
优秀文档
获得点赞 0