MySQL数据库:DML操纵语言

2017-06-12  本文已影响18人  虞锦雯

INSERT、SELECT、UPDATE、DEL

一、INSERT插入
(一)语法
INSERT [INTO] <表名> [列名] VALUES <值列表>
(二)叙述

如果表名后面没写字段名,则默认是向所有的字段添加值,另外字符串值应该用‘ ’或“ ”引号括起来。

(三)举例

向people表中添加一条记录:

insert into people(name,age) values(“zhangsan”,20);
(四)注意
  1. 每次插入一行数据,不可能只插入半行或者几列数据。因此,插入的数据是否有效将按照整行的完整性的要求来检验;
  2. 每个数据值的数据类型、精度和小数位数必须与相应的列匹配;
  3. 如果在设计表的时候就指定了某列不允许为空,则必须插入数据;
  4. 具有缺省值的列,可以使用DEFAULT(缺省)关键字来代替插入的数值。
(五)插入多行数据
INSERT INTO <表名>(列名) VALUES(<列名值>), (<列名值>), (<列名值>) ......
二、UPDATE更新
(一)语法
UPDATE <表名> SET <列名 = 更新值> [WHERE <更新条件>]
(二)叙述

where 子句是判断语句,用来设定条件,限制只更新匹配的行,如果不带where子句,则更新所有行数据。

(三)举例

将student表中的所有学生名称为"Alex"的改为"Tom":

update student set sname="Tom" where sname="Alex";
三、DELETE 删除
(一)语法
DELETE FROM <表名> [WHERE <删除条件>]
(二)叙述

此语句删除表中的行,如果不带where子句,则删除整个表中的记录,但是表不被删除。

(三)举例

删除student表中的所有年龄小于18岁的记录:

delete from student where sage<18;
四、SELECT查询
(一)语法
SELECT [DISTINCT | DISTINCTROW | ALL]
select_expression,...
[FROM table_references
[WHERE where_definition]
[GROUP BY col_name,...] 集函数
[HAVING where_definition]
[ORDER BY {unsigned_integer | col_name |
formula} [ASC | DESC] ,...]
[LIMIT [offset,] rows]
[PROCEDURE procedure_name]
]
(二)叙述

from子句:指定查询数据的表
where子句:查询数据的过滤条件
group by子句:对匹配where子句的查询结果进行分组
having子句:对分组后的结果进行条件限制
order by子句:对查询结果结果进行排序,后面跟desc降序或asc升序(默认)。
limit子句:对查询的显示结果限制数目
procedure子句:查询存储过程返回的结果集数据

(三)举例
select sno,sname from student;
select sno,sname,ssex,sage,sdept from student;
或
select * from student;
select sname,2008-sage from student;
select sname,'year of birth: ',2008-sage, lower(sdept) from student;
select distinct studentid from sc;
select sno as ‘编号’,sname as ‘姓名’ from student;
select s.sno,s.sname from student as s;
select sname from student where sage<20;
select sname,sage from student order by sage desc;
select sname,sage from student order by sage desc limit 3;
或(limit 3,2)
(四)函数集
(五)创建计算字段concat
select concat(stuName, ' is ', stuAge, ' years old') 
from student order by stuAge desc;
(六)多表查询——连接查询
(七)子查询

将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为子查询。一个SELECT-FROM-WHERE语句称为一个查询块。

独立子查询

  1. 独立多值子查询
    子查询返回的是数据集。
    举例:当子查询返回多行时,all 所有的 any 任意一个。
    a. 谁比所有的 Lacus 工资高:
select empno,ename,salary from emp where
salary > all(select salary from emp where ename = 'Lacus');

b. 谁比任意一个 Lacus 工资高:

select empno,ename,salary from emp where
salary > any(select salary from emp where ename = 'Lacus');
  1. 独立单值子查询(独立标量子查询)
    子查询返回的是单个值,而不是数据集。若返回的是数据集,则会报错。
    举例:
    查询出工资比 ZZ 高的员工的编号、姓名、工资
select empno,ename,salary from emp where salary >
(select salary from emp where ename = 'ZZ');

相关子查询

Select sname from students where exists (select * from sc where
students.sno = sc.studentsid and sc.grade < 80);

求哪些员工的薪水比本部门的平均薪水低

select empno,ename,salary from emp e1 where salary <
(select avg(salary) from emp e2 where e2.deptno = e1.deptno);

求每个部门的最高工资的员工的编号和姓名

select empno,ename,salary from emp e1 where salary =
(select max(salary) from emp e2 where e2.deptno = e1.deptno);

exists 子查询

select empno,ename from emp where empno in
(select mgr from emp where mgr is not null);
select empno,ename from emp where empno = any
(select mgr from emp where mgr is not null);
select empno,ename from emp e1 where exists
(select 1 from emp e2 where e1.empno = e2.mgr);
(八)子查询和连接查询的选择

返回结果位于不同表中的列时,使用连接查询;同一张表中的列时,使用子查询。

(九)组合查询

在单个查询中从不同的表返回类似结构的数据
对单个表执行多个查询,按单个查询返回数据

select stuName from student where stuAge = 18 
union select stuName from student where stuDepart in('计算机系', '音乐系');
  1. union 必须由两条或者两条以上的select 语句组成,语句之间用union 关键字分隔(若组合4 个select 语句,则需要使用3 个union 关键字)
  2. union 每个查询中必须包含相同的列、表达式或者聚集函数
  3. 列数据类型必须兼容:类型不必完全相同,但必须是DBMS可以隐式转换的类型
五、复制表

创建一个副本:
可以通过在SELECT查询中指定字段来限制出现在附表中的字段。

CREATE TABLE grades SELECT * FROM marks;

通过使用SELECT 语句创建已存在表的空副本,并且返回一个空结果集。

CREATE TABLE grades SELECT * FROM marks WHERE 0 = 1;
上一篇 下一篇

猜你喜欢

热点阅读