目录
1.连接
1.1 内连接
inner join:内连接,只取得键值一致的部分,代表选择的是两个表键值交叉的部分。语法如下:
SELECT 列名1,列名2... FROM 表1 INNER JOIN 表2 ON 表1.列=表2.列 WhERE 条件语句;
1.2 左连接
left join:左连接,代表选择的是前面一个表的全部。左连接是以左表为标准,只查询在左边表中
存在的数据。语法如下:
SELECT 列名1 FROM 表1 LEFT OUTER JOIN 表2 ON 表1.列=表2.列 WhERE 条件语句;
1.3右连接
right join:右连接,代表选择的是后面一个表的全部。右连接将会以右边作为基准,进行检索。
语法如下:
SELECT 列名1 FROM 表1 RIGHT OUTER JOIN 表2 ON 表1.列=表2.列 WhERE 条件语句;
1.4自连接
自连接,自连接顾名思义就是自己跟自己连接,参与连接的表都是同一张表。(通过给表取别名虚
拟出)
例如:查找比自己mgr岁数大的员工和mgr的姓名和年龄
mysql>create table t4(
-> name char(20),
-> age int,
-> mgr char(20)
-> );
mysql>insert into t4 values ('xiaoming',29,'xiao'),('xiaohong',26,'xiao'),('zhouyi',19,'zhou'),('xiao',28,'boss'),('zhou',30,'boss');
mysql>select e.name,e.age,m.name,m.age from t4 e join t4 m on e.mgr=m.name and e.age>m.age;
mysql>select e.name,e.age,m.name,m.age from t4 e,t4 m where e.mgr=m.name and e.age>m.age;
1.5交叉连接
交叉连接:不适用任何匹配条件。生成笛卡尔积。
例如:
mysql>select * from dept,t4;
2.子查询
子查询,子查询是将一个查询语句嵌套在另一个查询语句中。内部嵌套其他select语句的查询,称
为外查询或主查询。
注意:
1.子查询要包含在括号内。
2.将子查询放在比较条件的右侧。
3.单行操作符对应单行子查询,多行操作符对应多行子查询。
例如:1>查询工资最低的员工的信息
mysql>select * from employee e where e.salary=(select min(salary) from employee);
2>查询出高于hr部门平均工资的员工
mysql>select * from employee e where e.salary>(select avg(salary) from employee where dept_name='hr');
3>查询出比sale部门所有员工工资高的员工信息
mysql>select * from employee where salary >(select max(salary) from employee where dept_name='sale') and dept_name!='sale';
mysql>select * from employee where salary>all(select salary from employee where dept_name='sale') and dept_name!='sale';
4>查询出比sale部门任意一个员工工资高的员工信息,只要比其中随便一个工资高都可以
mysql8>select * from employee where salary>any(select salary from employee where dept_name='sale') and dept_name!='sale';
5>获取员工的名字和部门的名字 select后面接子查询
mysql>alter table employee drop dept_name;
mysql>select employ_id,(select dept_name from dept d where d.dept_id=e.dept_id) dept_name from employee e;
mysql>select employ_id,d.dept_name from employee e left join dept d on e.dept_id=d.dept_id;
6>查询所有管理层的信息
mysql>select * from t4 e,(select distinct mgr from t4) m where e.name=m.mgr;
3.实验--多表查询
##创建student表和score表
mysql> CREATE TABLE student(
-> id int(10) NOT NULL UNIQUE PRIMARY KEY,
-> name varchar(20) NOT NULL,
-> sex varchar(4),
-> birth year,
-> department varchar(20),
-> address varchar(50)
-> );
mysql> CREATE TABLE score(
-> id int(10) NOT NULL UNIQUE PRIMARY KEY AUTO_INCREMENT,
-> stu_id int(10) NOT NULL,
-> c_name varchar(20),
-> grade int(10)
-> );
查看表结构:
mysql>desc student;
mysql>desc score;
为student表和score表增加记录
##向student表中添加数据信息
mysql> INSERT INTO student VALUES( 901,'张老大', '男',1985,'计算机系', '北京市海淀区');
mysql> INSERT INTO student VALUES( 902,'张老二', '男',1986,'中文系', '北京市昌平区');
mysql> INSERT INTO student VALUES( 903,'张三', '女',1990,'中文系', '湖南省永州市');
mysql> INSERT INTO student VALUES( 904,'李四', '男',1990,'英语系', '辽宁省阜新市');
mysql> INSERT INTO student VALUES( 905,'王五', '女',1991,'英语系', '福建省厦门市');
mysql> INSERT INTO student VALUES( 906,'王六', '男',1988,'计算机系', '湖南省衡阳市');
##向score表中添加数据信息
mysql> INSERT INTO score VALUES(NULL,901, '计算机',98);
mysql> INSERT INTO score VALUES(NULL,901, '英语', 80);
mysql> INSERT INTO score VALUES(NULL,902, '计算机',65);
mysql> INSERT INTO score VALUES(NULL,902, '中文',88);
mysql> INSERT INTO score VALUES(NULL,903, '中文',95);
mysql> INSERT INTO score VALUES(NULL,904, '计算机',70);
mysql> INSERT INTO score VALUES(NULL,904, '英语',92);
mysql> INSERT INTO score VALUES(NULL,905, '英语',94);
mysql> INSERT INTO score VALUES(NULL,906, '计算机',90);
mysql> INSERT INTO score VALUES(NULL,906, '英语',85);
1.查询student表的所有记录
mysql> select * from student;
2.查询student表的第2条到4条记录
mysql> select * from student limit 1,3;
3.从student表查询所有学生的学号(id)、姓名(name)和院系(department)的信息
mysql> select id,name,department from student;
4.从student表中查询计算机系和英语系的学生的信息
mysql> select * from student where department="计算机系" or department="英语系";
5.从student表中查询年龄18~35岁的学生信息
mysql> select id,name,sex,'2023'-birth as age,department,address from student where '2023'-birth between 18 and 35;
6.从student表中查询每个院系有多少人
mysql> select department,count(id) as count from student group by department;
7.从score表中查询每个科目的最高分
mysql> select c_name,MAX(grade) as Highest from score group by c_name;
8.查询李四的考试科目(c_name)和考试成绩(grade)
mysql> select c_name,grade from score inner join student on score.stu_id=student.id where name="李四";
9.用连接的方式查询所有学生的信息和考试信息
mysql> select * from student inner join score on student.id=score.stu_id;
10.计算每个学生的总成绩
mysql> select stu_id,name,SUM(score.grade) as total from score inner join student on score.stu_id=student.id group by (stu_id);
11.计算每个考试科目的平均成绩
mysql> select c_name,AVG(grade) as Average from score group by c_name;
12.查询计算机成绩低于95的学生信息
mysql> select * from student inner join score on student.id=score.stu_id where score.grade<95;
13.查询同时参加计算机和英语考试的学生的信息
<嵌套..>
mysql> select * from student where id=any(
-> select stu_id from score where stu_id in(
-> select stu_id from score where c_name="计算机") and c_name="英语");
14.将计算机考试成绩按从高到低进行排序
mysql> select stu_id,c_name,grade from score where c_name="计算机" order by grade DESC;
15.从student表和score表中查询出学生的学号,然后合并查询结果
mysql> select stu_id from score inner join student on score.stu_id=student.id;
16.查询姓张或者姓王的同学的姓名、院系和考试科目及成绩
<嵌套..>
mysql> select student.id,name,sex,birth,department,address,c_name,grade from student,score where (
-> name like '张%' or name like '王%') and student.id=score.stu_id;
或
<连接..>
mysql> select name,department,c_name,grade from student inner join score on student.id=score.stu_id where name like "张%" or name like "王%" ;
17.查询都是湖南的学生的姓名、年龄、院系和考试科目及成绩
<嵌套..>
mysql> select student.id,name,sex,'2023'-birth as age,department,address,c_name,grade
-> from student,score where address like '湖南%' and student.id=score.stu_id;
或
<连接..>
mysql> select name,department,score.c_name,score.grade,'2023'-birth as age from student inner join score on student.id=score.stu_id where address like "湖南%";