SQL(结构化查询语言)是具有数据操纵和数据定义等多种功能的数据库语言,这种语言具有交互性特点,能为用户提供极大的便利,数据库管理系统应充分利用SQL语言提高计算机应用系统的工作质量与效率。SQL语言不仅能独立应用于终端,还可以作为子语言为其他程序设计提供有效助力,该程序应用中,SQL可与其他程序语言一起优化程序功能,进而为用户提供更多更全面的信息。
增删改查是一个数据操作工具最基本的命令,在SQL中,这四种语句主要由以下关键字语句执行:
增:insert
删:delete
改:update
查:select
(这里我用S,SC,C三个表来演示。)
(注意:分号是在数据库系统中分隔每条 SQL 语句的标准方法,这样就可以在对服务器的相同请求中执行一条以上的 SQL 语句。)
增:insert into 语句
功能:用于向表中插入新记录,可以是一行,也可以是多行。
单行增加语句(方法一)
INSERT INTO 表名(,column2,column3,...)
VALUES (value1,value2,value3,...);
如:
insert into Students (姓名,性别,出生日期)
values ('张三','男','2023/10/3');
注:字段可以缺少,值必须一一对应-—为默认值时:default,为空时:null
单行增加语句(方法二)
INSERT INTO 表名
VALUES (value1,value2,value3,...);
注:字段不填,但是值必须全部填充并一一对应。
另一种使用:使用insert,select语句将现有表中的 数据添加到已有的新表中
insert into <已有的新表> <列名>
select <原表列名>
from <原表名>
例:insert into addressList ('姓名','地址','电子邮件')
select name,address,email
from Strdents;
注意:查询得到的数据个数、顺序、数据类型等,必须与插入的项保持一致
删:DELETE语句
功能:DELETE 语句用于删除表中的行。
SQL DELETE 语法
DELETE
FROM
table_name
WHERE
some_column=some_value;
方法一:
delete from表名
where 字段名=‘值’;
方法二 :清理表所有数据(不加条件)
delete from表名;
基本不用(截断数据,没有日志,无法回滚,不能加条件)
truncate table表名;
查:SELECT语句
(*代替表示所有列)
DISTINCT短语:去掉重复的行(不使用的话,会保留重复的行)
select 语句
功能:SELECT 语句用于从数据库中选取数据。
select字段名或*
from表名
Select … where 语句
功能:SELECT语句用于从数据库中选取数据,where用于提取那些满足指定条件的记录。
select字段名或*
from表名
where字段名= ‘值’;
常用的查询条件:
排序操作:(ORDER BY)
功能:SELECT语句用于从数据库中选取数据,用于对一列或者多列数据进行升序(ASC)或者降序(DESC)排列。
SELECT column-list
FROM table_name
WHERE condition
ORDER BY column1, column2, .. columnN ASC / DESC;
聚集函数:
功能:计算表中的数据,返回单个计算结果。
分组查询(GROUP BY)
功能:对表或视图中的查询结果按某一列或多列值分组,值相等的为一组。
如:查询各系学生人数
SELECT Sdept,COUNT(*)
学生数(别名)
FROM Student
GROUP BY Sdept;
多表查询:
等值连接前面的查询都是针对一个表进行的。若一个查询同时涉及两个以上的表,则称为连接查询。连接查询是关系数据库中最主要的查询,包括查询、自然连接查询、非等值连接查询、自身连接查询、外连接查询和复合条件连接查询等。
等值与非等值连接查询
可以在 SELECT 语句的 WHERE子句中使用比较运算符给出连接条件对表进行连接,其一般格式为:
[<表名1>.]列名1><比较运算符>[<表名2>.]列名2>
其中,比较运算符主要有<--.==(或<>)等。当比较运算符为“=”时,称为等值连接;否则称为非等值连接。当等值连接字段相同,并且在 SELECT子句中去除重复字段时,则称为自然连接
自然连接查询例子:
SELECT Student.*,SC.cno,SC.Grade
FROM Student,SC
WHERE Student.Sno = SC.Sno;
自身连接查询:
一个表与其自身连接,这种连接叫自连接。
功能:在一个表中查找有相同列值的行信息。
在进行自连接时需为要连接的表指定两个别名,同时对所有列的引用均要使用表的别名来限定。
自连接例子:杳询不同课程成绩相同的学生的学号、课程号和成绩
SELECT a.Sno,a.Cno,b.Cno,a .Grade
FROM SC a,SC b
where a.Grade = b.Grade AND a.Sno=b.Sno AND a.cno = b.cno;
外连接
在前面的连接示例中,结果集中只保留符合连接条件的元组,这种连接称为内连接
在有些情况下,连接的结果不但需要包含满足条件的元组,还包含不满足条件的元组,实现这种杳询的连接称为外连接。
外连接有两种类型:
左外连接:查询结果不但包含满足连接条件的元组还包含连接时左表中的所有元组。
右外连接:查询结果不但包含满足连接条件的元组还包含连接时右表中的所有元组。
外连接中不匹配的分量用NULL 表示。外连接的语法格式为:
<表名>LEFT| RIGHT [OUT] JOIN<表名>ON<连接条件>
其中,表名为需连接的表,LEFT [OUT]JOIN称为左外连接,RIGHT[OUT]JOIN称为右外连接。
集合查询:
每一个 SELEC1语句都能获得一个或一组元组,若要把多个 SELECT 语句的结果合并为一个结果,可用集合操作来完成。集合操作主要包括并操作UNION、交操作INTERSECT和差操作EXCEPT。其语法格式为:
<SELECT语句> UNION[ALL] |INTERSECT |EXCEPT< SELECT语句>;
其中,关键字ALL表示合并的结果中包含所有行,重复的行不删除;不使用ALL则表示在合并时相同的行要删除。需要注意的是,集合查询的各查询结果的列数必须相同,对应列的数据类型也必须相同。
嵌套查询:
在sQL语言中,一个SELECT FROM-WHERE语句称为一个查询块。将一个查询块嵌套在另一个查询块的WHERE子句或HAVING子句中的查询称为嵌套查询。上层的查询块称为父查询或外层查询,下层查询块称为子查询或内查询。SQL语言允许多层嵌套查询,即一个子查询中还可以嵌套其他子查询,表示复杂的查询。需要特别指出的是,子查询的SELECT语句中不能使用ORDER BY子句、ORDER BY子句只能对最终查询结果排序
使有IN谓词的子查询
带有IN谓词的子查询是指父在询与子查询之间用IN进行连接.判断某个属件列值是否在子查询的结果中
查询选修了 01号课程的学生的信息:
SELECT *
FROM Student
WHERE Sno IN
(SELECT Sno FROM SC WHERE Cno= 01');
系统在执行该查询时,先执行子查询,然后在子查询产生的结果表中,再执行父查询。在本例中,系统先执行子查询:
SELECT Sno FROM SC WHERE Cno= '01';
使有比较运算符的子查询
带有比较运算符的子查询是指父查询与子查询之间用比较运算符进行连接。IN谓词用于一个值对多 个值的比较,而比较运算符用于一一个值与另一个值的比较。当用户能确切知道子查询返回的结果是单值时,可以使用<、<=、>、>=、二、!=或<>等比较运算符。
查询01号课程的成绩高于“李强”的学生的学号:
SELECT Sno
FROM SC
WHERE Cno= ‘01'
AND Grade>(SELECT Grade FROM SC WHERE Cno= '01’
AND Sno= (SELECT Sno FROM Student WHERE Sname= '李强'));
本例是首先查找“李强”的学号,然后根据学号在SC表查找“李强”的01号课程的成绩,再根据成绩查找01号课程成绩高于这个成绩的学号。
3.带有ANY或ALL谓词的子查询
子查询返回单值时可以用比较运算符,但返回多值时要用ANY或ALL谓词。使用ANY或ALL谓词时必须与比较运算符配合使用。其语义如下表所示。
使有EXISTS谓词的子查询
EXISTS代表存在量词,带有EXISTS谓词的子查询不返回任何实际数据,只产生逻辑真值TRUE或逻辑假值FALSE
查询选修了02号课程的学生姓名:
SELECT Sname
FROM Student
WHERE EXISTS (SELECT兴FROM SC WHERE Student. Sno SC. Sno AND Cno= '02');
改:update语句
功能:更新表中原有数据。
条件修改字段值:
update表名
set字段名1= ‘值1'
where字段名2= ‘值2';
修改字段所有值:
update表名
set字段名=‘值';