Sql之DML

Copyright©Stonee

众所周知,SQL(structure query lauguage)中具有四种和数据库有关的语言:DDL(data define lauguage),DML(data manipulation lauguage),DCL(data coutrol lauguage) and TCL(transaction control lauage),DML主要是在操作数据库。

1. 插入

当我们一个table建好以后,就需要往里面插入数据,而这就会用到insert语句。

基础用法是:
insert into (table)(x,x,x,,,) values (x,x,x,x,,,);
有时候会报错,如:ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (me.sc, CONSTRAINT ‘sc_ibfk_2’ FOREIGN KEY (‘SNo’) REFERENCES ‘students’ (‘SNo’))

这是因为当设置外键之后,子键必须需要在外键已经改的基础上再改,并且和外键一致才行。

可以在查询结果上进行插入,如:
insert into instructor select ID from student where dept_name = music

即把符合条件的学生的ID插入到instructor的ID中。

2.查询

查询在SQL中占了很大的比重,SQL注入也是从查询开始的

- 基本用法为

`select */column,cloumn,,, from table,table,,, where + 条件`

- 如果只是select 1;的话,就说明是输出一个1,意思是不管table中有没有1(其实没有table),都会输出1.

我们需要注意的是:select distinct对应着投影关系,from对应着笛卡尔积操作,where对应着选择。

理解select操作的顺序应当先是from,接着是where,最后是select;

对于from来说,当进行多关系查询时,所谓多关系查询,就是select后面跟有多个关系,如:
`select name, course_id from instructor, teaches where instructor.ID = teaches.ID;`

可以把上面通过自然连接换为:
select name, course_id from instructor natural join teaches;
不过join in 是把所有的相等的参数进行笛卡尔积(就像instructor和teaches不仅ID相等,name也相同),但有时后我们只需要一种相同的参数,这就需要用到
select name, course_id from (instructor natural join teaches) join course using (course_id);

- 对于where来说,可以通过like进行模式匹配,如
`select column from table where building like '% Watson%'`

即查找包含Watson的building , '_ _ _'匹配只含三个字符的字符串,这两种可以自由组合,加入转义字符的形式和c语言类似。

where之后可以缀入order by 来显示次序,如:
`select name, course_id from instructor, teaches where instructor.ID = teaches.ID order by name,course_id;` 

默认升序,后面坠入desc表示降序。

where子句中可以用between和and谓词

- union,intersect,except分别对应着并、交和差

union 默认是不重复的,即有去重功能,后缀上union all 则会返回全部数值

- 聚集函数有

  1. avg()
  2. min()
  3. max()
  4. sum()
  5. count()
聚集函数可以用到select之后,聚集函数也可以通过as重命名(as重命名也同样适用于表单和列),如
select avg(salary) as avg_salary from instructor where dept_name = Comp.Sci;

但是这样只能作用在单个元组,即dept_name = COmp.Sci 这一组中,如果还需要输出别的组呢?就需要通过group by 来实现:
select dept_name avg(salary) as avg_salary from instructor group by dept_name;
可以比较一下上例不要group by的区别!
需要注意的是,group by 必须包括select中的所有非聚集函数!

- 嵌套子句

需要用到in 或者 not in 关键字,如:
select course_id from section where semester = fall and year = 2009 and course_id in (select course_id from section where semster = spring and year =2000);

集合比较,如
select course_id
from section where semester = fall and year = 2009 and course_id 
> some (select course_id from section where semster = spring and year =2000);

some 指的是比最小的大,>all 指的是比最大的大

3. 删除

基本语法
delete from table where + 条件

语法和查询类似

4. 更新

基本语法
update table set column = column *n(*也可以是别的*) where + 条件

!!!注意,字符串两边应该加上单引号的,我没有加上,还请自己修改!

本次记录根据database system concept E6 by Silberschatz, Henry, Sudarshan

你可能感兴趣的:(sql,dml,DB)