mysql 单表 子查询_04 数据库入门学习-单表查询、多表查询、子查询(示例代码)...

1.复制表

fz.gif

#创建了一张测试表

mysql>create table test (id int primary key auto_increment,name char(10));

#显示原表结构

mysql> desc test;

+-------+----------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+-------+----------+------+-----+---------+----------------+

| id | int(11) | NO | PRI | NULL | auto_increment |

| name | char(10) | YES | | NULL | |

+-------+----------+------+-----+---------+----------------+

#显示原表数据

mysql> select *from test;

+----+------+

| id | name |

+----+------+

| 1 | a |

+----+------+

#复制表

mysql> create table copy select *from test;

#显示复制表的结构

mysql> desc copy;

+-------+----------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-------+----------+------+-----+---------+-------+

| id | int(11) | NO | | 0 | |

| name | char(10) | YES | | NULL | |

+-------+----------+------+-----+---------+-------+

#显示复制表的数据

mysql> select *from copy;

+----+------+

| id | name |

+----+------+

| 1 | a |

+----+------+

fz.gif

总结:复制表,只是拷贝结构与数据,但是索引、 描述不能拷贝(自增)

2.单表查询

2.1完整的查询语句

fz.gif

#[]可选 {}必选 |或

select [distinct] {* | 字段名 | 聚合函数 | 表达式} from 表名

[where 条件

group by 字段名

having 条件

order by 字段名

limit 显示的条数]

#注意:关键字的顺序必须与上述语法一致

fz.gif

2.2执行顺序

1.from,先找到文件/表

2.where,拿着where的约束条件,与文件/表中的记录依次比较,正确的数据取出来

3.group,对取出来的数据进行分组

4.having,对分组的数据进行过滤

5.distinct,去重

6.order by,对筛选后的数据排序

7.limit,限制结果的显示条数

2.3简单查询

fz.gif

#准备表

create table stu(id int primary key auto_increment,name char(10),math float,english float);

insert into stu values(null,"赵云",90,30);

insert into stu values(null,"小乔",90,60);

insert into stu values(null,"小乔",90,60);

insert into stu values(null,"大乔",10,70);

insert into stu values(null,"李清照",100,100);

insert into stu values(null,"铁拐李",20,55);

insert into stu values(null,"小李子",20,55);

mysql> select *from stu;

+----+-----------+------+---------+

| id | name | math | english |

+----+-----------+------+---------+

| 1 | 赵云 | 90 | 30 |

| 2 | 小乔 | 90 | 60 |

| 3 | 小乔 | 90 | 60 |

| 4 | 大乔 | 10 | 70 |

| 5 | 李清照 | 100 | 100 |

| 6 | 铁拐李 | 20 | 55 |

| 7 | 小李子 | 20 | 55 |

+----+-----------+------+---------+

#避免重复

mysql> select distinct name from stu;

+-----------+

| name |

+-----------+

| 赵云 |

| 小乔 |

| 大乔 |

| 李清照 |

| 铁拐李 |

| 小李子 |

+-----------+

#四则运算

mysql> select name,math+10 as math from stu;

+-----------+------+

| name | math |

+-----------+------+

| 赵云 | 100 |

| 小乔 | 100 |

| 小乔 | 100 |

| 大乔 | 20 |

| 李清照 | 110 |

| 铁拐李 | 30 |

| 小李子 | 30 |

+-----------+------+

#显示格式

mysql> select

-> concat("name:",name),

-> concat("english:",english),

-> concat("math:",math)

-> from stu;

+----------------------+----------------------------+----------------------+

| concat("name:",name) | concat("english:",english) | concat("math:",math) |

+----------------------+----------------------------+----------------------+

| name:赵云 | english:30 | math:90 |

| name:小乔 | english:60 | math:90 |

| name:小乔 | english:60 | math:90 |

| name:大乔 | english:70 | math:10 |

| name:李清照 | english:100 | math:100 |

| name:铁拐李 | english:55 | math:20 |

| name:小李子 | english:55 | math:20 |

+----------------------+----------------------------+----------------------+

fz.gif

2.4 where

1. 比较运算符:> < >= <= <> !=

2. between 80 and 100 值在80到100之间

3. in(80,90,100) 值是80或90或100

4. like ‘egon[%|_]‘

%表示任意多字符

_表示一个字符

5. 逻辑运算符:在多个条件直接可以使用逻辑运算符 and or not

fz.gif

+----+-----------+------+---------+

| id | name | math | english |

+----+-----------+------+---------+

| 1 | 赵云 | 90 | 30 |

| 2 | 小乔 | 90 | 60 |

| 3 | 小乔 | 90 | 60 |

| 4 | 大乔 | 10 | 70 |

| 5 | 李清照 | 100 | 100 |

| 6 | 铁拐李 | 20 | 55 |

| 7 | 小李子 | 20 | 55 |

+----+-----------+------+---------+

#1. 比较运算符:> < >= <= <> !=

mysql> select *from stu where math>70;

+----+-----------+------+---------+

| id | name | math | english |

+----+-----------+------+---------+

| 1 | 赵云 | 90 | 30 |

| 2 | 小乔 | 90 | 60 |

| 3 | 小乔 | 90 | 60 |

| 5 | 李清照 | 100 | 100 |

+----+-----------+------+---------+

#2. between and

mysql> select *from stu where math between 80 and 100 ;

+----+-----------+------+---------+

| id | name | math | english |

+----+-----------+------+---------+

| 1 | 赵云 | 90 | 30 |

| 2 | 小乔 | 90 | 60 |

| 3 | 小乔 | 90 | 60 |

| 5 | 李清照 | 100 | 100 |

+----+-----------+------+---------+

#3. in

mysql> select *from stu where math in (80,90,100) ;

+----+-----------+------+---------+

| id | name | math | english |

+----+-----------+------+---------+

| 1 | 赵云 | 90 | 30 |

| 2 | 小乔 | 90 | 60 |

| 3 | 小乔 | 90 | 60 |

| 5 | 李清照 | 100 | 100 |

+----+-----------+------+---------+

#4. like %或_

mysql> select *from stu where name like ‘小_‘ ;

+----+--------+------+---------+

| id | name | math | english |

+----+--------+------+---------+

| 2 | 小乔 | 90 | 60 |

| 3 | 小乔 | 90 | 60 |

+----+--------+------+---------+

mysql> select *from stu where name like ‘李%‘ ;

+----+-----------+------+---------+

| id | name | math | english |

+----+-----------+------+---------+

| 5 | 李清照 | 100 | 100 |

+----+-----------+------+---------+

#5. and or not

mysql> select *from stu where math=90 and english=60;

+----+--------+------+---------+

| id | name | math | english |

+----+--------+------+---------+

| 2 | 小乔 | 90 | 60 |

| 3 | 小乔 | 90 | 60 |

+----+--------+------+---------+

fz.gif

2.5 group by

用于给数据分组

1.在生活中是为了方便管理

2.在数据库中是为了 方便统计

可以按照任意字段分组,但是分组完毕后,只能查看分组的字段,如果想查看组内信息,需要借助于聚合函数

聚合函数:

将一堆数据经过计算,得到一个数据

sum() 求和

avg() 求平均数

max()/min() 求最大值 / 最小值

count() 个数

fz.gif

#由于没有设置ONLY_FULL_GROUP_BY,于是也可以有结果,默认都是组内的第一条记录,但其实这是没有意义的

mysql> set global sql_mode=‘ONLY_FULL_GROUP_BY‘;

Query OK, 0 rows affected (0.00 sec)

mysql> quit #设置成功后,一定要退出,然后重新登录方可生效

#准备数据

create table emp (id int,name char(10),sex char,dept char(10),job char(10),salary double);

insert into emp values (1,"刘备","男","市场","总监",5800),

(2,"张飞","男","市场","员工",3000),

(3,"关羽","男","市场","员工",4000),

(4,"孙权","男","行政","总监",6000),

(5,"周瑜","男","行政","员工",5000),

(6,"小乔","女","行政","员工",4000),

(7,"曹操","男","财务","总监",10000),

(8,"司马懿","男","财务","员工",6000);

#查询每个部门有几个人

mysql> select dept,count(*)as 人数 from emp group by dept;

+--------+--------+

| dept | 人数 |

+--------+--------+

| 市场 | 3 |

| 行政 | 3 |

| 财务 | 2 |

+--------+--------+

#计算每个部门的平均工资

mysql> select dept,avg(salary)as 平均工资 from emp group by dept;

+--------+-------------------+

| dept | 平均工资 |

+--------+-------------------+

| 市场 | 4266.666666666667 |

| 行政 | 5000 |

| 财务 | 8000 |

+--------+-------------------+

fz.gif

2.6 having

用于对分组后的数据进行过滤

1. having不会单独出现 都是和group by 一起出现

2. where 发生在分组group by之前,因而Where中可以有任意字段,但是绝对不能使用聚合函数。

3. having发生在分组group by之后,因而Having中可以使用分组的字段,无法直接取到其他字段,可以使用聚合函数

fz.gif

#准备数据

mysql> create table emp (id int,name char(10),sex char,dept char(10),job char(10),salary double);

mysql> insert into emp values (1,"刘备","男","市场","总监",5800),

-> (2,"张飞","男","市场","员工",3000),

-> (3,"关羽","男","市场","员工",4000),

-> (4,"孙权","男","行政","总监",6000),

-> (5,"周瑜","男","行政","员工",5000),

-> (6,"小乔","女","行政","员工",4000),

-> (7,"曹操","男","财务","总监",10000),

-> (8,"司马懿","男","财务","员工",6000);

mysql> select *from emp;

+------+-----------+------+--------+--------+--------+

| id | name | sex | dept | job | salary |

+------+-----------+------+--------+--------+--------+

| 1 | 刘备 | 男 | 市场 | 总监 | 5800 |

| 2 | 张飞 | 男 | 市场 | 员工 | 3000 |

| 3 | 关羽 | 男 | 市场 | 员工 | 4000 |

| 4 | 孙权 | 男 | 行政 | 总监 | 6000 |

| 5 | 周瑜 | 男 | 行政 | 员工 | 5000 |

| 6 | 小乔 | 女 | 行政 | 员工 | 4000 |

| 7 | 曹操 | 男 | 财务 | 总监 | 10000 |

| 8 | 司马懿 | 男 | 财务 | 员工 | 6000 |

+------+-----------+------+--------+--------+--------+

#查询平均工资大于5000的部门

mysql> select dept,avg(salary)as 平均工资 from emp group by dept having avg(salary)>5000;

+--------+--------------+

| dept | 平均工资 |

+--------+--------------+

| 财务 | 8000 |

+--------+--------------+

#查询每个职位有多少人

mysql> select job,count(*)as 人数 from emp group by job;

+--------+--------+

| job | 人数 |

+--------+--------+

| 员工 | 5 |

| 总监 | 3 |

+--------+--------+

fz.gif

2.7 order by

用于对记录进行 排序

desc为降序

asc为升序

fz.gif

#准备数据

mysql> create table emp (id int,name char(10),sex char,dept char(10),job char(10),salary double);

mysql> insert into emp values (1,"刘备","男","市场","总监",5800),

-> (2,"张飞","男","市场","员工",3000),

-> (3,"关羽","男","市场","员工",4000),

-> (4,"孙权","男","行政","总监",6000),

-> (5,"周瑜","男","行政","员工",5000),

-> (6,"小乔","女","行政","员工",4000),

-> (7,"曹操","男","财务","总监",10000),

-> (8,"司马懿","男","财务","员工",6000);

mysql> select *from emp;

+------+-----------+------+--------+--------+--------+

| id | name | sex | dept | job | salary |

+------+-----------+------+--------+--------+--------+

| 1 | 刘备 | 男 | 市场 | 总监 | 5800 |

| 2 | 张飞 | 男 | 市场 | 员工 | 3000 |

| 3 | 关羽 | 男 | 市场 | 员工 | 4000 |

| 4 | 孙权 | 男 | 行政 | 总监 | 6000 |

| 5 | 周瑜 | 男 | 行政 | 员工 | 5000 |

| 6 | 小乔 | 女 | 行政 | 员工 | 4000 |

| 7 | 曹操 | 男 | 财务 | 总监 | 10000 |

| 8 | 司马懿 | 男 | 财务 | 员工 | 6000 |

#按单列排序

#默认是ASC升序

mysql> SELECT * FROM emp ORDER BY salary;

+------+-----------+------+--------+--------+--------+

| id | name | sex | dept | job | salary |

+------+-----------+------+--------+--------+--------+

| 2 | 张飞 | 男 | 市场 | 员工 | 3000 |

| 3 | 关羽 | 男 | 市场 | 员工 | 4000 |

| 6 | 小乔 | 女 | 行政 | 员工 | 4000 |

| 5 | 周瑜 | 男 | 行政 | 员工 | 5000 |

| 1 | 刘备 | 男 | 市场 | 总监 | 5800 |

| 4 | 孙权 | 男 | 行政 | 总监 | 6000 |

| 8 | 司马懿 | 男 | 财务 | 员工 | 6000 |

| 7 | 曹操 | 男 | 财务 | 总监 | 10000 |

+------+-----------+------+--------+--------+--------+

#升序

mysql> SELECT * FROM emp ORDER BY salary ASC;

+------+-----------+------+--------+--------+--------+

| id | name | sex | dept | job | salary |

+------+-----------+------+--------+--------+--------+

| 2 | 张飞 | 男 | 市场 | 员工 | 3000 |

| 3 | 关羽 | 男 | 市场 | 员工 | 4000 |

| 6 | 小乔 | 女 | 行政 | 员工 | 4000 |

| 5 | 周瑜 | 男 | 行政 | 员工 | 5000 |

| 1 | 刘备 | 男 | 市场 | 总监 | 5800 |

| 4 | 孙权 | 男 | 行政 | 总监 | 6000 |

| 8 | 司马懿 | 男 | 财务 | 员工 | 6000 |

| 7 | 曹操 | 男 | 财务 | 总监 | 10000 |

+------+-----------+------+--------+--------+--------+

#降序

mysql> SELECT * FROM emp ORDER BY salary DESC;

+------+-----------+------+--------+--------+--------+

| id | name | sex | dept | job | salary |

+------+-----------+------+--------+--------+--------+

| 7 | 曹操 | 男 | 财务 | 总监 | 10000 |

| 4 | 孙权 | 男 | 行政 | 总监 | 6000 |

| 8 | 司马懿 | 男 | 财务 | 员工 | 6000 |

| 1 | 刘备 | 男 | 市场 | 总监 | 5800 |

| 5 | 周瑜 | 男 | 行政 | 员工 | 5000 |

| 3 | 关羽 | 男 | 市场 | 员工 | 4000 |

| 6 | 小乔 | 女 | 行政 | 员工 | 4000 |

| 2 | 张飞 | 男 | 市场 | 员工 | 3000 |

+------+-----------+------+--------+--------+--------+

按多列排序:

#先按照职位排序,如果职位相同,则按照薪资排序

mysql> SELECT * from emp ORDER BY job, salary DESC;

+------+-----------+------+--------+--------+--------+

| id | name | sex | dept | job | salary |

+------+-----------+------+--------+--------+--------+

| 8 | 司马懿 | 男 | 财务 | 员工 | 6000 |

| 5 | 周瑜 | 男 | 行政 | 员工 | 5000 |

| 3 | 关羽 | 男 | 市场 | 员工 | 4000 |

| 6 | 小乔 | 女 | 行政 | 员工 | 4000 |

| 2 | 张飞 | 男 | 市场 | 员工 | 3000 |

| 7 | 曹操 | 男 | 财务 | 总监 | 10000 |

| 4 | 孙权 | 男 | 行政 | 总监 | 6000 |

| 1 | 刘备 | 男 | 市场 | 总监 | 5800 |

+------+-----------+------+--------+--------+--------+

fz.gif

2.8 limit

用于限制显示的条数

limit [start,]count

fz.gif

#准备数据

mysql> create table emp (id int,name char(10),sex char,dept char(10),job char(10),salary double);

mysql> insert into emp values (1,"刘备","男","市场","总监",5800),

-> (2,"张飞","男","市场","员工",3000),

-> (3,"关羽","男","市场","员工",4000),

-> (4,"孙权","男","行政","总监",6000),

-> (5,"周瑜","男","行政","员工",5000),

-> (6,"小乔","女","行政","员工",4000),

-> (7,"曹操","男","财务","总监",10000),

-> (8,"司马懿","男","财务","员工",6000);

mysql> select *from emp;

+------+-----------+------+--------+--------+--------+

| id | name | sex | dept | job | salary |

+------+-----------+------+--------+--------+--------+

| 1 | 刘备 | 男 | 市场 | 总监 | 5800 |

| 2 | 张飞 | 男 | 市场 | 员工 | 3000 |

| 3 | 关羽 | 男 | 市场 | 员工 | 4000 |

| 4 | 孙权 | 男 | 行政 | 总监 | 6000 |

| 5 | 周瑜 | 男 | 行政 | 员工 | 5000 |

| 6 | 小乔 | 女 | 行政 | 员工 | 4000 |

| 7 | 曹操 | 男 | 财务 | 总监 | 10000 |

| 8 | 司马懿 | 男 | 财务 | 员工 | 6000 |

+------+-----------+------+--------+--------+--------+

# 看看表里前三条数据

mysql> select *from emp limit 3;

+------+--------+------+--------+--------+--------+

| id | name | sex | dept | job | salary |

+------+--------+------+--------+--------+--------+

| 1 | 刘备 | 男 | 市场 | 总监 | 5800 |

| 2 | 张飞 | 男 | 市场 | 员工 | 3000 |

| 3 | 关羽 | 男 | 市场 | 员工 | 4000 |

+------+--------+------+--------+--------+--------+

# 看看表里的3-5条

mysql> select *from emp limit 2,3;

+------+--------+------+--------+--------+--------+

| id | name | sex | dept | job | salary |

+------+--------+------+--------+--------+--------+

| 3 | 关羽 | 男 | 市场 | 员工 | 4000 |

| 4 | 孙权 | 男 | 行政 | 总监 | 6000 |

| 5 | 周瑜 | 男 | 行政 | 员工 | 5000 |

+------+--------+------+--------+--------+--------+

# 查看工资最高的那个人的信息

mysql> select *from emp order by salary desc limit 1;

+------+--------+------+--------+--------+--------+

| id | name | sex | dept | job | salary |

+------+--------+------+--------+--------+--------+

| 7 | 曹操 | 男 | 财务 | 总监 | 10000 |

+------+--------+------+--------+--------+--------+

fz.gif

3.多表查询

在多个表中查询需要的数据

例如:有班级表和学生表

给你一个班级名称, 请查询所有的学员数据

先查班级表 得到一个班级的id, 再根据id去学院表查询对应的学员

fz.gif

#准备数据:

create table emp (id int,name char(10),sex char,dept_id int);

insert emp values(1,"大黄","m",1);

insert emp values(2,"老王","m",2);

insert emp values(3,"老李","w",30);

mysql> select *from emp;

+------+--------+------+---------+

| id | name | sex | dept_id |

+------+--------+------+---------+

| 1 | 大黄 | m | 1 |

| 2 | 老王 | m | 2 |

| 3 | 老李 | w | 30 |

+------+--------+------+---------+

create table dept (id int,name char(10));

insert dept values(1,"市场");

insert dept values(2,"财务");

mysql> select *from dept;

+------+--------+

| id | name |

+------+--------+

| 1 | 市场 |

| 2 | 财务 |

| 3 | 行政 |

+------+--------+

insert dept values(3,"行政");

fz.gif

多表查询的方式

1.笛卡尔积查询

fz.gif

#什么是笛卡尔积,用坐标中的一条记录,去链接另一张表的所有记录

#就像是把两张表的数据做了一个乘法

#这将导致产生大量的无用重复数据

#我们要的效果是:员工表中的部门id与部门表中的id相同,就拼接在一起

#用 where 筛选出正确的数据

mysql> select *from emp,dept where emp.dept_id=dept.id;

+------+--------+------+---------+------+--------+

| id | name | sex | dept_id | id | name |

+------+--------+------+---------+------+--------+

| 1 | 大黄 | m | 1 | 1 | 市场 |

| 2 | 老王 | m | 2 | 2 | 财务 |

+------+--------+------+---------+------+--------+

fz.gif

2.内连接查询

fz.gif

#inner join...on...

mysql> select *from emp inner join dept on emp.dept_id=dept.id;

+------+--------+------+---------+------+--------+

| id | name | sex | dept_id | id | name |

+------+--------+------+---------+------+--------+

| 1 | 大黄 | m | 1 | 1 | 市场 |

| 2 | 老王 | m | 2 | 2 | 财务 |

+------+--------+------+---------+------+--------+

#与from...where...一样,只不过inner join...on...是专门用于多表连接的

fz.gif

3.左外连接

fz.gif

left join

#左边员工表中的数据完全显示,右边表中的数据匹配上才显示,没有则NULL

mysql> select *from emp left join dept on emp.dept_id=dept.id;

+------+--------+------+---------+------+--------+

| id | name | sex | dept_id | id | name |

+------+--------+------+---------+------+--------+

| 1 | 大黄 | m | 1 | 1 | 市场 |

| 2 | 老王 | m | 2 | 2 | 财务 |

| 3 | 老李 | w | 30 | NULL | NULL |

+------+--------+------+---------+------+--------+

fz.gif

4.右外连接

fz.gif

right join

#右边表中的数据完全显示,左边表中的数据匹配上才显示

mysql> select *from emp right join dept on emp.dept_id=dept.id;

+------+--------+------+---------+------+--------+

| id | name | sex | dept_id | id | name |

+------+--------+------+---------+------+--------+

| 1 | 大黄 | m | 1 | 1 | 市场 |

| 2 | 老王 | m | 2 | 2 | 财务 |

| NULL | NULL | NULL | NULL | 3 | 行政 |

+------+--------+------+---------+------+--------+

fz.gif

5. 全外链接

fz.gif

#全外连接:在内连接的基础上增加左边有右边没有的和右边有左边没有的结果

#mysql不支持 full join,但是可以用union间接实现

union:表示合并查询,意思是把多个查询结果合并在一起显示,要求是被合并的表结构必须相同,默认去除重复

union all:合并但是不去除重复

sql> select *from emp right join dept on emp.dept_id = dept.id

->union

->select *from emp left join dept on emp.dept_id = dept.id;

+------+--------+------+---------+------+--------+

| id | name | sex | dept_id | id | name |

+------+--------+------+---------+------+--------+

| 1 | 大黄 | m | 1 | 1 | 市场 |

| 2 | 老王 | m | 2 | 2 | 财务 |

| NULL | NULL | NULL | NULL | 3 | 行政 |

| 3 | 老李 | w | 30 | NULL | NULL |

+------+--------+------+---------+------+--------+

fz.gif

6.三表查询

fz.gif

#准备数据

#老师表

create table tec(id int,name char(10));

insert into tec value(1,"egon");

insert into tec value(2,"yyh");

mysql> select *from tec;

+------+------+

| id | name |

+------+------+

| 1 | egon |

| 2 | yyh |

+------+------+

#学生表

create table stu(id int,name char(10));

insert into stu value(1,"大傻");

insert into stu value(2,"中傻");

insert into stu value(3,"小傻");

mysql> select *from stu;

+------+--------+

| id | name |

+------+--------+

| 1 | 大傻 |

| 2 | 中傻 |

| 3 | 小傻 |

#关联表

create table s_t(s_id int,t_id int);

insert into s_t value(1,2);

insert into s_t value(2,2);

insert into s_t value(3,1);

mysql> select *from s_t;

+------+------+

| s_id | t_id |

+------+------+

| 1 | 2 |

| 2 | 2 |

| 3 | 1 |

+------+------+

#需求 找出 yyh 这个老师 教过的学生信息

#思路:

# 第一步,到关系表中去查询,哪些老师教过哪些学生(学生的id),形成了一个临时表

mysql> select *from tec inner join s_t on tec.id=s_t.t_id;

+------+------+------+------+

| id | name | s_id | t_id |

+------+------+------+------+

| 2 | yyh | 1 | 2 |

| 2 | yyh | 2 | 2 |

| 1 | egon | 3 | 1 |

+------+------+------+------+

# 第二步, 将上一步得到临时表与学生表进行连接

mysql> select *from tec inner join s_t on tec.id=s_t.t_id

-> inner join stu on s_id=stu.id;

+------+------+------+------+------+--------+

| id | name | s_id | t_id | id | name |

+------+------+------+------+------+--------+

| 2 | yyh | 1 | 2 | 1 | 大傻 |

| 2 | yyh | 2 | 2 | 2 | 中傻 |

| 1 | egon | 3 | 1 | 3 | 小傻 |

+------+------+------+------+------+--------+

# 第三步,加上额外的筛选条件,老师的name是yyh

mysql> select tec.name as 老师名字 ,stu.name as 学生名字 from tec inner join s_t on tec.id=s_t.t_id

-> inner join stu on s_id=stu.id

-> where tec.name=‘yyh‘;

+--------------+--------------+

| 老师名字 | 学生名字 |

+--------------+--------------+

| yyh | 大傻 |

| yyh | 中傻 |

+--------------+--------------+

fz.gif

4.子查询

子查询:将上一次查询的结果作为本次查询的原始数据(或是查询条件)

fz.gif

#准备数据

create table emp (id int,name char(10),sex char,dept char(10),job char(10),salary double);

insert into emp values (1,"刘备","男","市场","总监",5800),

(2,"张飞","男","市场","员工",3000),

(3,"关羽","男","市场","员工",4000),

(4,"孙权","男","行政","总监",6000),

(5,"周瑜","男","行政","员工",5000),

(6,"小乔","女","行政","员工",4000),

(7,"曹操","男","财务","总监",10000),

(8,"司马懿","男","财务","员工",6000);

#需求:查询出工资最高的人的信息

#先查询出最高工资是多少

#拿着最高工资去表中看,谁的工资和最高工资匹配

mysql> select *from emp where salary=(select max(salary) from emp);

+------+--------+------+--------+--------+--------+

| id | name | sex | dept | job | salary |

+------+--------+------+--------+--------+--------+

| 7 | 曹操 | 男 | 财务 | 总监 | 10000 |

+------+--------+------+--------+--------+--------+

#in 关键字子查询

#查询平均年龄大于25的部门名称

#1.求每个部门的平均年龄

select avg(age) from emp group by dept_id;

#2.筛选结果

select dept_id,avg(age) as a from emp group by dept_id having a > 25;

#3.最后

select name from dept where id in (select dept_id from emp group by dept_id having avg(age) > 25);

#子查询方式:

#平均年龄大于25的部门有哪些?

#先要求出每个部门的平年龄!每个表示什么? 分组

select name from dept where id in (select dept_id from emp group by dept_id having avg(age) > 25);

#多表查询方式:

#先把数据拼接到一起 在加以筛选

select dept.name from emp inner join dept

on emp.dept_id = dept.id

group by dept.name

having avg(age) >25;

#exists关键字子查询

#exists 后跟子查询 子查询有结果是为True 没有结果时为False

#为true时外层执行 为false外层不执行

select *from emp where exists (select *from emp where salary > 1000);

select (exists (select *from emp where salary > 10000));

fz.gif

2008数据库实验 1.SQL SEVER 2000的系统工具、使用交互方式建库、建表 2.T—SQL的简单查询、连接查询 3.子查询及组合 4.数据控制、数据导入/导出、数据备份和恢复 实验1 SQL SEVER 2000的系统工具、使用交互方式建库、建表实验 实验目的和要求:了解SQL SEVER 2000的功能及组成,熟练掌握利用SQL SEVER 2000企业管理器和查询分析器创建数据库、表、索引和修改表结构及向数据库输入数据、修改数据和删除数据的操作方法和步骤,掌握定义数据约束条件的操作。 实验内容和步骤: (1)熟悉SQL SEVER 2000的界面和操作。 (3)熟悉企业管理器和查询分析器的界面和操作。 (3)创建数据库和查看数据库属性。 (4)创建表、确定表的主码和约束条件。 (5)查看和修改表的结构。 (6)向数据库输入数据,观察违反列级约束时出现的情况。 (7)修改数据。 (8)删除数据,观察违反表级约束时出现的情况。 实验2 T—SQL的简单查询、连接查询 实验目的和要求:,了解SQL语句的数据定义与数据更新功能,了解SQL语句的查询功能,掌握SQL中的数据定义语句的用法,熟练掌握SQL中的插入、修改和删除语句的操作,熟练掌握使用SQL语句进行数据库的简单查询、连接查询。 实验内容和步骤: (1)在SQL SEVER 2000的查询分析器里,用SQL语句建库、建表并插入记录。 (2)修改表结构,包括修改属性列的数据类型,增加新的属性列,删除已有的属性列。 (3)使用单个元组和多元组插入。 (4)简单查询操作,包括投影、选择、数据排序、模糊匹配查询等。如果结果不正确,要进行修改,直至正确为止。 (5)连接查询操作,包括等值连接、自然连接、一般连接、自身连接、外连接。 实验3 子查询及组合 实验目的和要求:了解SQL语句的查询功能,理解视图的概念。熟练掌握使用SQL语句进行数据库的嵌套查询及组合查询的操作;掌握视图创建语句和视图的使用方法,加深对视图作用的理解。 实验内容和步骤: (1)在DBMS的交互式环境里,用SQL语句建库、建表并插入记录。 (2)使用In、比较符和Exists操作符进行嵌套查询操作。 (3)分组查询,包括分组条件表达、选择组条件表达的方法。 (4)集合查询。 (5)使用视图创建语句建视图,通过视图查询数据 (6)带子查询的修改和删除 (7)通过视图修改和删除数据 实验4 数据控制、数据的导入/导出、数据库备份和恢复 实验目的和要求:掌握数据控制(安全性)的方法,了解SQL SEVER 2000的数据备份和恢复机制,掌握SQL SEVER 2000中数据库备份和恢复的方法。 实验内容和步骤: (1)使用SQL对数据进行安全性控制,包括授权和权利收回。 (2)查看授权和权利收回后的结果 (3)SQL SEVER 2000工具对表中的数据导出到其它格式的文件。 (4)将其它格式的文件数据导入到数据库中。 (5)使用SQL SEVER 2000工具创建一个数据库的备份(海量备份、增量备份)。 (6)使用SQL SEVER 2000工具及所创建的数据库备份恢复这个数据库
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值