MySQL常用SQL语句总结包含复杂SQL查询

1、复杂SQL查询

1.1、单表查询

(1)选择指定的列

[例]查询全体学生的学号和姓名

select Sno as 学号,Sname as 姓名 from student;
select Sno,Sname from student;

(2)查询全部列

[例]查询全体学生的详细信息

select * from student;

(3)对查询后的指定列进行命名

[例]查询全部学生的“姓名”及其“出生年”两列

select Sname as 姓名,(2014-Sage) as 出生年 from student;
select Sname ,(2014-Sage) from student;

(4)消除取值重复的行

[例]查询选修了课程的学生学号

select distinct Sno as 选修了课程的学生学号 from SC;
select distinct Sno from SC;

(5)选择表中若干元组(满足条件的)

1.2、大小比较

[例]查询计算机系(IS)全体学生名单

select Sname as 学生姓名 from student where Sdept='IS';

[例]查询全体20岁以下的学生姓名和年龄

select Sname as 姓名,Sage as 年龄 from student where Sage<20;

1.3、确定范围

[例]查询所有在20到23岁(含20和23)的学生姓名、系别和年龄

select Sname as 姓名,Sdept as 系别,Sage as 年龄 from student where Sage between20 and 23;

注意between 小数 and 大数。

1.4、in和not in确定集合

[例]查询IS系和CS系的全体学生姓名和性别

select Sname as 姓名,Ssex as 性别 from student where Sdept='IS' or Sdept='CS';
select Sname as 姓名,Ssex as 性别 from student where Sdept in ('IS','CS');

[例]查询既不属于IS系,也不属于MA系的学生姓名和年龄

select Sname as 姓名,Sage as 年龄 from student where Sdept !='IS'and Sdept!='CS';
select Sname as 姓名,Sage as 年龄 from student where Sdept not in('IS','MA');

1.5、字符匹配(like % _ )

[例]查询所有姓李的学生姓名和性别

select Sname as 姓名,Ssex as 性别 from student where Sname like '李%';

[例]查询所有“2002”年入学的学生学号、姓名和系别

select Sno as 学号,Sname as 姓名,Sdept as 系别 from student where Sno like'2002%';

[例]查询所有不姓“刘”的学生信息

select * from student where Sname not like'刘%';

[例]查询名称含有“数据”的课程号、课程名及学分

select Cno as 课程号,Cname as 课程名,Ccredit as 学分 from course where Cname like '%数据%';

总结:

select * from course where cname like '%数据%';包含数据的字符串
select * from course where cname like '数据%';以数据开头的字符串
select * from course where cname like '%数据'; 以数据结尾的字符串

1.6、涉及空值的查询(is null)

[例]查询没有先修课的课程号和课程名

select Cno as 课程号,Cname as 课程名,Cpno from course where Cpno is null;

[例]查询所有有成绩的学生学号、课程号及成绩

select Sno as 学号,Cno as 课程号,Grade as 成绩 from SC where Grade is not null;

1.7、查询结果排序(order by )

[例]查询选修了3号课程的学生学号和成绩,结果按成绩降序排列。

select Sno as 学号,Grade as 成绩 from SC where Cno=3 order by Grade desc;

[例]查询选修了3号课程的学生学号和成绩,结果按成绩升序排列。

select Sno as 学号,Grade as 成绩 from SC where Cno=3 order by Grade asc;

1.8、聚集函数

count、sum、avg、max、min

[例]查询学生总数

select count(*) as 学生总数 from student;

[例]查询所有课程的总学分

select sum(Ccredit) as 所有课程总学分 from course;

[例]查询全体学生平均年龄

select avg(Sage) as 平均年龄 from student;

[例]查询1号课程的最高分

select max(Grade) as 1号课程的最高分 from SC where Cno=1;

1.9、分组统计(group by)

[例]查询男女学生各有多少人。

select Ssex as 性别,count(*) as 人数 from student group by Ssex;

[例]查询每个课程的课程号和平均分。

select Cno as 课程号,avg(Grade) as 平均分 from SC group by Cno;

【例】查询选修了3门课程以上(含3门)的学生学号和选修课程数。

select Sno as 学号 ,count(course.Cno) as 选修课程数
From SC,course
Where course.Cno=SC.Cno
Group by Sno
Having Count(course.Cno)>=3;

having 关键字后面直接跟聚集函数

在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value

【例】查询选修了2门课程以上(含2门,但不含1号课程),学生学号和选修课程数。

select Sno as 学号 ,count(course.Cno) as 选修课程数
From SC,course
Where course.Cno=SC.Cno and course.Cno !=1
Group by Sno
Having Count(course.Cno)>=2;

【例】查询不及格门数2门以上的学生学号。

Select Sno
from sc
Where sc.Grade<60
Group by Sno
Having count(Cno)>=2;

【例】查询有2名以上(含2名)学生选修了的课程号和选修人数。

Select Cno,count(Sno)
From SC
Group by Cno
Having count(sno)>=2

2、连接查询

(1)等值与非等值连接查询

[例]查询每个学生及其的选修课程情况

select student.Sno as 学号,course.Cno as 选修课号,SC.Grade as 成绩
from student,course,SC
where student.Sno=SC.Sno and course.Cno=SC.Cno ;

(2)自身连接

[例]查询每个学生的间接选修课

select SC.Sno as 学号,
FIRST.Cname as 直接选修课,
SECOND.Cname as 间接选修课
from SC,
course as FIRST,
course as SECOND
where FIRST.Cno=SC.Cno
and FIRST.Cpno=SECOND.Cno;

(3)外连接

[例]查询所有学生选修课程情况(含没选修课程的学生)

select student.Sno as 学号,
Sname as 姓名,
sc.Cno as 选修课程号
from student
LEFT OUTER JOIN SC ON student.Sno=SC.Sno;

join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据

JOIN: 如果表中有至少一个匹配,则返回行
LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
FULL JOIN: 只要其中一个表中存在匹配,就返回行
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。

3 、嵌套查询

(1)带有IN谓词的子查询( 属性 in (子查询的查询结果) )

【例】查询与王敏同学在同一个系的学生信息。

select *
from student
where Sdept in (
 select Sdept
 from student
 where Sname='王敏'
);

【例】查询不与王敏同学不在同一个系的学生信息。

select *
from student
where Sdept not in (
 select Sdept
 from student
 whereSname='王敏'
);

【例】查询选修了课程名是“信息系统”的学生学号和姓名。

select student.Sno as 学号, Sname as 姓名
from student,SC
where student.Sno=SC.Sno and Cno in (
 select Cno
 from course
 where Cname='信息系统'
)

【例】查询曾与刘晨一同上课的学生学号和姓名。(假设:一个课程只有一个上课班)

select distinct student.Sno as 学号, Sname as 姓名
from student,SC
where student.Sno=SC.Sno and Cno in (
 select Cno
 from SC,student
 where SC.Sno=student.Sno and student.Sno in (
 select Sno
 from student
 where student.Sname='刘晨'
 )
)
  • 内层in 查出刘晨的学号sno,外层in查出刘晨所上课程的课程号。

(2)带有比较运算符的子查询(=,>=,<=,<>或!=)

【例】查询与王敏同学在同一个系的所有学生信息  (=判断)

select *
from student
where Sdept=(
 select Sdept
 from student
 where Sname='王敏'
)

【例】查询每个学生超过该课程最低分的课程号。(同类课程不是最低分的),子查询的结果返回一个数的时候,这个子查询就可以当一个数用?可以使用in符号,或者大于小于符号。

select Cno
from SC a
where Grade> (
 select min(Grade)
 from SC b
 where a.Cno=b.Cno
)

【例】查询每个学生超过他选修课程平均成绩的课程号。

select Cno
from SC a
where Grade> (
 select avg(Grade)
 from SC b
 where a.Sno=b.Sno
)

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

  • ANY表示任何一个,ALL表示所有,可以用在子查询的括号前面

【例】查询其他系中比计算机系某一学生年龄小的学生姓名,性别、年龄和所在系。

select Sname as 姓名,Ssex as 性别, Sage as 年龄, Sdept as 所在系
from student
where Sage <(
 select Sage
 from student
 where Sdept='CS'
);

【例】查询其他系中比计算机系所有年龄都小的学生姓名和年龄。

select Sname as 姓名, Sage as 年龄
from student
where Sdept<>'CS' and Sage <ALL (
 select Sage
 from student
 where Sdept='CS'
);

(4 )带有Exists谓词的子查询

【例】查询所有选修了1号课程的学生姓名。

select Sname as 姓名
from student
where Exists (
 select *
 from SC
 where Cno=1 and Sno=Student.Sno
);

4、集合查询

(1)并UNION

【例】 查询计算机系的学生及年龄不大于19岁的学生详细信息。

select *
from student
where student.Sdept='CS'
union
select *
from student
where student.Sage<=19;

(2)交INTERSECT

【例】查询选修了1号课程的与年龄不大于19岁的 学生 详细信息 的交集。

Select *
from student,SC
where student.Sno=SC.Sno and SC.Cno=1
INTERSECT
Select *
from student
where student.Sage<=19;

(3)差EXCEPT

【例】查询计算机科学系的学生与年龄不大于19岁的学生详细信息的差集。

select *
from student
where student.Sdept='SC'
EXCEPT
select *
from student
where student.Sage<=19;

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • 抽取oracle数据到mysql数据库的实现过程

    在oracle数据库迁移至mysql数据库,除了oracle数据库模型移到mysql外,还一个重要环节就是要将oracle数据库的数据移到mysql数据库,本人尝试用过多款数据迁移程序,性能都不是很好的,于是自己动手写一个针对于oracle数据库数据迁移到mysql数据程序,其具体过程如下: 1.要抽取mysql表.字段及过滤条件的配制文件imp_data.sql 2.建立一个目录ETL_DIR 3.运行oracle数据库程序P_ETL_ORA_DATA,生成各表的csv数据文件,同时也生成一个

  • CMD命令操作MySql数据库的方法详解

    第一:mysql服务的启动和停止 net stop mysql net start mysql 第二:登陆 mysql –u用户名 [–h主机名或者IP地址] –p密码 说明:用户名是你登录的用户,主机名或者IP地址为可选项,如果是本地连接则不需要,远程连接需要填写,密码是对应用户的密码. 第三:增加新用户 格式:grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码" 如,增加一个用户user1密码为password1,让其可以在本机上登录,

  • Mysql5.6修改root密码教程

    一.MySQL5.6安装后,不能正常启用 压缩版MySQL,解压完后在:我的电脑->属性->高级->环境变量 选择PATH,在其后面添加mysql bin文件夹的路径 (如:C:\Program Files\MySQL\MySQL Server 5.6\bin ) 在my-default.ini修改或添加配置: [mysqld] basedir=C:\Program Files\MySQL\MySQL Server 5.6(mysql所在目录) datadir=C:\Program Fi

  • MySql闪退和服务无法启动的解决方法

    接触php那么久,但是安装环境却很生疏,遇到了很多问题,借着百度,整理了些下面的方法 问题一:mysql服务没有安装 解决办法: 在cmd操作下找到mysql的安装目录(注意要用管理员身份运行cmd) 在 mysql bin目录下 以管理员的权限 执行 mysqld -install命令 然后仍然以管理员的权限 net start mysql 开启Mysql服务了. 1.以管理员的权限 net stop mysql ,关闭mysql服务 2.以管理员的权限 mysqld -remove ,卸载m

  • 为什么MySQL数据库索引选择使用B+树?

    在进一步分析为什么MySQL数据库索引选择使用B+树之前,我相信很多小伙伴对数据结构中的树还是有些许模糊的,因此我们由浅入深一步步探讨树的演进过程,在一步步引出B树以及为什么MySQL数据库索引选择使用B+树! 学过数据结构的一般对最基础的树都有所认识,因此我们就从与我们主题更为相近的二叉查找树开始. 一.二叉查找树 (1)二叉树简介: 二叉查找树也称为有序二叉查找树,满足二叉查找树的一般性质,是指一棵空树具有如下性质: 1.任意节点左子树不为空,则左子树的值均小于根节点的值: 2.任意节点右子

  • Mysql的水平分表与垂直分表的讲解

    在我上一篇文章中说过,mysql语句的优化有局限性,mysql语句的优化都是围绕着索引去优化的,那么如果mysql中的索引也解决不了海量数据查询慢的状况,那么有了水平分表与垂直分表的出现(我就是记录一下自己的理解) 水平分表: 如上图所示:另外三张表表结构是一样的  只不过把数据进行分别存放在这三张表中,如果要insert 或者query 那么都需要对id进行取余 然后table名进行拼接,那么就是一张完整的table_name 但是如果我需要对name进行分表呢 或者对email呢? 那么就需

  • getdata table表格数据join mysql方法

    public function json_product_list($where, $order){ global $_M; $this->table = load::sys_class('tabledata', 'new'); $p = $_M['table']['product']; $s = $_M['table']['shopv2_product']; if($_M['config']['shopv2_open']){//开启在线订购时 $table = $p.' Left JOIN '

  • Mysql Update批量更新的几种方式

    通常情况下,我们会使用以下SQL语句来更新字段值: UPDATE mytable SET myfield='value' WHERE other_field='other_value'; 但是,如果你想更新多行数据,并且每行记录的各字段值都是各不一样,你会怎么办呢?刚开始你可能会想到使用循环执行多条UPDATE语句的方式,就像以下的python程序示例: for x in xrange(10): sql = ''' UPDATE mytable SET myfield='value' WHERE

  • 使用Python将Mysql的查询数据导出到文件的方法

    mysql官方提供了很多种connector,其中包括python的connector. 下载地址在:http://dev.mysql.com/downloads/connector/python/ 直接安装即可. 在python中: 1. 连接: import mysql.connector cnx = mysql.connector.connect(user='scott', password='tiger', host='127.0.0.1', database='employees')

  • MySQL常用SQL语句总结包含复杂SQL查询

    1.复杂SQL查询 1.1.单表查询 (1)选择指定的列 [例]查询全体学生的学号和姓名 select Sno as 学号,Sname as 姓名 from student; select Sno,Sname from student; (2)查询全部列 [例]查询全体学生的详细信息 select * from student; (3)对查询后的指定列进行命名 [例]查询全部学生的"姓名"及其"出生年"两列 select Sname as 姓名,(2014-Sage

  • MySQL常用命令与内部组件及SQL优化详情

    目录 1. 一些常用的 MySQL 命令 2.MySQL的内部组件结构 MySQL优化器与执行计划 SQL执行过程 词法分析器原理 查询优化器 4. SQL执行顺序 5.MySQL数据类型选择 数值类型 日期和时间 字符串 6.MySQL优化 MySQL优化分类 优化方法 SQL优化原则 EXPLAIN 查看执行计 processlist干预执行计划 SELECT语句务必指明字段名称 合理使用in和exits 关于not in 和not exists order by排序字段和where条件要匹

  • MongoDB与MySQL常用操作语句对照

    一.MongoDB对MySQL常用的SQL语句对应的实现 复制代码 代码如下: -------------- MySQL: SELECT * FROM user Mongo: db.user.find() -------------- MySQl: SELECT * FROM user WHERE name = 'foobar' Mongo: db.user.find({ 'name' : 'foobar' }) -------------- MySql: INSERT INTO user ('

  • oracle使用sql语句增加字段示例(sql删除字段语句)

    添加字段的语法:alter table tablename add (column datatype [default value][null/not null],-.); 修改字段的语法:alter table tablename modify (column datatype [default value][null/not null],-.); 删除字段的语法:alter table tablename drop (column); 添加.修改.删除多列的话,用逗号隔开. 使用alter

  • mysql 常用数据库语句 小练习

    闲来无事,上班时找了个练习来写,联系题目是针对sql server 2000的以下为mysql 一 单词解释(2分/个) 34分 Data 数据 Database 数据库 RDBMS 关系数据库管理系统 GRANT 授权 REVOKE 取消权限 DENY 拒绝权限 DECLARE 定义变量 PROCEDURE存储过程 事务 Transaction 触发器 TRIGGER 继续 continue 唯一 unqiue 主键 primary key 标识列 identity 外键 foreign ke

  • 查找MySQL中查询慢的SQL语句方法

    如何在mysql查找效率慢的SQL语句呢?这可能是困然很多人的一个问题,MySQL通过慢查询日志定位那些执行效率较低的SQL 语句,用--log-slow-queries[=file_name]选项启动时,mysqld 会写一个包含所有执行时间超过long_query_time 秒的SQL语句的日志文件,通过查看这个日志文件定位效率较低的SQL .下面介绍MySQL中如何查询慢的SQL语句 一.MySQL数据库有几个配置选项可以帮助我们及时捕获低效SQL语句 1,slow_query_log 这

  • 查询mysql中执行效率低的sql语句的方法

    一些小技巧1. 如何查出效率低的语句?在MySQL下,在启动参数中设置 --log-slow-queries=[文件名],就可以在指定的日志文件中记录执行时间超过long_query_time(缺省为10秒)的SQL语句.你也可以在启动配置文件中修改long query的时间,如: 复制代码 代码如下: # Set long query time to 8 seconds    long_query_time=8 2. 如何查询某表的索引?可使用SHOW INDEX语句,如: 复制代码 代码如下

  • Mysql Sql语句注释大全

    MySQL的SQL语句里面是可以加注释的,下面给大家介绍mysql sql语句注释大全,一起看看吧! 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- 创建 备份数据的 device USE master EXEC sp_addumpdevice'disk','testBack','c:\mssql7backup\MyNwind_1.dat' --- 开始

  • MySQL慢SQL语句常见诱因以及解决方法

    1. 无索引.索引失效导致慢查询 如果在一张几千万数据的表中以一个没有索引的列作为查询条件,大部分情况下查询会非常耗时,这种查询毫无疑问是一个慢SQL查询.所以对于大数据量的查询,需要建立适合的索引来优化查询. 虽然很多时候建立了索引,但在一些特定的场景下,索引还有可能会失效,所以索引失效也是导致慢查询的主要原因之一. 2. 锁等待 常用的存储引擎有 InnoDB 和 MyISAM,前者支持行锁和表锁,后者只支持表锁. 如果数据库操作是基于表锁实现的,试想下,如果一张订单表在更新时,需要锁住整张

  • MySql中sql语句执行过程详细讲解

    目录 前言: sql语句的执行过程: 查询缓存: 分析器: 优化器: 执行器: 总结 前言: 很多人都在使用mysql数据库,但是很少有人能够说出来整个sql语句的执行过程是怎样的,如果不了解执行过程的话,就很难进行sql语句的优化处理,也很难设计出来优良的数据库表结构.这篇文章主要是讲解一下sql语句的执行过程. sql语句的执行过程: 客户端.连接器.分析器.优化器.执行器.存储引擎几个阶段. 连接器的作用:管理链接.权限验证的处理. 分析器的作用:词法分析.语法分析. 优化器的作用:执行计

随机推荐