SQL语句

177 阅读8分钟

SQL语句

定义表

语法格式:

create table 学生表{

学号 int,

姓名 char(8),

性别 char(1),

班级 char(10),

年龄 int(2)

}


删除表

语法格式:

drop table 表名


修改表

1.修改

alter table 表名 alter column 列名 新数据类型

例:将语句中的教师列的类型改为char(6)
​
alter table 选课表 alter column  教师  char(6)
2.添加列

alter table 表名 add 新列名 数据类型

例:选课表添加“课程类别”列,类型字符串,长度4alter  table  选课表  add  课程类别  char(4) 
3.删除列

alter table 表名 drop column 列名

例:删除课程表中的备注列
​
alter table  选课表  drop column 备注

插入数据

insert into 表名 (列名列表) values (值列表)

单张表操作(三种方法插入数据(11对应))
例:要求学生表中插入一行数据:学号为9999,姓名张三,性别男,其他情况未知
​
insert into  学生表(学号,姓名,性别)  values ('9999','张三','m')
​
insert into  学生表  values('9999','张三','m','null','null') 
​
insert into  学生表  values('9999','张三','m',default,default)
多张表操作(从一张表A1插入数据到另一张表A2)
例:假设有一张和学生表定义完全一样的表,表名为'学生表1',要求在其中插入学生表中所有男生的信息
​
insert  into  学生表1(学号,姓名,性别,班级,年龄)
select  学号,姓名,性别,班级,年龄
from 学生表  where  性别='m'

更新数据

update 表名 set 列名 = 表达式 [ , ... , n ] [ where 更新条件 ]

1:要求所有学生的年龄加1
update 学生表  年龄 = 年龄+1
2:修改软件工程这门课的信息
要求将“软件工程”的周课时数改为8课时,并把备注改为“核心课程”
​
update  课程表  set 周课时数=8,备注='核心课程'
from  课程表  where 课程名='软件工程' 
3:用子查询实现数据更新
要求将学号“11111”的学生的年龄改为与学号为“22222”的学生的年龄一样
​
update 学生表  set  年龄=(select 年龄 from 学生表 where 学号='22222')
where 学号='11111'
4:用子查表连接实现数据更新(更新条件基于另一张表)
要求将GZ02计6全班学生的成绩都加上101.
update 选课表  set 成绩=成绩+10
where 学号 in (select 学号 from 学生表  where 班级='GZ02计6')

2.
update  选课表 set 成绩=成绩+10
from 选课表 join 学生表 on 学生表.学号=选课表.学号
where 班级='GZ02计6'

删除数据

delete from 表名 where 删除条件

1:要求删除所有学生的选课记录
delete from 选课表  //删除表中全部数据,但保留表结构
2:要求删除GZ02房产的全部学生
delete from 学生表 where 班级='GZ02房产'
3:删除GZ02计6班不及格学生的选课记录
delete from 选课表
where 成绩<60 and 学号 in (select from 学生表 where 班级='GZ02计6')
4:删除“COM技术”这门课程的选课信息

1.
delete from 选课表 
where 课程号=(select 课程号 from 课程表 where 课程名='COM技术')

2.
delete from 选课表
from 选课表 join 课程表 on 选课表.课程号=课程表.课程号
where 课程名='COM技术'

查询

SQL基本查询语句

1.查询语句的基本结构

select 目标列名序列 ----需要输出哪些列

from 数据源 ----来自哪张表

[ where 检索条件表达式 ] ----查询条件

[ group by 分组依据列 ] ----对于检索出来的数据进行分组

[ having 组提取条件 ]

[ order by 排序依据列 ]

(其中“[ ]”内的根据实际查询要求,大家可以在下面列举的例子中体会)


2.投影

1.选择列(检索列名

例:检索数据表全部信息
select * from 数据表名

2.改变列标题

两种方法:
例:要求改变“班级”为“所在班级”
1. select 学号,姓名,所在班级 = 班级 from 学生表
   
2. select 学号,姓名,班级 as 所在班级  from 学生表

3.带表达式的select子句

select 子句中可以包含算术运算符,允许+ - * / 运算

例:要求成绩提高20%后的成绩
select 学号,课程号,成绩,成绩*1.2 as 调整后的成绩
from 选课表
  1. all 与 distinct

    例:在选课表中,一个学生可以选择多门课,要求检索出已经选过课的学生学号
    select distinct 学号
    from 选课表
    

    其中需要注意的是:distinct 针对的是select 子句后面的所有属性不能重复出现

    也就是例子中的“学号”是不重复的


3.选择

1.比较运算符 = >= <= < >

1:要求检索出选课表中所有成绩在95分以上的同学的学号、课程号、成绩
select * from 选课表 where 成绩>952:要求检索出班级为GZ02计6班的全部学生的信息
select * from 学生表 where 班级='2108财会'

2.逻辑运算符 and 、not 、or

例:选修了1号课程并且成绩在80分以上的同学的学号和成绩
select 学号,课程号,成绩  from 选课 where 课程号='1' and 成绩>80

3.between....and

例:学生表中年龄在20-23之间的所有男同学的信息
select * from 学生表 where 年龄 between 20 and 23 and 性别='M'

4.in ( not in )意思是包含在表中有/没有 in 指定的列

要求学生表中有a5、a6、a7三个班级的同学信息

使用in
例:select * from 学生表 where 班级 in ('GZ02计5','GZ02计6','GZ02计7')

没有用in
例:select *from 学生表 where 班级='GZ02计5' or 班级='GZ02计6'  or 班级='GZ02计7'

5.字符串模糊匹配 like关键字

列名 [not] like 匹配字符串

01.jpg

要求使用like关键字实现
例1:学生表中所有姓陈的同学
select * from 学生表 where 姓名 like '陈%'2:学生表中姓陈或姓李或姓刘的同学
select * from 学生表 where 姓名 like '[陈李刘]%'

6.涉及空值的查询

空值具有以下特性:

      • 等价于没有任何值
      • 与0、空字符串、空格不同
      • 排序在其他数据前面
      • 在计算过程中和大多数函数中均可以使用空值

判断某个值是否为空值的语句格式: 列名 is [not] null

例:要求查询已经有课,但无考试成绩的学生的学号和相应的课程号
select 学号,课程号 from 选课表 where 成绩 is null
例:查询所有有考试成绩的学生的学号和课程号
select 学号,课程号 from 选课表 where 成绩 is not null

4.排序

order by 排列查询结果的顺序

asc 升序

desc 降序

例:选课表中所有选修课课程号为1,并且成绩在95分以上的同学的学号和成绩,并要求按成绩从高到低排序
select 学号,成绩 from 选课表 where 课程号=1 and 成绩>=95 order by 成绩 desc
例:按成绩降序,如果成绩相同,再要求按学号进行升序排列
select 学号,成绩 from 选课表 where 课程号=1 and 成绩>=95 order by 成绩 desc,学号

聚集查询

1.聚集函数

avg 平均值

count(*) 数据值的数量

count 选择行的数量

max 最大值

min 最小值

sum 表达式中所有值

注意:这些聚集函数必须用在select子句中,其返回的结果在查询结果中作为新列出现

maxmin、avg 函数的使用

例:要求通过选课表查询出所有选修1号课程的学生的最高分、最低分、平均分
select max(成绩) as 最高分,
	   min(成绩) as 最低分,
	   avg(成绩) as 平均分 ,
from 选课表 
where 课程号=1
count 函数的使用
例:
select count(*) as 所有记录数,
       count(学号) as 所有学生数,
       count(班级) as 班级列数量,
       count(distinct 班级) as 班级数    ----不重复
from 学生表   

2.使用 group by 分组
1:按班级汇总人数和平均年龄
select 班级,
       avg(年龄) as 平均年龄,
       count(学号) as 班级人数,
from 学生表
group by 班级
2:对a6班的同学按性别计算平均年龄
select 性别,avg(年龄) as 平均年龄
from 学生表
where 班级='GZ02计6'
group by 性别

3.使用having 子句筛选结果集

having 子句是为 group by 设置条件的方式,与where子句在select 语句设置条件的方式一样

使用having 子句时,需注意:

  1. having 子句只在group by 子句中使用
  2. 在having语句中可以引用任何允许出现在select选择列表中的字段
例:
在已经给出了按班级汇总人数和平均年龄的实例,在此基础上,筛选出平均年龄在19-20岁且班级人数在40人以上的班级
select 班级,
       count(*) as 班级人数,
       avg(年龄) as 平均年龄
from 学生表
group by 班级,平均年龄
having avg(年龄) between 19 and 20 and count(*)>40  

连接查询

1.内连接查询(多张表连接)

如果两个表的相关字段满足连接条件,则从这两个表中提取数据并组合成新的记录

语法格式(2种):

  1. from 表1 inner join 表2 on 表1.字段1=表2.字段1
  2. from 表1 , 表2 where 表1.字段1=表2.字段1
1:查询每个已经选课的学生情况
select * from 学生表,选课表  where  学生表.学号=选课表.学号

select * from 学生表 inner join 选课表 on 学生表.学号=选课表.学号    -----学号重复检索

---改进---
select 学生表.学号,班级,姓名,性别,年龄,课程号,成绩
from 学生表,选课表  where  学生表.学号=选课表.学号