一、数据库基本操作

1.数据库的基本操作

-- 1.数据库的基本操作
使用test数据库
USE test; 
-- 查看当前test数据库中所有表 MySQL命令
SHOW TABLES;
-- 查表的基本信息
SHOW CREATE TABLE student;  
-- -- 查看表的字段信息
desc student;

2.数据表的基本操作

-- 2.数据表的基本操作

-- 创建学生数据表
CREATE TABLE student(
id int,
name VARCHAR(20),
gender VARCHAR(10),
birthday DATE
);

-- 查看数据表
SHOW TABLES;

-- 查表的基本信息的MySQL命令
SHOW CREATE TABLE student;

-- 查看表的字段信息的MySQL命令
desc student;

3.修改数据库

-- 3.修改数据库

-- 修改表名
ALTER TABLE student RENAME TO stu;

-- 修改字段名
ALTER TABLE stu CHANGE name sname VARCHAR(10);

-- 修改字段数据类型
ALTER TABLE stu MODIFY sname int;

-- 增加字段
ALTER TABLE stu add address VARCHAR(50);

-- 删除字段
ALTER TABLE stu DROP address;

-- 4.删除数据表

DROP TABLE stu;

二、数据表的约束

1.主键约束----->PRIMARY KEY(id)

-- 1.主键约束----->PRIMARY KEY(id)
-- 字段名 数据类型 primary key;

-- 设置主键约束(primary key)的第一种方式
CREATE TABLE student(
id int PRIMARY KEY,
name VARCHAR(20)
);

-- 设置主键约束(primary key)的第二·种方式

CREATE TABLE student01(
id int,
name VARCHAR(20),
PRIMARY KEY(id)
);

2.非空约束----->NOT NULL

-- 2.非空约束----->NOT NULL
-- 字段名 数据类型 NOT NULL;
CREATE TABLE student02(
id int,
name VARCHAR(20) NOT NULL
);

3.默认值约束---->DEFAULT

-- 3.默认值约束---->DEFAULT
-- 字段名 数据类型 DEFAULT 默认值;\
CREATE TABLE studebt03(
id int,
name VARCHAR(20),
gerdenr VARCHAR(10) DEFAULT "male"
);

4.唯一性约束----->UNIQUE

-- 4.唯一性约束----->UNIQUE
-- 字段名 数据类型 UNIQUE;

CREATE TABLE student04(
id int,
name VARCHAR(20) UNIQUE
);

5.外键约束

-- 5.外键约束
-- 在创建数据表时语法如下:
-- CONSTRAINT 外键名 FOREIGN KEY (从表外键字段) REFERENCES 主表 (主键字段)
-- 将创建数据表创号后语法如下:
-- ALTER TABLE 从表名 ADD CONSTRAINT 外键名 FOREIGN KEY (从表外键字段) REFERENCES 主表 (主键字段);

-- 创建学生表
CREATE TABLE student05(
id int PRIMARY KEY,
name VARCHAR(20)
);

-- 创建班级表
CREATE TABLE class(
classid int PRIMARY KEY,
studentid int
);

-- 学生表作为主表,班级表作为副表设置外键
ALTER TABLE class add CONSTRAINT fk_class_studentid FOREIGN KEY(studentid) REFERENCES student05(id);

6.1 数据一致性概念

6.2 删除外键

-- alter table 从表名 drop foreign key 外键名;

ALTER TABLE class DROP FOREIGN KEY fk_class_studentid;

三、数据表插入数据

-- 先准备一张学生表
CREATE TABLE student(
id int,
name VARCHAR(30),
age int,
gender VARCHAR(30)
);

1.为表中所有字段插入数据

-- INSERT INTO 表名(字段名1,字段名2,...) VALUES (值 1,值 2,...);

INSERT INTO student (id,name,age,gender)VALUES (1,'bob',16,'male');

2.为表中指定字段插入数据

INSERT INTO 表名(字段名1,字段名2,...) VALUES (值 1,值 2,...);

3.同时插入多条记录

-- 3. 同时插入多条记录
-- INSERT INTO 表名 [(字段名1,字段名2,...)]VALUES (值 1,值 2,…),(值 1,值 2,…),...;

insert into student (id,name,age,gender) values (2,'lucy',17,'female'),(3,'jack',19,'male'),(4,'tom',18,'male');

四、更新数据

1.UPDATE基本语法

-- 1. UPDATE基本语法
-- UPDATE 表名 SET 字段名1=值1[,字段名2 =值2,…] [WHERE 条件表达式];
UPDATE student set age=20,gender='female' WHERE name='tom';

2. UPDATE更新全部数据

-- 3. UPDATE更新全部数据
UPDATE student set age=18;

 八、删除数据----->DELETE

-- 先准备一张数据表
-- 创建学生表
 create table student06(
 id int,
 name varchar(30),
 age int,
 gender varchar(30)
 );
 -- 插入数据
 insert into student06 (id,name,age,gender) values (2,'lucy',17,'female'),(3,'jack',19,'male'),(4,'tom',18,'male'),(5,'sal',19,'female'),(6,'sun',20,'male')
,(7,'sad',13,'female'),(8,'sam',14,'male');

  1. DELETE基本语法

-- 1. DELETE基本语法
-- DELETE FROM 表名 [WHERE 条件表达式];

  2. DELETE删除部分数据

-- 删除age等于14的所有记录
delete from student where age=14;

 3. DELETE删除全部数据

-- 删除student06表中的所有记录
DELETE FROM student06;

-- 4. TRUNCATE和DETELE的区别 -- TRUNCATE和DETELE都能实现删除表中的所有数据的功能,但两者也是有区别的:

-- 1、DELETE语句后可跟WHERE子句,可通过指定WHERE子句中的条件表达式只删除满足条件的部分记录;但是,TRUNCATE语句只能用于删除表中的所有记录。

-- 2、使用TRUNCATE语句删除表中的数据后,再次向表中添加记录时自动增加字段的默认初始值重新由1开始;使用DELETE语句删除表中所有记录后,再次向表中添加记录时自动增加字段的值为删除时该字段的最大值加1

-- 3、DELETE语句是DML语句,TRUNCATE语句通常被认为是DDL语句

九、MySQL数据表简单查询

-- 创建数据库
DROP DATABASE IF EXISTS mydb;
CREATE DATABASE mydb;
USE mydb;

-- 创建student表
CREATE TABLE student (
 sid CHAR(6),
 sname VARCHAR(50),
 age INT,
 gender VARCHAR(50) DEFAULT 'male'
);

-- 向student表插入数据
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1001', 'lili', 14, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1002', 'wang', 15, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1003', 'tywd', 16, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1004', 'hfgs', 17, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1005', 'qwer', 18, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1006', 'zxsd', 19, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1007', 'hjop', 16, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1008', 'tyop', 15, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1009', 'nhmk', 13, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1010', 'xdfv', 17, 'female');

        

2. 查询

-- 2.查询所有字段(方法不唯一只是举例)
SELECT * FROM student;

-- 3.查询指定字段(sid、sname)
SELECT sid,sname from student;

-- 4.常数的查询
-- 在SELECT中除了书写列名,还可以书写常数。可以用于标记

SELECT sid,sname,'2021-03-02' FROM student;



-- 5.从查询结果中过滤重复数据
-- 在SELECT查询语句中DISTINCT关键字只能用在第一个所查列名之前。
SELECT DISTINCT gender FROM student;


-- 6.算术运算符(举例加运算符)
SELECT sname,age+100 FROM student;

十、函数

-- 准备测试数据
-- 创建数据库
DROP DATABASE IF EXISTS mydb;
CREATE DATABASE mydb;
USE mydb;

-- 创建student表
CREATE TABLE student (
 sid CHAR(6),
 sname VARCHAR(50),
 age INT,
 gender VARCHAR(50) DEFAULT 'male'
);

-- 向student表插入数据
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1001', 'lili', 14, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1002', 'wang', 15, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1003', 'tywd', 16, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1004', 'hfgs', 17, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1005', 'qwer', 18, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1006', 'zxsd', 19, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1007', 'hjop', 16, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1008', 'tyop', 15, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1009', 'nhmk', 13, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1010', 'xdfv', 17, 'female');

1.聚合函数

-- 聚合函数使用规则:

-- 只有SELECT子句HAVING子句、ORDER BY子句中能够使用聚合函数

-- 1.1、count()
-- 查询有多少该表中有多少人-- 
SELECT count(*) FROM student;

-- 1.2、max()
-- 计算指定列的最大值,如果指定列是字符串类型则使用字符串排序运算
-- 查询该学生表中年纪最大的学生 
SELECT MAX(age) FROM student;

-- 1.3、min()
-- 计算指定列的最小值,如果指定列是字符串类型则使用字符串排序运算
-- 查询该学生表中年纪最小的学生
SELECT sname,MIN(age) FROM student;

-- 1.4、sum()
-- 计算指定列的数值和,如果指定列类型不是数值类型则计算结果为0
-- 查询该学生表中年纪的总和
SELECT SUM(age) FROM student;

-- 1.5、avg()
-- 计算指定列的平均值,如果指定列类型不是数值类型则计算结果为
-- 查询该学生表中年纪的平均数

SELECT AVG(age) FROM student;

2. 其他常用函数

-- 2.1、时间函数
SELECT NOW();
SELECT DAY (NOW());
SELECT DATE (NOW());
SELECT TIME (NOW());
SELECT YEAR (NOW());
SELECT MONTH (NOW());
SELECT CURRENT_DATE();
SELECT CURRENT_TIME();
SELECT CURRENT_TIMESTAMP();
SELECT ADDTIME('14:23:12','01:02:01');
SELECT DATE_ADD(NOW(),INTERVAL 1 DAY);
SELECT DATE_ADD(NOW(),INTERVAL 1 MONTH);
SELECT DATE_SUB(NOW(),INTERVAL 1 DAY);
SELECT DATE_SUB(NOW(),INTERVAL 1 MONTH);
SELECT DATEDIFF('2019-07-22','2019-05-05');



-- 2.2、字符串函数

-- 连接函数
SELECT CONCAT ()
--
SELECT INSTR ();
-- 统计长度
SELECT LENGTH();





-- 2.3、数学函数

-- 绝对值
SELECT ABS(-136);
-- 向下取整
SELECT FLOOR(3.14);
-- 向上取整
SELECT CEILING(3.14);

十一、条件查询

        1.使用关系运算符查询

-- 查询年龄等于或大于17的学生的信息
SELECT * FROM student WHERE age>=17;

        2.使用IN关键字查询

-- IN关键字用于判断某个字段的值是否在指定集合中。如果字段的值恰好在指定的集合中,则将字段所在的记录将査询出来。

-- 查询sid为S_1002和S_1003的学生信息
SELECT * FROM student WHERE sid in ('S_1002','S_1003');
-- 查询sid为S_1001以外的学生的信息
SELECT * from student WHERE sid NOT in ('S_1001');

        3.使用BETWEEN AND关键字查询

-- BETWEEN AND用于判断某个字段的值是否在指定的范围之内如果字段的值在指定范围内,则将所在的记录将查询出来

-- 查询15到18岁的学生信息
SELECT * FROM student WHERE age BETWEEN 15 AND 18;
-- 查询不是15到18岁的学生信息
SELECT * FROM student WHERE age NOT BETWEEN 15 AND 18;

        4.使用空值查询

-- 在MySQL中,使用 IS NULL关键字判断字段的值是否为空值。请注意:空值NULL不同于0,也不同于空字符串

-- 查询sname不为空值的学生信息
SELECT * FROM student WHERE sname IS NOT NULL;

        5.使用AND关键字查询

-- 在MySQL中可使用AND关键字可以连接两个或者多个查询条件。

-- 查询年纪大于15且性别为male的学生信息
SELECT * FROM student WHERE age>15 AND gender='male';

 6.使用OR关键字查询

         在使用SELECT语句查询数据时可使用OR关键字连接多个査询条件。

        在使用OR关键字时,只要记录满足其中任意一个条件就会被查询出来

-- 查询年纪大于15或者性别为male的学生信息
SELECT * FROM student WHERE age>15 OR gender='male';

7.使用LIKE关键字查询

MySQL中可使用LIKE关键字可以判断两个字符串是否相匹配

-- 7.1 普通字符串

-- 查询sname中与wang匹配的学生信息
SELECT * FROM student WHERE sname LIKE 'wang';

-- 7.2 含有%通配的字符串
-- %用于匹配任意长度的字符串

-- 查询学生姓名以li开始的记录
SELECT * FROM student WHERE sname LIKE 'li%';

-- 查询学生姓名以g结尾的记录
SELECT * FROM student WHERE sname LIKE '%g';

-- 查询学生姓名包含s的记录
SELECT * FROM student WHERE sname LIKE '%s%';

-- 7.3 含有_通配的字符串
-- 下划线通配符只匹配单个字符

-- 查询学生姓名以zx开头且长度为4的记录
SELECT * FROM student WHERE sname LIKE 'zx__';

-- 查询学生姓名以g结尾且长度为4的记录
SELECT * FROM student WHERE sname LIKE '___g';

8.使用LIMIT限制查询结果的数量

        当执行查询数据时可能会返回很多条记录,而用户需要的数据可能只是其中的一条或者几条。

-- 查询学生表中年纪最小的3位同学
SELECT * FROM student ORDER BY age ASC LIMIT 3;

9.使用GROUP BY进行分组查询

        通过GROUP BY将原来的表拆分成了几张小表。

准备工作

-- 准备工作
-- 创建数据库
DROP DATABASE IF EXISTS mydb;
CREATE DATABASE mydb;
USE mydb;

-- 创建员工表
CREATE TABLE employee (
 id int,
 name varchar(50),
 salary int,
 departmentnumber int
);

-- 向员工表中插入数据
INSERT INTO employee values(1,'tome',2000,1001); 
INSERT INTO employee values(2,'lucy',9000,1002); 
INSERT INTO employee values(3,'joke',5000,1003); 
INSERT INTO employee values(4,'wang',3000,1004); 
INSERT INTO employee values(5,'chen',3000,1001); 
INSERT INTO employee values(6,'yukt',7000,1002); 
INSERT INTO employee values(7,'rett',6000,1003); 
INSERT INTO employee values(8,'mujk',4000,1004); 
INSERT INTO employee values(9,'poik',3000,1001);

9.1 GROUP BY和聚合函数一起使用

-- 统计各部门员工个数
SELECT departmentnumber,COUNT(*) FROM employee GROUP BY departmentnumber;

-- 统计部门编号大于1001的各部门员工个数
SELECT departmentnumber,COUNT(*) FROM employee WHERE departmentnumber>1001 GROUP BY departmentnumber;

9.2 GROUP BY和聚合函数以及HAVING一起使用

SELECT departmentnumber,SUM(salary) FROM employee GROUP BY departmentnumber HAVING sum(salary)>8000;

10.使用ORDER BY对查询结果排序

        -- ORDER BY对查询结果进行排序

        -- SELECT 字段名1,字段名2,… -- FROM 表名

        -- ORDER BY 字段名1 [ASC 丨 DESC],字段名2 [ASC | DESC];

-- -- 在该语法中:字段名1、字段名2是查询结果排序的依据;参数 ASC表示按照升序排序,DESC表示按照降序排序;默认情况下,按照ASC方式排序。通常情况下,ORDER BY子句位于整个SELECT语句的末尾。

-- 查询所有学生并按照年纪大小升序排列 
SELECT * FROM student ORDER BY age ASC;

-- 查询所有学生并按照年纪大小降序排列
SELECT * FROM student ORDER BY age DESC;

十二、别名设置

-- 在査询数据时可为表和字段取別名,该别名代替表和字段的原名参与查询操作。

1.为表取别名

-- SELECT * FROM 表名 [AS] 表的别名 WHERE .... ;

-- 将student改为stu查询整表 
SELECT * FROM student AS stu;

2.为字段取别名

-- SELECT 字段名1 [AS] 别名1 , 字段名2 [AS] 别名2 , ... FROM 表名 WHERE ... ;

将student中的sname取别名为“姓名”

SELECT sname AS '姓名',sid FROM student;

十三、表的关联关系

-- 在实际开发中数据表之间存在着各种关联关系。在此,介绍MySQL中数据表的三种关联关系。

-- 多对一(亦称为一对多)是数据表中最常见的一种关系。例如:员工与部门之间的关系,一个部门可以有多个员工;而一个员工不能属于多个部门只属于某个部门。

在多对一的表关系 中,应将外键建在多的一方否则会造成数据的冗余。

-- 多对多 -- 多对多是数据表中常见的一种关系。例如:学生与老师之间的关系,一个学生可以有多个老师而且一个老师有多个学生。

通常情况下,为了实现这种关系需要定义一张中间表(亦称为连接表)该表会存在两个外键分别参照老师表和学生表。

-- 一对一 -- 在开发过程中,一对一的关联关系在数据库中并不常见;因为以这种方式存储的信息通常会放在同一张表中。

-- 接下来,我们来学习在一对多的关联关系中如果添加和删除数据。先准备一些测试数据,代码如下:

DROP TABLE IF EXISTS student;
DROP TABLE IF EXISTS class;

-- 创建班级表
CREATE TABLE class(
 cid int(4) NOT NULL PRIMARY KEY,
 cname varchar(30) 
);

-- 创建学生表
CREATE TABLE student(
 sid int(8) NOT NULL PRIMARY KEY,
 sname varchar(30),
 classid int(8) NOT NULL
);

-- 为学生表添加外键约束
ALTER TABLE student ADD CONSTRAINT fk_student_classid FOREIGN KEY(classid) REFERENCES class(cid);
-- 向班级表插入数据
INSERT INTO class(cid,cname)VALUES(1,'Java');
INSERT INTO class(cid,cname)VALUES(2,'Python');

-- 向学生表插入数据
INSERT INTO student(sid,sname,classid)VALUES(1,'tome',1);
INSERT INTO student(sid,sname,classid)VALUES(2,'lucy',1);
INSERT INTO student(sid,sname,classid)VALUES(3,'lili',2);
INSERT INTO student(sid,sname,classid)VALUES(4,'domi',2);

SELECT * FROM class;
SELECT * FROM student;

1.关联查询

-- 查询Java班的所有学生
SELECT *FROM student WHERE classid=(SELECT cid FROM class WHERE cname='Java');

2.关于关联关系的删除数据

-- 请从班级表中删除Java班级。

请注意:班级表和学生表之间存在关联关系;要删除Java班级,应该先删除学生表中与该班相关联的学生。否则,假若先删除Java班那么学生表中的cid就失去了关联

-- 删除Java班
DELETE FROM student WHERE classid=(SELECT cid FROM class WHERE cname='Java');
DELETE FROM class WHERE cname='Java';

十四、多表连接查询

-- 准备数据

1.交叉连接查询

-- 交叉连接返回的结果是被连接的两个表中所有数据行的笛卡儿积;

比如:集合A={a,b},集合B={0,1,2},则集合A和B的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}。所以,交叉连接也被称为笛卡尔连接,其语法格式如下:

-- SELECT * FROM 表1 CROSS JOIN 表2;

-- 由于这个交叉连接查询在实际运用中没有任何意义,所以只做为了解即可

2.内连接查询

-- 内连接(Inner Join)又称简单连接或自然连接,是一种非常常见的连接查询内连接使用比较运算符对两个表中的数据进行比较并列出与连接条件匹配的数据行,组合成新的记录。也就是说在内连接查询中只有满足条件的记录才能出现在查询结果中(返回的结果只包含符合查询条件和连接条件的数据)

-- SELECT 查询字段1,查询字段2, ... FROM 表1 [INNER] JOIN 表2 ON 表1.关系字段=表2.关系字段

-- 在该语法中:INNER JOIN用于连接两个表,ON来指定连接条件;其中INNER可以省略。

-- 查询员工姓名及其所属部门名称
SELECT employee.ename,department.dname FROM department INNER JOIN employee on department.did=employee.departmentid;
-- 准备数据
-- 若存在数据库mydb则删除
DROP DATABASE IF EXISTS mydb;
-- 创建数据库mydb
CREATE DATABASE mydb;
-- 选择数据库mydb
USE mydb;

-- 创建部门表
CREATE TABLE department(
 did int (4) NOT NULL PRIMARY KEY, 
dname varchar(20)
);

-- 创建员工表
CREATE TABLE employee (
 eid int (4) NOT NULL PRIMARY KEY, 
ename varchar (20), 
eage int (2), 
departmentid int (4) NOT NULL
);

-- 向部门表插入数据
INSERT INTO department VALUES(1001,'财务部');
INSERT INTO department VALUES(1002,'技术部');
INSERT INTO department VALUES(1003,'行政部');
INSERT INTO department VALUES(1004,'生活部');
-- 向员工表插入数据
INSERT INTO employee VALUES(1,'张三',19,1003);
INSERT INTO employee VALUES(2,'李四',18,1002);
INSERT INTO employee VALUES(3,'王五',20,1001);
INSERT INTO employee VALUES(4,'赵六',20,1004);

3.外连接查询

-- 在使用内连接查询时我们发现:返回的结果只包含符合查询条件和连接条件的数据。

-- 但是,有时还需要在返回查询结果中不仅包含符合条件的数据,而且还包括左表、右表或两个表中的所有数据,此时我们就需要使用外连接查询。

-- 外连接又分为左(外)连接和右(外)连接。其语法格式如下:

-- SELECT 查询字段1,查询字段2, ... FROM 表1 LEFT | RIGHT [OUTER] JOIN 表2 ON 表1.关系字段=表2.关系字段 WHERE 条件

-- 1、LEFT [OUTER] JOIN 左(外)连接:返回包括左表中的所有记录和右表中符合连接条件的记录。

-- 2、RIGHT [OUTER] JOIN 右(外)连接:返回包括右表中的所有记录和左表中符合连接条件的记录。

-- 若存在数据库mydb则删除
DROP DATABASE IF EXISTS mydb;
-- 创建数据库mydb
CREATE DATABASE mydb;
-- 选择数据库mydb
USE mydb;

-- 创建班级表
CREATE TABLE class(
 cid int (4) NOT NULL PRIMARY KEY, 
cname varchar(20)
);

-- 创建学生表
CREATE TABLE student (
 sid int (4) NOT NULL PRIMARY KEY, 
sname varchar (20), 
sage int (2), 
classid int (4) NOT NULL
);
-- 向班级表插入数据
INSERT INTO class VALUES(1001,'Java');
INSERT INTO class VALUES(1002,'C++');
INSERT INTO class VALUES(1003,'Python');
INSERT INTO class VALUES(1004,'PHP');

-- 向学生表插入数据
INSERT INTO student VALUES(1,'张三',20,1001);
INSERT INTO student VALUES(2,'李四',21,1002);
INSERT INTO student VALUES(3,'王五',24,1002);
INSERT INTO student VALUES(4,'赵六',23,1003);
INSERT INTO student VALUES(5,'Jack',22,1009);

-- 准备这组数据有一定的特点,为的是让大家直观的看出左连接与右连接的不同之处

-- 1、班级编号为1004的PHP班级没有学生

-- 2、学号为5的学生王跃跃班级编号为1009,该班级编号并不在班级表中

3.1 左(外)连接查询

-- 左(外)连接的结果包括LEFT JOIN子句中指定的左表的所有记录,以及所有满足连接条件的记录。如果左表的某条记录在右表中不存在则在右表中显示为空。

-- 只有形式不一样。left join 是 left outer join 的简写,两者含义一样的。

-- 查询每个班的班级ID、班级名称及该班的所有学生的名字 M

SELECT class.cid,class.cname,student.sname FROM class LEFT OUTER JOIN student on class.cid=student.classid;

运行结果:

 

3.2 右(外)连接查询

-- 右(外)连接的结果包括RIGHT JOIN子句中指定的右表的所有记录,以及所有满足连接条件的记录。如果右表的某条记录在左表中没有匹配,则左表将返回空值。

-- 只有形式不一样。right join 是 right outer join 的简写,两者含义一样的。

-- 查询每个班的班级ID、班级名称及该班的所有学生的名字

SELECT class.cid,class.cname,student.sname FROM class RIGHT OUTER JOIN student ON class.cid=student.classid;

运行结果:

 

十五、子查询

-- 子查询是指一个查询语句嵌套在另一个查询语句内部的查询;

DROP TABLE IF EXISTS student;
DROP TABLE IF EXISTS class;

-- 创建班级表
CREATE TABLE class(
 cid int (4) NOT NULL PRIMARY KEY, 
cname varchar(20)
);

-- 创建学生表
CREATE TABLE student (
 sid int (4) NOT NULL PRIMARY KEY, 
sname varchar (20), 
sage int (2), 
classid int (4) NOT NULL
);

-- 向班级表插入数据
INSERT INTO class VALUES(1001,'Java');
INSERT INTO class VALUES(1002,'C++');
INSERT INTO class VALUES(1003,'Python');
INSERT INTO class VALUES(1004,'PHP');
INSERT INTO class VALUES(1005,'Android');

-- 向学生表插入数据
INSERT INTO student VALUES(1,'张三',20,1001);
INSERT INTO student VALUES(2,'李四',21,1002);
INSERT INTO student VALUES(3,'王五',24,1003);
INSERT INTO student VALUES(4,'赵六',23,1004);
INSERT INTO student VALUES(5,'小明',21,1001);
INSERT INTO student VALUES(6,'小红',26,1001);
INSERT INTO student VALUES(7,'小亮',27,1002);

1.带比较运算符的子查询

-- 查询张三同学所在班级的信息
SELECT * FROM class WHERE cid=(SELECT classid FROM student WHERE sname='张三')
-- 查询比张三同学所在班级编号还大的班级的信息
SELECT * FROM class WHERE cid>(SELECT classid FROM student WHERE sname='张三')

运行结果:

 

 

2.带EXISTS关键字的子查询

-- 它不产生任何数据只返回TRUE或FALSE。当返回值为TRUE时外层查询才会执行

-- 假如王五同学在学生表中则从班级表查询所有班级信息
SELECT * from class WHERE EXISTS (SELECT * FROM student WHERE sname="王五");

运行结果:

 

3.带ANY关键字的子查询

-- ANY关键字表示满足其中任意一个条件就返回一个结果作为外层查询条件。

-- 查询比任一学生所属班级号还大的班级编号
SELECT * FROM class WHERE cid > ANY(SELECT classid FROM student);

4.带ALL关键字的子查询

-- ALL关键字与ANY有点类似,只不过带ALL关键字的子査询返回的结果需同时满足所有内层査询条件。

-- 查询比所有学生所属班级号还大的班级编号
SELECT * FROM class WHERE cid>ALL(SELECT classid FROM student);

-- 总结 -- 重要(从关键字分析): -- 查询语句的书写顺序和执行顺序 -- select ===> from ===> where ===> group by ===> having ===> order by ===> limit -- 查询语句的执行顺序 -- from ===> where ===> group by ===> having ===> select ===> order by ===> limit

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐