首先,先看看SQL语句都有哪些核心动词。
SQL功能 | 动词 |
数据查询 | select |
数据操作 | insert,update,delete |
数据定义 | create,drop,alter |
数据控制 | grant,revoke |
SQL包括以下一系列操作:
- 定义和修改、删除关系模式,定义和删除视图,插入数据,建立数据库。
- 对数据库中的数据进行查询和更新。
- 数据库重构和维护。
- 数据库安全性、完整性控制、以及事务控制。
- 嵌入式SQL和动态SQL定义。
接下来,这篇文章主要介绍下SQL里数据查询和操作的基本语句。
数据查询(select)一般格式为:
select [all|distinct] <目标列表达式>[,<目标列表达式>]...
from <表名或视图名> [,<表名或试图名>...]
[where <条件表达式>]
[group by <列名> [having <条件表达式>]]
[order by <列名> [asc|desc]];
/*
[]为可选可不选,|为或的意思。该代码大概含义是,
根据where的表达式从from的基本表或者试图里找出满足条件的数据(元组,行),
再按select里的目标列表达式选出元组中的属性值形成的结果(表)。
而group by语句是将结果(表)按对应的列名的值进行分组,若带有having则只是有满足条件的数据(元组,行)才输出。
order by是将结果(表)按对应的列名的值进行升序或降序排序。
*/
单表查询:
(1)查询指定列:
select 列名1,列名2,... from 表名或视图名; /*各列的先后顺序可以和表中的顺序不一样*/
(2)查询全部列:将列名指定为*
select * from 表名或视图名;
(3)查询经过计算的值:select后面不仅可以是列名,也可以是表达式。
(4)可以通过别名的方式来改变查询结果的列表题:
select 原列标题 别名,... /*原列标题+空格+别名*/
from 表名或视图名;
/*注:若遇到列标题原本自身带有空格时候,要用单引号把这整个列标题包起来*/
(5)去掉结果(表)中重复行,指定关键字distinct:
select distinct 列名 /* 默认是all,即保留结果(表)中取值重复的行*/
from 表名或视图名;
(6)查询满足条件的数据(元组,行):
查询条件 | 谓词 |
比较 | =、>、<、>=、<=、!=、<>、!>、!< |
确定范围 | between and、not between and |
确定集合 | in、not in |
字符匹配 | like、not like |
空值 | is null、is not null |
逻辑运算 | and、or、not |
注:1.like查找和字符串匹配时,可以含有通配符 % 和 _ 。
2.其中 % 是代表任意长度(可以为0)的字符串。例如:x%h表示以x开头,以h结尾的任意长度字符串。
3.其中 _ 代表任意单个字符。例如:x_h表示以x开头,以h结尾的长度为3的任意字符串。
4.若要查询的字符串本身含有 % 或者 _ 的,要使用 escape '<转码字符>' 语句来进行转义。例如(如下代码):
select sage /*查询名字为hxh_chuanyi的年龄。escape'\'表示"\"为换码字符*/
from student
where sname like 'hxh\_chuanyi' escape'\';
(7)关于空值查询。用 is null 或 is not null谓词,且 is 不能用 "=" 代替:
select 列名 from 表名或视图名
where something is null; /*某属性something是空值*/
(8)order by语句升序(asc,默认的)或者降序(desc)排列:
select * /*查询结果按年龄sage降序排列*/
from 表名或视图名
order by sgae desc;
(9)聚集函数(只能用 select 语句和 group by 语句中的 having 语句):
count(*) | 统计元组个数(行数) |
count(列名) | 统计一列中值的个数 |
sum(列名) | 计算一列值的总和(为数值型) |
avg(列名) | 计算一列值的平均值(为数值型) |
min(列名) | 求一列值中的最小值 |
max(列名) | 求一列值中的最大值 |
(10)group by 语句是对查询结果按某一列或多列的值分组,值相等的为一组(where语句中不能用聚集函数作为条件表达式的):
select sno from sc /*学生选课表sc(sno,cno,score),查询选修三门以上课程的学生学号*/
group by sno
having count(*)>3;
连接查询(涉及两张表及以上):
(1)等值与非等值连接查询,一般格式为(在 where 语句中用来连接两个表的条件成为连接谓词):
select 表名.列名,表名.列名,...
from 表1,表2,...,表n
where 表名i.列名 比较运算符 表名j.列名; /*当连接运算符为 = 时,称为等值连接,其他称为非等值连接*/
(2)自身连接(要对表进行取别名):
select 别名1.列名,别名2.列名,...
from 表名 别名,表名 别名
where 条件表达式;
嵌套查询(子查询不能使用 order by 语句,只能对最终查询结果排序):
select 目标列表达式,...
from 表名
where ...(select 目标列表达式 from 表名 where ...); /*()内为子查询*/
(1)带有 any 或 all 谓词的子查询(涉及子查询返回多值时):
= | <> 或 != | < | <= | > | >= | |
any | in | 无 | <max | <=max | >min | >=min |
all | 无 | not in | <min | <=min | >max | >=max |
例如:
select sname,sage /*查询女生中比任意一个男生年龄小的学生名字和年龄*/
from student
where sage<any(select sage
from student
where ssex='男')
and ssex!='男';
数据操作(insert、update、delete):
(1)插入数据:
insert into <表名>[(<属性列1>[,<属性列2>])...] values(<常量1>[,<常量2>]...);
/*属性列的顺序可以和表的列顺序不同,但是values的值要与之一一对应,
常量若有字符串要用单引号括起来,若表名后面没有跟属性列则values的值就与原表的列顺序一致*/
(2)修改数据:
update <表名> set <列名>=<表达式>[,<列名>=<表达式>]...
[where <条件>];
(3)删除数据:
delete from <表名> [where <条件>]; /*若没有where条件,则是删除表中所有元组,而不是删除表*/
以上是我学习两三天的SQL语句中的最基本增删改查操作,不是很全面存在有些不足,后续有需要会进行更新改进。也同时欢迎广大朋友若有发现错误可以指出,本人会虚心听取建议的!