SQL语句实例说明 方便学习mysql的朋友


当前第2页 返回上一页

 

GROUP BY子句:

GROUP BY子句将查询结果按某一列或多列的值分组,值相等的为一组。
对查询结果分组的目的是为了细化聚集函数的作用对象。分组后聚集函数将作用于每一个组,即每一组都有一个函数值。

select cno,count(*) from teacher group by cno;
对teacher表格按照cno分组,并算出每组里面有多少个元素

如果分组后还要按照一定的条件对这些组进行筛选,最终只输出满足指定条件的组,则可以使用HAVING语句指定筛选条件。

select cno,count(*) from teacher group by cno having count(*) >= 4;
对teacher表格按照cno分组,并算出每组里面有多少个元素,得到元素个数大于等于4的值

 

连接查询:

连接查询是关系数据库中最主要的的查询,包括等值连接查询,自然连接查询,非等值连接查询,自身连接查询,外连接查询和复合条件连接查询等。

等值与非等值连接查询:

连接查询的WHERE子句中用来连接两个表的条件称为连接条件或连接谓词,格式为:

[<表名1>.]<列名> <比较运算符> [<表名2>.]<列名2>

其中比较运算符主要有:=,>, <, >=, <=, !=(或<>)等

 

select s.*,t.* from student as s,teacher as t where s.teacherid = t.teacherid;
等值连接查询,将student表和teacher的信息连接查询出来,连接条件是s.teacherid = t.teacherid


自身连接:

一个表与自身进行连接,称为自身连接

select teacher.name,student.name from people as teacher,people as student where teacher.name = student.teacher;
自身连接查询,在people表里有两种角色,一种是教师,一种是学生,利用自身连接查询,得到name字段和teacher字段相等的元组

外连接:

左外连接列出左边关系中所有元组,右外连接列出右边关系中所有元组。

左外连接:SELECT <目标列表达式>[,<目标列表达式>]…… FROM <表名1> LEFT [OUTER] JOIN <表名2> ON <连接条件>
右外连接:SELECT <目标列表达式>[,<目标列表达式>]…… FROM <表名1> RIGHT [OUTER] JOIN <表名2> ON <连接条件>

select s.sno,s.name,c.cno,c.name from student as s left outer join class as c on (s.cno = c.cno);
student表和class表进行左外连接,连接条件是s.cno=c.cno

select c.cno,c.name,s.sno,s.name from student as s right outer join class as c on (s.cno = c.cno); 
student表和class表进行右外连接,连接条件为s.cno=c.cno


student表数据:

+-----+-----+------+
| sno | cno | name |
+-----+-----+------+
| 1 | 1 | 地心 |
| 2 | 2 | 华雄 |
| 3 | 1 | 孝慈 |
| 4 | 3 | 必须 |
+-----+-----+------+

class表数据:

+-----+-----+------+
| cid | cno | name |
+-----+-----+------+
| 1 | 1 | 化学 |
| 2 | 2 | 物理 |
| 3 | 3 | 政治 |
+-----+-----+------+

 

左外连接效果:

+-----+------+-----+------+
| sno | name | cno | name |
+-----+------+-----+------+
| 1 | 地心 | 1 | 化学 |
| 2 | 华雄 | 2 | 物理 |
| 3 | 孝慈 | 1 | 化学 |
| 4 | 必须 | 3 | 政治 |
+-----+------+-----+------+

右外连接效果:

+-----+------+-----+------+
| cno | name | sno | name |
+-----+------+-----+------+
| 1 | 化学 | 1 | 地心 |
| 1 | 化学 | 3 | 孝慈 |
| 2 | 物理 | 2 | 华雄 |
| 3 | 政治 | 4 | 必须 |
+-----+------+-----+------+

MySQL不支持全外连接!

 

复合条件连接:

WHERE子句中可以有多个连接条件,称为复合条件连接

select s.sno,s.name,c.name,s.score from student s,class c where s.cno = c.cno and s.score < 60;
复合条件连接查询,查询学生信息和课程信息,并且成绩小于60的记录

嵌套查询:

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

子查询的SELECT语句中不能使用ORDER BY子句,ORDER BY 子句只能对最终查询结果排序


带有IN谓词的子查询:

select sno,name from student
where cno in
(
select cno from student
where name = '华雄'
);

查询和"华雄"选同一课程的所有学生的学号和姓名。

 

子查询的查询条件不依赖于父查询,称为不相关子查询

如果子查询条件依赖于父查询,这类子查询称为相关子查询,整个查询语句称为相关嵌套查询语句。


带有比较运算符的子查询:

select name,cno from student s1
where score >
(
select avg(score) from student s2
where s2.name = s1.name
);

查询学生的大于各科平均成绩的科目

以上是相关子查询。

 

带有ANY(SOME)或ALL谓词的子查询

子查询返回单值时可以用比较运算符,但返回多值时要用ANY(有的系统用SOME)或ALL谓词修饰。使用ALL或ALL谓词时必须使用比较运算符。

>ANY                          大于子查询结果的某个值
>ALL                           大于子查询结果的所有值 
<ANY                           小于子查询结果的某个值
<ALL                            小于子查询结果的所有值
>=ANY                          大于等于子查询结果的某个值     
>=ALL                          大于等于子查询结果的所有值
<=ANY                          小于等于子查询结果的某个值
<=ALL                           小于等于子查询结果的所有值
=ANY                             等于子查询结果的某个值
=ALL                              等于子查询结果的所有值(通常没有实际意义)
!=(或<>)ANY                   不等于子查询结果的某个值
!=(或<>)ALL                    不等于子查询结果的任何一个值

select name,score from student where score <= all (select score from student);
查询成绩最小的学生姓名和成绩

集合查询:

SELECT语句的查询结果是元组的集合,所以多个SELECT语句的结果可进行集合操作。集合操作主要包括并操作(UNION),交操作(INTERSECT),差操作(EXCEPT)。
参加集合操作的各查询结果的列数必须相同;对应项的数据类型也必须相同。
MySQL数据库不支持INTERSECT和EXCEPT操作!

select * from student where cno=1
union
select * from student where cno=2;
查询班级1和班级2所有学生信息

 

 

数据更新:

插入数据:

插入元组:

INSERT
INTO <表名> [(<属性列1>)[,<属性列2>]……]
VALUES (<常量1>[,<常量2>]……);


例子:

insert into student (cno,name,score) values (2,'横切',85);

 

插入子查询结果:

INSERT 
INTO <表名> [(<属性1>[,<属性2>]……)]
子查询;


例子:

insert into studentcopy select * from student;
将student表的信息全部复制到studentcopy表中


修改数据:

UPDATE <表名>
SET <列名>=<表达式>[,<列名>=<表达式>]……
[WHERE <条件>]


修改某一元组的值:

update studentcopy set score=80 where sno=1;

修改多个元组的值:

update studentcopy set score=score-20;

删除数据:

DELETE
FROM <表名>
[WHERE <条件>]; 

 

删除某一元组:

delete from studentcopy where sno=1;

删除多个元组:

delete from studentcopy;

带子查询的删除语句:

delete from studentcopy where cno in (select cno from student as s where s.cno = 2);

视图:

 关于视图,它的作用和优缺点可以参考文章:数据库视图介绍

建立视图:

CREATE VIEW <视图名> [(<列名>[,<列名>]……)]
AS <子查询>
[WITH CHECK OPTION]

子查询可以是任意复杂的SELECT语句,但通常不允许含有ORDER BY子句和DISTINCT语句。

WITH CHECK OPTION 表示对视图进行UPDATA,INSERT和DELETE操作时要保证更新,插入或删除的行满足视图定义中的谓词条件

组成视图的属性列名或者全部省略或者全部指定,没有第三种选择。如果省略了视图的各个属性列名,则隐含该视图由子查询中SELECT子句目标列中的诸字段组成。
但在下面三种情况下必须明确指定组成视图的所有列名:
(1) 某个目标列不是单纯的属性名,而是聚集函数或列表达式。
(2) 多表连接时选出了几个同名列作为视图的字段。
(3) 需要在视图中为某个列启用新的更合适的名字。

create view part_student
as
select * from student
where cno = 2;
建立物理班学生的视图

create view student_class (sno,student_name,class_name,score)
as
select s.sno,s.name,c.name,s.score
from student as s,class as c
where s.cno = c.cno;
结合学生表和选课表建立视图


如果以后修改了基本表的结构,则基本表与视图的映射关系就被破坏了,该视图就不能正确工作了。为避免出现这类问题,最好在修改基本表之后删除由该基本表导出的视图,然后重建这个视图。


删除视图:

DROP VIEW <视图名> [CASCADE];

如果视图上还导出了其他视图,则使用CASCADE级联删除语句,把该视图和由它导出的所有视图一起删除。

查询视图:

查询视图和查询基本表类似。

更新视图:

更新视图和更新基本表类似,不过有些限制。

更多Mysql内容来自木庄网络博客


标签:Mysql

返回前面的内容

相关阅读 >>

mysql数据库是如何实现xa规范的

如何在mysql中创建和删除数据库

linux上mysql改密码忘了怎么办?

linux mysql5.6版本的安装配置过程

关于mysql 优化 insert 性能 的相关介绍

mysql怎么批量录入数据

通过实例讲解mysql如何实现定时任务

centos编译安装mysql 5.6及安装多个mysql实例详解

mysql数据如何设置不重复

介绍手动配置phpmyadmin和mysql密码的两种方法

更多相关阅读请进入《mysql》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...