SQL数据库基础

2023-12-13 07:03:09
  1. 插入语句基本语法:insert into 表名(列名,列名) values(值,值)

2、插入多行数据在此语句中不能使用default默认关键字):

insert into 表名(列名) select 列名对应的数值

union

select 列名对应的数值

例:insert A (ID,name,sex) select? 1,’闪闪',’女’ union

????????????????????????????????????????? select? 2,’珊珊',’女’ union

????????????????????????????????????????? select? 3,’潸潸',’女’ union

???????????????????????????????????????? select? 4,’讪讪',’女’

  1. 把查询结果放到一个新表中:select......into

-将旧表中,女生的信息插入到新表中:select * into新表 from旧表 where sex=‘女’)

注:使用select......into......语句向表中添加数据时,这个表必须是原数据库中不存在的新表,否则会出现错误)

  1. 删除语句基本语法:delete from 表名 where 判断条件

  1. 删除表中所有数据

(1) delete from 表名

DELETE语句删除的是一整行数据,而不是删除某列数据,因此DELETE关键字和FROM关键字之间不能放列名

(2) truncate table 表名

执行速度更快,使用的系统资源和事务日志更少;有外键约束的数据表不能使用 truncate table

  1. 删除表:drop table 表名

更新语句基本语法:update 表名 set 列名=值 where 判断条件

在使用update修改数据时一定要注意where语句约束修改范围,当where子句省略时,则修改表中的所有行。

例:将A表中ID为1的记录的姓名改为“潸潸”—update A set name=’潸潸’ where ID=1

注:如果想修改数据表中多列的数据,可以在set子句后面跟随多个列名以及更新值,中间用逗号隔开

例:update A set name=”讪讪”,sex=’男’ where ID=1

  1. 基本查询

查询语句基本语法:select * from 表名 where 判断条件???????????????

  • 若要从一个数据库表中选取全部字段作为SELECT查询的输出字段,在SELECT 子句中使用一个“*”符号就OK,此时还必须用FROM子句来指定作为查询的数据源(表或视图)
  • 可以在SELECT 子句中给出包含所选取字段的一个列表,各个字段之间用逗号分隔,选择部分列并指定它们的显示次序。查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。
  • 在字段列表前面加上选择关键字DISTINCT可以消除查询结果中的重复记录-select distinct ID from A
  1. 设置字段别名
  1. 设置字段别名

显示选择查询的结果时,表头(第一行)中显示的是各个输出字段的名称,为方便可指定更易理解的字段名来取代原来的字段名。语法格式如下:

  1. 原字段名 AS 字段别名???????????? ——select ID as 学号from A
  2. 字段别名 = 原字段名??????? ?????? ——select 学号=ID from A
  3. 原字段名 空格 字段别名??? ?????? ——select ID 学号 from A
  1. 字段别名

使用“性别-学员姓名”格式查看数据:

Select Sex + ’-' + Name as ‘性别-学员姓名’ from A

  1. 运算符
  1. 范围运算符

范围运算符(表达式值是否在指定的范围)

  1. BETWEEN ... AND ...
  1. NOT BETWEEN ...AND ...

例:查询A表中学号在/不在2-4之间的学员信息—select * from A where StuID between/not between 2 and 4

  1. 列表运算符

列表运算符(判断表达式是否为列表中的指定项)

  1. IN(项1,项2......)? ?(IN关键字可以选择与列表中的任意值匹配的行)
  1. NOT IN(项1,项2......)

例:查询A表中学号为/不为1、3、5的学员信息—select * from A where StuID in/not in(1,3,5)

  1. 空值判断符

空值判断符(判断表达式是否为空)

  1. IS NULL
  1. IS NOT NULL

例:查询A表中ID为空的学生姓名—select name from A where ID is null

  1. 逻辑运算符

逻辑运算符(用于多条件的逻辑连接)

  1. NOT-逻辑与
  1. AND-逻辑或
  1. OR-逻辑非

逻辑运算符一般用来连接条件表达式。AND连接条件表达式,当两个条件都满足时才返回真。OR连接条件表达式,只要其中一个条件满足就返回真

例:查询A表中学员为1的学员的Java成绩—select * from A where StuID=1 and Subject=’Java’

查询A表中学号为1、3、5的学员信息—select * from A where StuID=1 or StuID=3 or StuID=5

  1. 比较运算符

比较运算符(大小比较,包括>、>=、=、<、<=、<>、!>、!<)

比较运算符

含义

=

等于

> / <

大于 / 小于

>= / <=

大于或等于 / 小于或等于

<>

不等于

!

例:查询A表中除“潸潸”以外的所有的学员信息—select * from A where name<>’潸潸’

  1. 模糊查询

模式匹配符(判断值是否与指定的字符通配格式相符)

  1. LIKE
  1. NOT LIKE

LIKE关键字搜索与指定模式匹配的字符串、日期或时间值。匹配方式可包含4种通配符的任意组合

通配符 ??????????????含义

%????????????????? 包含零个或更多字符的任意字符串

-????????????????? 任何单个字符

[ ]??????????????? 指定范围(如[a-f])或集合([abcdef]或[1,3,5,7,9])内的任何单个字符

[^]?????????????? 不在指定范围(如[^a-f])或集合(如[^abcdef])内的任何单个字符

注:在使用时,通配符和字符要用单引号引起来

:查询姓氏为张的学生信息—Select * from 表名 where 姓名 like ‘张%’????????????????????????????????????????????????????????????????????????????????????????????????????????????????

???? LIKE ‘%gon’—搜索以字母gon结尾的所有字符串(如G-Dragon 或Martagon)

???????? LIKE ‘_heryl’—搜索以字母heryl结尾的所有6个字母的字符串(如Cheryl和 Sheryl)

???? LIKE ‘[M~Z]inger’—搜索以字母inger结尾,以M~Z中的任何单个字母开头的所有字符串(如Ringer)

???? LIKE ‘S[^C]%’— 搜索以字母S开头,并且第二个字母不是C的所有字符串(如 Strawberry)

  1. 排序

当要对查询结果进行排序时需要在select语句中加 ORDER BY子句。(在order by子句中可以使用一个或多个排序要求,优先级次序从左到右

排序的方向可以是升序或降序。ASC-递增顺序DESC-递减顺序用于指定排序方向。默认的排序方向为递增顺序。空值(NULL)将被处理为最小值。

语法:order by 列名 desc/asc

例:针对学生年龄进行降序排序—Select * from 表名 order by 年龄 desc

ORDER BY子句与TOP关键字连用-可通过order by 与top 关键字搭配使用来选取按照排序之后查询结果中前若干行或前百分比的数据(PSTOP如果在字段列表前面使用TOP n percent,则在查询结果中显示前面占总记录数的百分比为n% 的记录)

例:查询学号为前三名的学生信息—Select top 3 * from 表名 order by 学号

  1. 聚合函数
  1. 求和函数-SUM-使用SUM函数计算字段的累加和

SUM函数用于统计数值型字段的总和,只能用于数值型字段,而且NULL值将被忽略

例:查询学生成绩的总和—Select sum(成绩) from 表名

  1. 平均函数-AVG-使用AVG函数计算字段的平均值

AVG函数用于计算一个数值型字段的平均值,该字段中的NULL值在计算过程中将被忽略

:查询所有学生的平均成绩—Select avg(成绩) from 表名

  1. 最大/小值-MAX、MIN-计算字段的最大值和最小值

MAX函数用于返回表达式中的最大值,MIN函数则用于返回表达式中的最小值,计算过程中遇到NULL值时予以忽略

例:查询学生成绩当中的最大值—Select max(成绩) from 表名

查询学生成绩当中的最小值—Select min(成绩) from 表名

  1. 计数函数-COUNT-使用COUNT函数统计记录行数

COUNT函数用于统计字段中选取的项数或查询输出记录行数。(统计记录的条数)

例:查询总共有多少个学生—Select count(*) from 表名

  1. 分组
  1. GROUP BY 子句

Group by子句指定将结果集内的记录分成若干个组来输出,每个组中的记录在指定的字段中具有相同的值。

在一个查询语句中,可以使用任意多个字段对结果集内的记录进行分组,字段列表中的每个输出字段必须在group by子句中出现或者用在某个聚合函数中。

使用 group by 子句时,如果在select 子句的字段列表中包含有聚合函数,则针对每个组计算出一个汇总值,从而实现对查询结果的分组统计

例:查询每一个学生的总成绩—Select sum(成绩) from 表名 group by 学号

?? ?分别统计参加每个科目考试的人数—select Subject AS 科目,COUNT(*)AS人数 from A group by Subject

(:当指定group by时,字段列表中任一非聚合表达式内的所有字段都应包含在group by

列表中,或者group by表达式必须与字段列表表达式完全匹配)

:分组表达式是执行分组时所依据的一个表达式,通常是一个字段名。在字段列表中指定的字段别名不能作为分组表达式来使用。另外text、ntext、image以及bit数据类型的字段也不能在分组表达式中

综合: group by 、order by、 top三者连用

例:求出总成绩的前三名

Select top 3 * sum(成绩) 总成绩 from 表名 group by 学号 order by 总成绩 desc

  1. HAVING 子句

Having子句用于指定组或聚合的搜索条件,该子句通常与group by子句一起使用。如果不使用group by子句,则having子句的行为与where子句一样。所不同的是:

WHERE

1、where子句搜索条件在进行分组操作之前应用

2、where对原始数据进行条件筛选

HAVING

1、having搜索条件在进行分组操作之后应用

2、可以包含聚合函数

3、Having子句可以引用字段表中出现的任意项,是对运算聚合后的数据进行条件筛选

例:统计平均分大于75分的科目—select subject AS 科目,AVG(score) AS 平均分数 from A group by subject having AVG(score)>75

综合: group by 、order by、 top、having连用

例:求出学生平均成绩大于75分的前三名的学生——

Seslect top 3 *,avg(成绩)? 平均成绩 from 表名 group by 学号 having avg(成绩)>75

Order by 平均成绩 desc

  1. 内部联接查询

内部联接是联接类型中最普通的一种。内部联接根据一个或几个相同的字段将记录匹配在一起,但是内部联接仅仅返回那些存在字段匹配的记录。使用内部联接时,如果两个来源表的相关字段满足联接条件,则从这两个表中提取数据并组合成新的记录。

语法格式:

Select 字段列表 from 表1 INNER JOIN 表2 ON 条件表达式

(其中‘表1’和‘表2‘为要从其中组合记录的表名称;<条件表达式>用于指定两个表的联接条件,由两个表中的字段名称和关系比较运算符组成)

例:将A表与B表联接,查询考试分数大于或等于88分的学员信息并显示相关科目和分数

Select A.ID, A.Name, A.Sex, B.Subject, B.Score from A inner join B on A.ID=B.ID where B.Score>=88

Select A.ID, Name, Sex, Subject, Score from A inner join B on A.ID=B.ID where Score>=88

表A与表B都包含了ID字段,如果在SQL语句中不具体地指明来自哪个表,则SQL Server也不知道该对哪一个ID进行计算。因此,当返回列的名称在联接结果中存在多次时,必须完全确定列的名称。可通过两种方法中的任一种来确定列名:

  1. 提供选择列所在表的表名,接着是一个点号(.)和列名-(表.列名)
  2. 为表提供一个别名,接着是一个点号(.)和列名-(别名.列名)

例:select A.ID, A.Name, A.Sex, B.Subject, B.Score from StuInfo A inner join StuMarks B on A.ID=B.ID where B.Score>=88

INNER JOIN— 类似WHERE子句

所有的内部联接都会返回联接之后匹配的记录,这个特点与where子句相似,因为where子句也只返回满足规定标准的记录。上述的例子也可使用where子句来实现:

例:select A.ID, A.Name, A.Sex, B.Subject, B.Score from StuInfo A, StuMarks B where A.ID=B.ID and B.Score>=88

  1. 外部联接查询

与内部联接(INNER JOIN)相对的方式称为外部联接(OUTER JOIN)。在外部联接中,参与联接的表有主从之分,以主表的每行数据去匹配从表的数据列,符合联接条件的数据将直接返回到结果集中,那些不符合联接条件的列,将被填上NULL值后再返回到结果集中(BIT类型的数据,将被填上0)

外部联接分为左外部联接(LEFT OUTER JOIN)和右外部联接(RIGHT OUTER JOIN)两种。以主表所在的方向区分外部联接,主表在JOIN的左边,则称为左外部联接,主表在JOIN 的右边,则称为右外部联接。

语法格式:

Select 字段列表 from 表1 <LEFT/RIGHT> [OUTER] JOIN 表2 on 条件表达式

注:OUTER关键字为可选项,只需使用LEFT或RIGHT关键字-如LEFT JOIN)

内部联接、外部联接区别

内部联接

1、无法满足联接条件的数据即被丢弃

2、参与联接的表的地位是平等的

外部联接

1、不符合联接条件的列,将被填上NULL值后再返回到结果集

2、参与联接的表有主从之分

在学生信息表中插入一个新同学“扇扇”,他没有参加考试,所以学生成绩表中没有这个同学的信息,现在需要查询所有同学的成绩,就算没有参加考试,也必须显示每个学生的名字

例:select A.ID, A.Name, A.Sex, B.Subject, B.Score from StuInfo A left outer join StuMarks B on A.ID=B.ID?? ——左外联接

内部联接,寻找的是与“条件表达式”匹配的数据,而“扇扇”的信息仅仅只在学生信息表中存在,因而无法与成绩表中的任何记录匹配。

外部联接中有一个表是主表,另一个表的记录会根据“条件表达式”与主表的记录匹配,如果没有与主表相匹配的记录,则会显示NULL。要求每个学员的信息必须显示,无论考试成绩存不存在,只需使用外部联接,并将学生信息表作为主表即可实现。

左外联接与右外联接的区别仅仅只是写法不同而已,上述左外联接也可写成如下右外联接:

例:select A.ID, A.Name, A.Sex, B.Subject, B.Score from StuMarks B right outer join StuInfo A on A.ID=B.ID?? ——右外联接

子查询是一个嵌套在SELECT、INSERT、UPDATE或DELETE语句或其他子查询中的查询。任何允许使用表达式的地方都可以使用子查询。子查询也称为内部查询或内部选择,而包含子查询的语句也称为外部查询或外部选择。

?例:查询“潸潸”同学的分数大于80分的考试成绩记录

Select Name,Subject,Score from StuInfo A,StuMarks B where A.ID=B.ID and A.Name=’潸潸’ and B.Score>80?? ——之前所学知识

子查询思路:

  1. 找到分数大于80分的学员

Select * from StuMarks where Score >80

  1. 连表,将找到的这些学员的分数与姓名部分连接起来

Select Name,Subject,Score from StuInfo A,( Select * from StuMarks where Score >80) B where A.ID=B.ID

  1. 根据姓名查找到以选出的数据中“潸潸”的成绩

Select Name,Subject,Score from StuInfo A,( Select * from StuMarks where Score >80) B where A.ID=B.ID and A.Name=’潸潸’

——在小括号中的查询被称为子查询或内部查询,包含这个查询的查询语句为外部查询

子查询的特点和优势:

  1. 使用灵活,可以成为SQL语句的多个部分
  1. 降低SQL语句的复杂度,提高SQL语句的可读性

  • 子查询作为查询条件使用

例:查询学号在“讪讪“同学前面的学员信息

Select * from A where ID < (select ID from A where Name=’讪讪’)

思路:

通过子查询找到“讪讪”学号,然后将子查询的结果作为where子句的 ‘<’ 后面的部分

注:在查询条件中使用‘<’ ‘>’ ‘=’ 符号后的子查询的结果只能有一个值

  • 子查询作为临时表使用

例:查询所有学员的“HTML”成绩,如果没有成绩显示成“NULL”

Select A.*,B.Score from StuInfo A left outer join (select * from StuMarks where Subject =’HTML’) B on A.ID=B.ID

  • 子查询作为列使用

例:查询所有学员的“HTML”成绩,如果没有成绩显示成“NULL”

Select A.*,(select Score from StuMarks B where A.ID=B.ID and Subject =’HTML’) Score from StuInfo A

  1. 使用EXISTS和 NOT EXISTS完成子查询

例:查询存在分数的学员的信息

Select * from A where exists (select * from B where A.ID=B.ID)

——EXISTS / NOT EXISTS 表示存在/不存在的意思。在语句中会判断EXISTS / NOT EXISTS 后连接的子句是否存在和是否不存在。

NOT EXISTS 的用法与EXISTS相同,唯一的区别就是意义相反

--常用的EXISTS用法

?if exists(select * from sys.databases where name= '名字')

?drop database名字

  1. 使用IN 和 NOT IN完成子查询

例:查询Java分数大于88分的学员姓名

Select Name from A where ID in (select ID from B where Score >88 and Subject =’Java’)

——IN子句中可以包含多个值,值之间使用逗号隔开

NOT IN 的用法与IN相同,唯一的区别就是意义相反

  1. 使用SOME、ANY、ALL完成子查询

在SQL查询中,SOME、ANY、ALL后必须跟子查询。

SOME和ANY的查询功能是一样的,where条件就能满足SOME和ANY所连接的子查询中的任意一个值就表示where条件成立。

ALL表示的是能够满足ALL所连接的子查询中的所有值才能成立。

以’>’运算符为例,>ALL表示大于每一个值。换句话说,它大于最大值。例如,>ALL(1,2,3)表示大于3。>ANY表示至少大于一个值,即大于最小值。因此>ANY(1,2,3)表示大于1

例:找到大于张三或者李四同学学号的 学生信息

?select * from A where ID>some (select ID from A where Name='张三' or Name='李四')

?select * from A where ID>any (select ID from A where Name='张三' or Name='李四')

找到大于张三和李四同学学号的 学生信息

?select * from A where ID>all (select ID from A where Name='张三' or Name='李四')

  1. 排序函数

排序函数语法:OVER ( [分组子句] 排序子句 [DESC] [ASC] )

排序子句:ORDER BY 排序列,排序列…

  1. ROW_NUMBER函数

例:对学员的Java成绩进行排名

Select ROW_number() over (order by Score desc) AS 排名, A.Name,B.Score from StuInfo A,StuMarks B where A.ID=B.ID and B.Subject =’Java’

ROW_NUMBER函数排序特点是没有并列编号,不跳空编号

  1. RANK 函数

例:对学员的Java成绩进行排名

Select RANK() over (order by Score desc) AS 排名, A.Name,B.Score from StuInfo A,StuMarks B where A.ID=B.ID and B.Subject =’Java’

RANK函数生成的排序根据排序子句给出递增的序号,但是存在并列并且跳空。

  1. DENSE_RANK 函数

例:对学员的Java成绩进行排名

Select DENSE_RANK() over (order by Score desc) AS 排名, A.Name,B.Score from StuInfo A,StuMarks B where A.ID=B.ID and B.Subject =’Java’

DENSE_RANK函数生成的排序根据排序子句给出递增的序号,但是存在并列不跳空。

排序函数特点

ROW_NUMBER函数

没有并列编号,不跳空编号

RANK函数

有并列编号,有跳空编号

DENSE_RANK函数

有并列编号,没有跳空编号

文章来源:https://blog.csdn.net/m0_73642750/article/details/134921023
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。