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

下载本文档

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

文档简介

SQL语句大全及实例说明:本文所有实例基于以下3张测试表(MySQL环境,兼容主流数据库,差异处会标注),表结构及测试数据如下,后续实例均围绕这3张表展开,便于理解和复用。测试表结构及测试数据1.员工表(employee)字段名字段类型说明emp_idint(11)主键员工ID(唯一标识)emp_namevarchar(50)非空员工姓名dept_idint(11)部门ID(关联部门表)salarydecimal(10,2)月薪hire_datedate入职日期genderchar(1)性别(男/女)测试数据插入语句:sql

INSERTINTOemployee(emp_id,emp_name,dept_id,salary,hire_date,gender)

VALUES

(1,'张三',1,8000.00,'2020-01-15','男'),

(2,'李四',1,7500.00,'2020-03-20','女'),

(3,'王五',2,9000.00,'2019-11-05','男'),

(4,'赵六',3,6000.00,'2021-05-10','男'),

(5,'孙七',2,8500.00,'2020-07-28','女'),

(6,'周八',3,7200.00,'2021-09-01','女');2.部门表(department)字段名字段类型说明dept_idint(11)主键部门ID(唯一标识)dept_namevarchar(50)非空部门名称dept_locationvarchar(100)部门所在地测试数据插入语句:sql

INSERTINTOdepartment(dept_id,dept_name,dept_location)

VALUES

(1,'技术部','北京'),

(2,'市场部','上海'),

(3,'行政部','广州');3.工资记录表(salary_record)字段名字段类型说明record_idint(11)主键自增记录IDemp_idint(11)非空员工ID(关联员工表)salary_monthvarchar(7)非空工资月份(格式:YYYY-MM)actual_salarydecimal(10,2)非空实发工资测试数据插入语句:sql

INSERTINTOsalary_record(emp_id,salary_month,actual_salary)

VALUES

(1,'2024-01',7800.00),

(1,'2024-02',7800.00),

(2,'2024-01',7300.00),

(3,'2024-01',8800.00),

(4,'2024-02',5800.00),

(5,'2024-01',8300.00);一、基础查询语句(SELECT)核心功能:从表中查询指定数据,是SQL最常用的语句,搭配不同子句实现复杂查询。1.查询所有字段sql

--语法:SELECT*FROM表名;

SELECT*FROMemployee;--查询员工表所有字段和所有数据说明:*代表所有字段,适合快速查看表中数据,正式开发中不建议使用(字段变动会导致异常)。2.查询指定字段sql

--语法:SELECT字段1,字段2,...FROM表名;

SELECTemp_name,salary,hire_dateFROMemployee;--查询员工姓名、月薪、入职日期3.别名查询(简化字段/表名)sql

--字段别名:SELECT字段AS别名FROM表名;(AS可省略)

--表别名:SELECT表别名.字段FROM表名AS表别名;

SELECTemp_nameAS姓名,salary月薪FROMemployeee;--e是employee的别名4.去重查询(DISTINCT)sql

--语法:SELECTDISTINCT字段FROM表名;

SELECTDISTINCTdept_idFROMemployee;--查询员工表中所有不重复的部门ID5.条件查询(WHERE)sql

--语法:SELECT字段FROM表名WHERE条件;

--常用条件运算符:=、!=、>、<、>=、<=、BETWEEN...AND、IN、LIKE、ISNULL

--示例1:查询月薪大于8000的员工

SELECTemp_name,salaryFROMemployeeWHEREsalary>8000;

--示例2:查询入职日期在2020年及之后的员工

SELECTemp_name,hire_dateFROMemployeeWHEREhire_date>='2020-01-01';

--示例3:查询月薪在7000-9000之间的员工(包含边界)

SELECTemp_name,salaryFROMemployeeWHEREsalaryBETWEEN7000AND9000;

--示例4:查询部门ID为1或2的员工

SELECTemp_name,dept_idFROMemployeeWHEREdept_idIN(1,2);

--示例5:查询姓名包含“张”的员工(%匹配任意字符,_匹配单个字符)

SELECTemp_nameFROMemployeeWHEREemp_nameLIKE'%张%';

--示例6:查询性别为空的员工(注意:NULL不能用=判断,只能用ISNULL/ISNOTNULL)

SELECTemp_nameFROMemployeeWHEREgenderISNULL;6.排序查询(ORDERBY)sql

--语法:SELECT字段FROM表名ORDERBY字段1[ASC/DESC],字段2[ASC/DESC];

--ASC:升序(默认,可省略),DESC:降序

--示例1:按月薪降序查询,月薪相同按入职日期升序

SELECTemp_name,salary,hire_dateFROMemployeeORDERBYsalaryDESC,hire_dateASC;7.限制查询(LIMIT)sql

--语法(MySQL):SELECT字段FROM表名LIMIT起始索引,查询条数;(起始索引从0开始)

--语法(Oracle):使用ROWNUM,如:WHEREROWNUM<=3

--示例1:查询前3条员工数据

SELECT*FROMemployeeLIMIT0,3;--等同于LIMIT3

--示例2:查询第2条到第4条数据(索引1开始,查询3条)

SELECT*FROMemployeeLIMIT1,3;二、聚合函数查询(常用统计)核心功能:对数据进行统计分析,常用聚合函数:COUNT(计数)、SUM(求和)、AVG(平均值)、MAX(最大值)、MIN(最小值),通常搭配GROUPBY使用。1.基础聚合查询sql

--示例1:统计员工总数

SELECTCOUNT(*)AS员工总数FROMemployee;--COUNT(*)统计所有行,包含NULL

SELECTCOUNT(emp_id)AS员工总数FROMemployee;--COUNT(字段)统计非NULL行

--示例2:统计所有员工的月薪总和、平均月薪、最高月薪、最低月薪

SELECT

SUM(salary)AS月薪总和,

AVG(salary)AS平均月薪,

MAX(salary)AS最高月薪,

MIN(salary)AS最低月薪

FROMemployee;2.分组聚合(GROUPBY)sql

--语法:SELECT分组字段,聚合函数FROM表名GROUPBY分组字段;

--示例1:按部门分组,统计每个部门的员工人数和平均月薪

SELECT

dept_idAS部门ID,

COUNT(emp_id)AS员工人数,

AVG(salary)AS平均月薪

FROMemployee

GROUPBYdept_id;3.分组筛选(HAVING)sql

--语法:SELECT分组字段,聚合函数FROM表名GROUPBY分组字段HAVING聚合条件;

--注意:HAVING筛选聚合结果,WHERE筛选原始数据,HAVING必须在GROUPBY之后

--示例:按部门分组,统计平均月薪大于8000的部门

SELECT

dept_idAS部门ID,

COUNT(emp_id)AS员工人数,

AVG(salary)AS平均月薪

FROMemployee

GROUPBYdept_id

HAVINGAVG(salary)>8000;三、多表连接查询核心功能:关联多个表(通过共同字段,如dept_id、emp_id),查询跨表数据,常用连接方式:内连接、左连接、右连接、全连接。1.内连接(INNERJOIN)sql

--语法:SELECT字段FROM表1INNERJOIN表2ON表1.关联字段=表2.关联字段;

--说明:只查询两个表中关联字段匹配的记录

--示例:查询员工姓名、部门名称(关联员工表和部门表)

SELECTe.emp_nameAS员工姓名,d.dept_nameAS部门名称

FROMemployeee

INNERJOINdepartmentd

ONe.dept_id=d.dept_id;2.左连接(LEFTJOIN)sql

--语法:SELECT字段FROM表1LEFTJOIN表2ON表1.关联字段=表2.关联字段;

--说明:查询表1所有记录,表2中匹配的记录显示,不匹配的显示NULL

--示例:查询所有员工的姓名及所属部门(即使员工没有部门ID,也会显示员工信息)

SELECTe.emp_nameAS员工姓名,d.dept_nameAS部门名称

FROMemployeee

LEFTJOINdepartmentd

ONe.dept_id=d.dept_id;3.右连接(RIGHTJOIN)sql

--语法:SELECT字段FROM表1RIGHTJOIN表2ON表1.关联字段=表2.关联字段;

--说明:查询表2所有记录,表1中匹配的记录显示,不匹配的显示NULL

--示例:查询所有部门及部门下的员工(即使部门没有员工,也会显示部门信息)

SELECTd.dept_nameAS部门名称,e.emp_nameAS员工姓名

FROMemployeee

RIGHTJOINdepartmentd

ONe.dept_id=d.dept_id;4.全连接(FULLJOIN)sql

--语法:SELECT字段FROM表1FULLJOIN表2ON表1.关联字段=表2.关联字段;

--说明:查询两个表所有记录,匹配的显示对应数据,不匹配的显示NULL

--注意:MySQL不支持FULLJOIN,可通过LEFTJOIN+UNION+RIGHTJOIN实现

--示例(MySQL兼容版):查询所有员工和所有部门的关联信息

SELECTe.emp_nameAS员工姓名,d.dept_nameAS部门名称

FROMemployeee

LEFTJOINdepartmentdONe.dept_id=d.dept_id

UNION

SELECTe.emp_nameAS员工姓名,d.dept_nameAS部门名称

FROMemployeee

RIGHTJOINdepartmentdONe.dept_id=d.dept_id;四、子查询(嵌套查询)核心功能:将一个查询结果作为另一个查询的条件或数据源,分为单行子查询、多行子查询、关联子查询。1.单行子查询(返回1行1列)sql

--示例:查询月薪高于平均月薪的员工

SELECTemp_name,salaryFROMemployee

WHEREsalary>(SELECTAVG(salary)FROMemployee);2.多行子查询(返回多行1列)sql

--常用运算符:IN(在范围内)、NOTIN、ANY(任意一个)、ALL(所有)

--示例:查询技术部(dept_id=1)的所有员工信息

SELECTemp_name,salaryFROMemployee

WHEREdept_idIN(SELECTdept_idFROMdepartmentWHEREdept_name='技术部');3.关联子查询(子查询与主查询有关联)sql

--示例:查询每个部门中月薪最高的员工(按部门分组,关联子查询)

SELECTe.emp_name,e.dept_id,e.salary

FROMemployeee

WHEREe.salary=(SELECTMAX(salary)FROMemployeeWHEREdept_id=e.dept_id);五、插入语句(INSERT)核心功能:向表中插入新数据,分为插入单行、插入多行、插入查询结果。1.插入单行数据sql

--语法1:指定所有字段,按表字段顺序插入

INSERTINTOemployee(emp_id,emp_name,dept_id,salary,hire_date,gender)

VALUES(7,'吴九',2,9500.00,'2023-01-10','男');

--语法2:指定部分字段(未指定的字段需允许为NULL或有默认值)

INSERTINTOemployee(emp_name,dept_id,salary)

VALUES('郑十',1,8200.00);2.插入多行数据sql

--语法:INSERTINTO表名(字段1,字段2,...)VALUES(值1),(值2),...;

INSERTINTOemployee(emp_name,dept_id,salary,gender)

VALUES

('钱十一',3,6800.00,'女'),

('孙十二',2,8800.00,'男');3.插入查询结果sql

--语法:INSERTINTO表1(字段1,字段2,...)SELECT字段1,字段2,...FROM表2WHERE条件;

--示例:将技术部员工信息插入到临时表(假设临时表temp_emp已创建,字段与查询字段一致)

INSERTINTOtemp_emp(emp_name,salary,hire_date)

SELECTemp_name,salary,hire_dateFROMemployeeWHEREdept_id=1;六、更新语句(UPDATE)核心功能:修改表中已存在的数据,必须搭配WHERE子句(否则会修改表中所有数据,慎用)。1.基础更新sql

--语法:UPDATE表名SET字段1=值1,字段2=值2,...WHERE条件;

--示例:将员工张三(emp_id=1)的月薪调整为8500

UPDATEemployeeSETsalary=8500.00WHEREemp_id=1;2.关联更新(多表关联修改)sql

--示例:将技术部(dept_name='技术部')所有员工的月薪增加500

UPDATEemployeee

INNERJOINdepartmentdONe.dept_id=d.dept_id

SETe.salary=e.salary+500

WHEREd.dept_name='技术部';七、删除语句(DELETE)核心功能:删除表中已存在的数据,必须搭配WHERE子句(否则会删除表中所有数据,慎用),与TRUNCATE的区别:DELETE可回滚、可带条件,TRUNCATE不可回滚、删除所有数据、速度更快。1.基础删除sql

--语法:DELETEFROM表名WHERE条件;

--示例:删除员工郑十(emp_id=8)的记录

DELETEFROMemployeeWHEREemp_id=8;2.关联删除(多表关联删除)sql

--示例:删除行政部(dept_id=3)的所有员工记录

DELETEeFROMemployeee

INNERJOINdepartmentdONe.dept_id=d.dept_id

WHEREd.dept_id=3;3.清空表(TRUNCATE)sql

--语法:TRUNCATETABLE表名;

--示例:清空工资记录表(注意:会删除所有数据,不可回滚)

TRUNCATETABLEsalary_record;八、高级SQL语句(常用进阶)1.事务(TRANSACTION)sql

--语法:STARTTRANSACTION;开始事务

--执行SQL语句(INSERT/UPDATE/DELETE)

--COMMIT;提交事务(数据永久生效)

--ROLLBACK;回滚事务(数据恢复到事务开始前)

--示例:转账操作(张三给李四转500,确保两个更新同时成功或同时失败)

STARTTRANSACTION;

UPDATEemployeeSETsalary=salary-500WHEREemp_name='张三';

UPDATEemployeeSETsalary=salary+500WHEREemp_name='李四';

COMMIT;--确认无误后提交,若出错则执行ROLLBACK;2.索引(INDEX)sql

--作用:提高查询速度,常用于查询频繁的字段

--语法1:创建索引

CREATEINDEXidx_employee_salaryONemployee(salary);--给employee表的salary字段创建普通索引

CREATEUNIQUEINDEXidx_employee_empidONemployee(emp_id);--唯一索引(字段值不可重复)

--语法2:删除索引

DROPINDEXidx_employee_salaryONemployee;3.视图(VIEW)sql

--作用:简化复杂查询,将查询结果封装为“虚拟表”,不存储实际数据,只存储查询逻辑

--语法1:创建视图

CREATEVIEWview_emp_deptAS

SELECTe.emp_name,e.salary,d.dept_name,d.dept_location

FROMemployeee

INNERJOINdepartmentdONe.dept_id=d.dept_id;

--语法2:查询视图(和查询普通表一样)

SELECT*FROMview_emp_dept;

--语法3:删除视图

DROPVIEWview_emp_dept;4.存储过程(PROCEDURE)sql

--作用:封装一组SQL语句,可重复调用,提高代码复用性

--示例:创建存储过程,根据部门ID查询该部门的员工人数

DELIMITER//--临时修改语句结束符(默认;,避免存储过程中;冲突)

CREATEPROCEDUREget_dept_emp_count(INdept_idINT,OUTemp_countINT)

BEGIN

SELECTCOUNT(emp_id)INTOemp_countFROMemployeeWHEREdept_id=d

温馨提示

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

评论

0/150

提交评论