单表查询、多表查询和子查询

查询语句:

select SELECT-LIST from  TB where QYAKUDUCATION;

简单查询:

select * from TB_NAME;

select FIED1,FIED2 from TB_NAME; 投影

select [distinct] * from TB_NAME where QYAKUDUCATION;选择  #distinct重复的值只显示一次

from子句:要查询的关系   表,多个表,其他的select语句

where子句:指定布尔关系表达式,

= , >   , >=  ,  <=  , <

<> 不等于

<=> 完全不等于,NULL值也可以进行比较

也可以使用算数表达式

mysql> select NAME  from students where AGE+1>20

与或非关系:

and   &&

or    ||

not    !

xor 异或

between ... and ...  在谁和谁之间

like ‘‘ 比较操作

%:任意长度。任意字符

_:任意单个字符

regexp或者 rlike支持正则表达式

in (  ) 列表

is null 判断是否为空

is not null 判断是否不空

where条件应用:

mysql> select NAME  from students where AGE>20 and GENDER=‘M‘;

mysql> select NAME  from students where AGE>20 or GENDER=‘M‘;

mysql> select NAME  from students where not AGE>20;

查询年龄不大于20并且不为男性的人

mysql> select NAME  from students where not AGE>20 and not GENDER=‘M‘;

mysql> select NAME  from students where not (AGE>20 or  GENDER=‘M‘);

查询年龄20-25之间的所有人

mysql> select NAME  from students where AGE>=20 and AGE<=25;

mysql> select NAME  from students where  AGE between 20 and 25;

查询名字为Y开头的所有人

mysql> select NAME  from students where  NAME like ‘Y%‘;

查询Y开头。后面跟四个字符的人名

mysql> select NAME  from students where  NAME like ‘Y____‘;

查询整个名字中 包含 ing字符串的人名

mysql> select NAME  from students where  NAME like ‘%ing%‘;

查询用户名称中以大写字母M N  Y开头的

mysql> select NAME  from students where  NAME like ‘M%‘ or  NAME like ‘N%‘ or NAME like ‘Y%‘;

mysql> select NAME  from students where  NAME rlike ‘^[MNY].*$‘;

查询年龄为18 20 25的姓名

mysql> select NAME  from students where  AGE=18  or AGE=20 or AGE=25;

mysql> select NAME  from students where  AGE in (18,20,25);

查询CID2为空的

mysql> select NAME  from students where  CID2 is NULL;

查询CID2不空的

mysql> select NAME  from students where  CID2 is NOT NULL;

排序:order by FIELD_NAME {ASC|DESC} 默认是升序

根据姓名进行排序:升序

mysql> select NAME  from students where  CID2 is NOT NULL order by NAME;

降序

mysql> select NAME  from students where  CID2 is NOT NULL order by NAME desc;

给字段取别名:AS

mysql> select NAME AS Student_Name  from students;

直接进行算数运算

mysql> select 2+1 AS SUM;

+-----+

| SUM |

+-----+

|   3 |

+-----+

1 row in set (0.00 sec)

limit N: 只显示查询到的前N个

limit N,X: 查询到的前N个不显示。从N+1个开始显示,共显示X个

mysql> select NAME AS Student_Name  from students limit 2;

mysql> select NAME AS Student_Name  from students limit 2,3;

聚合计算:

avg()平均数

max()

min()

sum()

count() 一共有多少个

求所有同学的平均年龄

mysql>select avg(AGE) from students;

查找年龄最大的同学

mysql>select max(AGE) from students;

查找年龄最小的同学

mysql>select min(AGE) from students;

查找年龄之和

mysql>select sum(AGE) from students;

查找一共有多少人

mysql>select count(AGE) from students;

group by 分组:

having  QUALIFICATION  过滤条件

查找男同学和女同学的平均年龄

mysql>select AGE,Gender from  students group by Gender;

mysql>select avg(AGE) from students group by Gender;

统计选择CID1课程的同学的个数

mysql>select count(CID1) AS Persons,CID1 from students group by CID1;

显示哪些课程人数大于2个人的  这里必须用having而不能使用where

mysql>select count(CID1) AS persons,CID1 from students group by CID1 having Persons>=2;

多表查询:

连接:

交叉连接: 笛卡尔乘积

自然连接:仅保留具有等值关系的

外连接:用于显示查询包含NULL

左外连接: ...left join ...on...

又外连接: ... right join ...on ...

自连接:

自然连接:

mysql>select students.NAME,courses.CNAME from students,courses where students.CID1 = courses.CID;

mysql>select s.NAME,c.CNAME from students AS s,courses AS c where s.CID1 = c.CID;

外连接:

显示同学对应的课程,有人选就显示有。没有人选就显示人物对应的课程为NULL

select s.NAME, c.CNAME  from students as s left join   as c on s.CID1=c.CID;

显示同学对应的课程,有人选就显示。没有人选就显示课程对应的人名为NULL

select s.NAME, c.CNAME  from students as s right join as c on s.CID1=c.CID;

自连接:

select c.NAME as teacher,  s.NAME as stu from  stufents as s,students as c where c.TID=s.CID;

子查询:

比较操作中使用子查询:子查询只能返回一个单值

in():使用子查询

在from中使用子查询

联合查询:

union

DISTINCT:选择唯一的结果集

找students表中年龄大雨平均年龄的同学

select NAME from students  where AGE > (select avg(AGE) from students);

找到同名和老师年龄一样的

select NAME from students  where AGE in (select AGE from tutors );

在from中使用子查询

select NAME ,AGE from (select NAME,AGE from students) as t where t.AGE  >=20;

union把2个查询语句的结果联合起来

(select NAME,AGE from students )union (select TNAME ,AGE from tutors);

找出CID2中没有同学选用的课程号对应的课程名

select Cname,CID2 from ( select c.Cname,s.CID2 from students as s , courses as c where s.TID=c.TID ) as d  where d.CID2 is NULL;

挑出没有教授任何课程的老师,每个老师及其所教授课程的对应关系在courses表中

select Tname from tutors where TID not in ( select distinct TID from courses );

找出students表中CID1有两个或两个以上同学学习了的同一个课程的课程名称

select Cname from courses where CID in (select CID1 from students  group by CID1  having count (CID1) >=2);

视图:存储下来的select语句

基于基表的查询视图

view

mysql> help create view

CREATE

[OR REPLACE]

[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]

[DEFINER = { user | CURRENT_USER }]

[SQL SECURITY { DEFINER | INVOKER }]

VIEW view_name [(column_list)]

AS select_statement

[WITH [CASCADED | LOCAL] CHECK OPTION]

create view sct as    select NAME from students  where AGE in (select AGE from tutors );

show tables会发现select的变成了一张表

select * from sct;

mysql> help drop view

DROP VIEW [IF EXISTS]

view_name [, view_name] ...

[RESTRICT | CASCADE]

show create view sct\G 可以显示创建sct视图所使用的完整语句

show create table crouses; 查看创建crouses表的完整语句

# mysql -e ‘create database edb;‘可以直接往mysql里创建数据库

时间: 2024-12-26 08:35:30

单表查询、多表查询和子查询的相关文章

表连接查询与where后使用子查询的性能分析。

子查询就是在一条查询语句中还有其它的查询语句,主查询得到的结果依赖于子查询的结果. 子查询的子语句可以在一条sql语句的FROM,JOIN,和WHERE后面,本文主要针对在WHERE后面使用子查询与表连接查询的性能做出一点分析. 对于表连接查询和子查询性能的讨论众说纷纭,普遍认为的是表连接查询的性能要高于子查询.本文将从实验的角度,对这两种查询的性能做出验证,并就实验结果分析两种查询手段的执行流程对性能的影响. 首先准备两张表 1,访问日志表mm_log有150829条记录(相关sql文件已放在

mysql表数据增删改查、子查询

//操作数据表中的记录 create table user2( id smallint unsigned primary key AUTO_INCREMENT, username varchar(20) not null, password varchar(20) not null, age tinyint not null default 10, sex boolean ) --insert-- insert user2 values(null,'孙千','123',25,1);//自增序列可

1.子查询知识体系,单行子查询,多行子查询

 1查询工资比scott高的员工信息 A 第一步:查询出scott这个员工的工资 select sal from emp where ename = 'SCOTT'; B 第二步:查询出工资比scott高的员工信息 select * fromemp where sal >3000; 总结: 子查询的本质:多个select语句的嵌套 2:子查询的知识体系搭建 A 合理的书写风格 B 子查询外面()不要忘记 C 子查询和主查询可以查询的是同一张表,也可以不是同一张表 只要子查询返回的结果,主查询

Hibernate 笔记 HQL查询 条件查询,聚集函数,子查询,导航查询

本笔记继续使用dept部门表,emp员工表,一对多多对一双向映射. 1 条件查询 1.1    查询 员工表emp中 年龄eage小于30,月薪esal大于20000的员工姓名ename sql:select ename from emp where eage<? and esal >?; hql: select ename from Emp where eage<? and esal >? 1.2 问号的设置与别名 问号(?)的设置使用.setParameter(位置, 属性值)

子查询一(WHERE中的子查询)

子查询 子查询就是指的在一个完整的查询语句之中,嵌套若干个不同功能的小查询,从而一起完成复杂查询的一种编写形式,为了让读者更加清楚子查询的概念. 子查询返回结果子查询可以返回的数据类型一共分为四种: 单行单列:返回的是一个具体列的内容,可以理解为一个单值数据: 单行多列:返回一行数据中多个列的内容: 多行单列:返回多行记录之中同一列的内容,相当于给出了一个操作范围: 多行多列:查询返回的结果是一张临时表: 在WHERE子句中使用子查询 在WHERE子句之中处理单行单列子查询.多行单列子查询.单行

mysql 数据操作 子查询 带比较运算符的子查询

带比较运算符的子查询 #比较运算符:=.!=.>.>=.<.<=.<> #查询大于所有人平均年龄的员工名与年龄 思路 先拿到所有人的平均年龄然后 再用另外一条sql语句 进行比较 拿所有员工的年龄 > 所有人的平均年龄 做比较 mysql> select name,age from employee where age >(select avg(age) from employee) ; +------+------+ | name | age | +

Mysql数据库理论基础之五--SELECT单多表查询、子查询、别名

一.简介 由MySQL AB公司开发,是最流行的开放源码SQL数据库管理系统,主要特点: 1.是一种数据库管理系统 2.是一种关联数据库管理系统 3.是一种开放源码软件,且有大量可用的共享MySQL软件 4.MySQL数据库服务器具有快速.可靠和易于使用的特点 5.MySQL服务器工作在客户端/服务器模式下,或嵌入式系统中 InnoDB存储引擎将InnoDB表保存在一个表空间内,该表空间可由数个文件创建.这样,表的大小就能超过单独文件的最大容量.表空间可包括原始磁盘分区,从而使得很大的表成为可能

python开发mysql:单表查询&amp;多表查询

一 单表查询,以下是表内容 1 一 having 过滤 2 1.1 having和where 3 select * from emp where id > 15; 4 解析过程;from > where 找到数据 > 分组(没有默认一个组)> select 打印 where是出结果之前 5 select * from emp having id > 15; 6 解析过程;from > where 找到数据(没有约束条件,就是整个表)) > 分组(没有默认一个组)&

sql的基础语句-单行函数,dual,数字函数,日期函数,表连接,集合运算,分组报表,单行子查询,多行子查询

3. 单行函数 3.1 转换函数 select ascii('A'),chr(65) from dual; select to_char(1243123),1231451 from dual;靠左边的就是字符串,靠右边的就是数字 select to_char(123512a121) from dual;   --错误的写法,没有引号表示数字,但是数字里面包含了字母,不合法的输入值 select to_number('123141211') from dual; select to_number(