【你也能从零基础学会网站开发】大一就靠这玩意封神!手写SQL查询完全总复习保姆级笔记流出 包含老师最爱考的题型详解 学完不能吊打面试官,但你可以吊打你同学!【附SQL通关宝典+练习题代码+答案】

🚀 个人主页 极客小俊
✍🏻 作者简介:程序猿、设计师、技术分享
🐋 希望大家多多支持, 我们一起学习和进步!
🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注

前言 ✅

前面学了那么多基础部分,如果不练习一下,就会忘记了!

所以今天我们就什么都不做,专门来练习一下简单的SQL查询~~

我们平常最最常见的主要分为单表查询多表查询

这里我提前说一句,很多人在怀疑自己写的SQL查询是否正确,我们可以先抛开性能优化来说,SQL查询的目的其实就是通过SQL的语法从表中把我们所需要的数据和信息查询出来的过程~,所以不管你这么查询,首先你要拿到你想要的结果,那么SQL就算是正确的!

通过这一期的小练习,零基础小白可以轻松掌握和熟练使用各种基本SQL查询语句~ 同时我们也回顾一下前面学习的知识点!

废话不多说,我们开始吧~

小知识

在系统的Master数据库Sysmessages表里面保存了系统的错误消息,错误消息有不同的严重级别!
有的时候我们在找寻错误信息的事后偶尔也可以看看!

开始我们的SQL查询正题~~

基本的SQL查询大家还记得吧~使用SELECT 语句从表中选取数据, 结果被存储在一个结果表中(称为结果集)

语法如下

SELECT 列名称 FROM 表名称 /SELECT * FROM 表名称 

最基本的查询 列出所有的用户信息

SELECT 列名称/* FROM 表名称 [where…]
例如:
select * from username /* 列出所有的用户信息 */

“ *号 ”表示所有列

单表查询 ✅

为了演示,这里给大家简单提供了一些SQL查询测试数据,供大家参考!

练习1: SQL如下

create table staffTable(
eid int primary key IDENTITY,
ename varchar(30),
phone varchar(40),
age int,
salary int,
company varchar(30)
);


insert into staffTable(ename,phone,age,salary,company) values('张军','12656534449','26','5624','技术部');
insert into staffTable(ename,phone,age,salary,company) values('王辉','1512312312219','56','2300','市场部');
insert into staffTable(ename,phone,age,salary,company) values('张三进','1123214749','36','3000','市场部');
insert into staffTable(ename,phone,age,salary,company) values('杨小明','15648454749','30','4400','市场部');
insert into staffTable(ename,phone,age,salary,company) values('刘罗戈','15624323749','26','1100','媒体部');
insert into staffTable(ename,phone,age,salary,company) values('毛利华','156423449','46','6600','开发部');
insert into staffTable(ename,phone,age,salary,company) values('张军','15643454459','76','2109','技术部');

把代码拿到SQL Server中执行一下

如图

SQL练习题如下

/*1、查询所有人的信息,按年龄从高到低进行排序*/
select * from staffTable order by age desc;

/*2、查询一共有多少个人?*/
select count(distinct ename) from staffTable;

/*3、查询年龄在20-30岁之间的人,不包括20,但包括30*/
select * from staffTable where age>20 and age<=30;

/*4、查询年龄不在20-30岁之间的人,跟上面的结束相反*/
select * from staffTable where not(age>20 and age<=30);

/*5、查询工资最高的人的所有信息*/
select top 1 * from staffTable order by salary desc;

/*6、查询有多少个部门*/
select count(distinct company) from staffTable;

/*7、查询每个部分有多少人?*/
select company,count(ename) as '人数' from staffTable group by company;

/*8、显示用户部分信息例如:姓名和手机号码 */
select ename,phone from staffTable;

/*9、查询都有哪些部门名称*/
select distinct company from staffTable

/*10、查询出所有用户信息,按年龄从大到小进行排列 */
select * from staffTable order by age desc

/*11、查询用户年龄大于30岁的*/
select * from staffTable where age > 30;

/*12、查询部门是:技术部、媒体部、开发部的员工信息*/
select * from staffTable where company='技术部' or company='媒体部' or company='开发部'
select * from staffTable where company in('技术部','媒体部','开发部');

/*13、从员工表中查询部门员工平均年龄大于30岁的部门*/
select company,avg(age) from staffTable group by company having avg(age) > 30;



执行结果如下图

在这个基础练习题中,我们使用到前面学过的~一些查询方法

1.GROUP BY 语句 💜

GROUP BY 从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)
它的作用是通过一定的规则将一个数据集划分成若干个小的区域,
然后针对若干个小区域进行数据处理。指定用来放置输出行的组。
GROUP BY 语句用于结合聚合函数,根据一个或多个列对结果集进行分组处理!
GROUP BY 语句使用语法回顾

SELECT 字段名称, 聚合函数(字段名称) FROM 表名称 WHERE 字段名称 operator value GROUP BY 字段名称 

下面以一个Orders订单表进行分析:

例如

SELECT Customer,SUM(OrderPrice) FROM Orders GROUP BY Customer

GROUP BY语句 也可以分组一个以上的字段

例如

SELECT Customer,OrderDate,SUM(OrderPrice) FROM Orders GROUP BY Customer,OrderDate 
2.ORDER BY 语句 💙

这也是我们平常用得很多的语句之一

ORDER BY 语句用于对结果集进行排序。

ASC关键字DESC 关键字

ORDER BY 语句用于根据指定的列对结果集进行排序,ORDER BY 语句默认按照升序对记录进行排序!

如果您希望按照降序对记录进行排序,可以使用 DESC 关键字

注意: 如果排序的列是字符类型,则按字母大小进行排序。

3.WHERE 子句 💚

查询这么能少的了WHERE 子句 呢!

如果想要有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句 也就是从结果集中筛选结果的一种查询方式

SQL语法

SELECT 列名称/* FROM 表名称 WHERE 列 运算符 值 

并且在 WHERE 子句中还可以使用的运算符如下图:

如图

注意: >=、<=、>、<等不一定只用于数字比较。如果是字符串比较时,就比较字母的大小。

更多操作符 描述

如下

大小
< 小于
= 等于
<> 不等于
= 大于等于
<= 小于等于
Between…and 在…之间
Not Between…and 不在…之间
like 模糊匹配
Not like 与like相反
in 指定值列表
Not in 与in相反
and 和
or 或

4.distinct关键字 💛

关键词 DISTINCT 用于返回唯一不同的值,根据情况来进行使用!

SQL语法

语法:SELECT  DISTINCT  字段  FROM  表名称 
5.TOP 子句 🔋

这个是SQL Server 2000 中独有的语法~TOP 子句用于规定要返回的记录的数目。
对于拥有数千条记录的大型表来说,TOP 子句是非常有用的!

语法

SELECT TOP number 字段名称 | *  FROM 表名称

在字段的前面加top n,就能从结果集中提取前n条数据n为大于0的整数

6.not关键字

这里我们巧妙的使用了not来进行取反操作~类似于like、between..and、in前加not都表示取反作用!

7.in关键字 💰

IN 操作符允许我们在 WHERE 子句中规定多个值!

语法结构

SELECT 字段名称(s) FROM 表名称 WHERE 字段名称 IN (value1,value2,...)
8.between…and ⚔️

表示两个数之间,而且在这里这个两个数都同时被包含!

操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围,这些值可以是数值、也可以是文本或者日期

语法回顾

SELECT 字段名称(s) FROM 表名称 WHERE 字段名称 BETWEEN value1 AND value2

举个栗子

/*查询50年代和60年代出生的人*/
SELECT 字段名 FROM 表名称 WHERE BirthDate BETWEEN '1950-01-01' AND '1969-12-31'

如果日期字段包含时间部分(如 DATETIME),BETWEEN 会包含时间范围。
例如,'1969-12-31' 实际表示 '1969-12-31 00:00:00',
所以不会包含 1969-12-31 当天的其他时间。如果需要包含整天,
可以写成 BirthDate < '1970-01-01'

注意: 在 SQL Server 中,日期字段通常需要使用完整的日期格式(如 'YYYY-MM-DD')

9.having关键字 🔮

条件过滤语句,跟where一样,通常与group by一起使用
Having语句存在的意义:因为where子句中不能出来聚合函数,而having可以

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

SQL Having语法

SELECT 字段名称, 聚合函数(字段名称) FROM  表名称 WHERE 字段名称 operator value GROUP BY  字段名称 HAVING 聚合函数(字段名称) operator value 

例1 我们希望查找订单总金额少于 2000 的客户

SELECT Customer,SUM(OrderPrice) FROM Orders GROUP BY 
Customer HAVING SUM(OrderPrice)<2000;

例2 现在我们希望查找客户 “张三” 或 “李四” 拥有超过 1500 的订单总金额

SELECT Customer,SUM(OrderPrice) FROM Orders WHERE 
Customer='张三' OR Customer='李四' GROUP BY Customer HAVING 
SUM(OrderPrice)>1500 

举个栗子

从员工表中查询部门员工平均年龄大于30的部门。
正常的where写法:

select paddr as '地方',avg(page) as '平均年龄' from username 
where avg(page) >40 group by paddr

这样会报如下错误:

聚合不应出现在 WHERE 子句中,除非该聚合位于 HAVING 子句或选择列表所包含的子查询中,并且要对其进行聚合的列是外部引用。

所以我们必须改成having语句

select paddr as '地方',avg(page) as '平均年龄' from username group by paddr
having avg(page) >40

注意:当where、group by、having、order by在同一条查询语句中出现的时候,他们的一个正常顺序是 where、group by、having、order by

除了where中的字段和聚合函数之外,任何其它地方出现的字段都必须在group by子句中出现

如同

select paddr as '地方',avg(page) as '平均年龄' from username 
where pgrade >=2
group by paddr
having avg(page) >40
order by avg(page) desc

为了回顾单表查询,我们再创建一个测试数据表~

练习2: SQL如下

create table per(
id int primary key IDENTITY,
pname varchar(50),
page int,
psex varchar(50),
paddr varchar(50)
);

insert into per(pname,page,psex,paddr) values('王小华',30,'男','北京');
insert into per(pname,page,psex,paddr) values('张文军',24,'男','上海');
insert into per(pname,page,psex,paddr) values('罗敏',19,'女','重庆');
insert into per(pname,page,psex,paddr) values('张建新',32,'男','重庆');
insert into per(pname,page,psex,paddr) values('刘婷',26,'女','成都');
insert into per(pname,page,psex,paddr) values('刘小亚',22,'女','重庆');
insert into per(pname,page,psex,paddr) values('王建军',22,'男','贵州');
insert into per(pname,page,psex,paddr) values('谢涛',28,'男','海南');
insert into per(pname,page,psex,paddr) values('张良',26,'男','上海');
insert into per(pname,page,psex,paddr) values('黎记',17,'男','贵阳');
insert into per(pname,page,psex,paddr) values('赵小丽',26,'女','上海');

执行一下

如图

SQL练习题如下

/*1、查询有多少女的*/
select count(psex) from per where psex='女';

/*2、查询有多少姓“张”的人*/
select * from per where pname like '张%';

/*3、把姓“张、王、李、赵”的人查询出来*/
SELECT * FROM per WHERE pname LIKE '张%' OR pname LIKE '王%' OR pname LIKE '李%' OR pname LIKE '赵%';

/*4、查询年龄最小的3个人*/
select top 3 * from per order by page asc;

/*5、查询哪些人是"重庆"的*/
select * from per where paddr='重庆';

/*6、重庆、贵州、四川的一共有几个人*/
select count(pname) from per where paddr in('重庆','贵州','四川');
select count(pname) from per where paddr='重庆' or paddr='四川' or paddr='贵州';

/*7、查询年龄在20-30之间的人,不包括20,包括30。*/
select * from per where page>20 and page<=30;

/*8、把重庆女的全部查询出来*/
select * from per where paddr='重庆' and psex='女';

/*9、查询年龄最小的那个男的的名字*/
select top 1 pname from per where psex='男' order by page asc;

/*10、把名字是3个字的全部查询出来*/
select * from per where pname like '___';

如图

这里我们又使用到了 一些操作符

10.LIKE 操作符 💣

LIKE 操作符用于在 WHERE 子句中搜索字段中的指定模式,也叫模糊查询~
模糊查询指的就是不明确指定的查询方式!

语法结构

SELECT 字段名称(s) FROM 表名称 WHERE 字段名称 LIKE pattern

注意: 如果加上NOT关键字则相反,例如 NOT LIKE ~~

11.SQL 通配符 ⌛️

在使用LIKE 查询数据库中的数据时,SQL通配符可以替代一个或多个字符。
SQL 通配符必须与 LIKE 运算符一起使用。
在 SQL 中,可使用以下通配符如下图

12.AND 和 OR 运算符 💊

AND 和 OR 运算符用于基于一个以上的条件对记录进行过滤。平常使用的评率也是很高的!

举个栗子

SELECT * FROM 表名称 WHERE 字段='值' AND 字段='值'
SELECT * FROM 表名称 WHERE 字段='值' OR 字段='值'

结合 AND 和 OR 运算符一起使用~

SELECT * FROM 表名称 WHERE (字段='值' OR 字段='值') AND 字段='值' 

我们再来特别看一下分组查询~

举个栗子

create table persons(
   id int IDENTITY,
   lastName varchar(50),
   age int,
   address varchar(50),
   city varchar(50),
   birdthyear datetime
) 

insert into persons(lastname,age,address,city,birdthyear) values('Adams',35,'美国','洛杉矶','1990-10-20 00:00:00')
insert into persons(lastname,age,address,city,birdthyear) values('Ais',28,'英国','伦敦','1962-02-03 00:00:00')
insert into persons(lastname,age,address,city,birdthyear) values('张文华',59,'中国','上海','1956-08-06 00:00:00')
insert into persons(lastname,age,address,city,birdthyear) values('Cfirk',62,'法国','巴黎','1956-02-06 00:00:00')
insert into persons(lastname,age,address,city,birdthyear) values('王棚',28,'中国','北京','1985-10-20 00:00:00')
insert into persons(lastname,age,address,city,birdthyear) values('罗珊珊',66,'中国','上饶','1986-02-03 00:00:00')
insert into persons(lastname,age,address,city,birdthyear) values('张卫华',30,'德国','柏林','1956-01-20 00:00:00')
insert into persons(lastname,age,address,city,birdthyear) values('Jack',32,'英国','伦敦','1976-05-06 00:00:00')

执行一下

练习如下


/*1、统计有哪些地区*/
select distinct city from persons;

/*2、统计每个国家人的平均年龄*/
select address,avg(age) from persons group by address;

/*3、都有哪些国家的人年龄在30-50岁之间?*/
select address from persons where age > 30 and age < 50

/*4、都有哪些国家的人年龄在30-50岁之间?但是如果某个国家中还存在其他有不满足条件的,那么这个国家就排除*/
SELECT distinct address,lastName FROM Persons AS tmp1 
WHERE NOT EXISTS 
(SELECT 1 FROM Persons as tmp2 WHERE tmp1.address = tmp2.address AND (tmp2.age <= 30 OR tmp2.age>=50))

如图

小提示:在SQL Server 2000中,要实现获取最后一个值的功能,需要使用上述提到的ORDER BY和TOP关键字组合的方法或其他等效的SQL语句

多表查询 🔌

多表查询的分类 🎵

1.普通多表查询 (优先选择) select * from 表1,表2 where 表1.关系字段=表2.关系字段

2.左右连接查询(join)–多表 left join (左边全部显示、右边匹配显示,不匹配显示NULL)

3.嵌套查询(子查询)–多表 注意: 子查询不会走索引 所以能够不使用就不要用!

通常情况下3表,或者多表查询语法,先把条件建立起来~

select * from table1 inner join table2 
on table1.field1 = table2.field1 
inner join table3 
on table1.field1 = table3.field1
inner join table4
........以此类推 

通常我们可以先从两个表开始练习,这里大家可以按照下面的步骤自行创建SQL测试数据

多表查询练习1

1、创建一个名为“mydb”的数据库,基于这个数据库做以下操作

2、建"company"表 它有如下字段
cid(序号)     cname(姓名)       caddr(地址)    cnum(员工人数)      cyear(公司年限)
_____________________________________________________________________________
|1              美盛隆制罐          广州           102               10|
|2              淄博大东金属        上海           116               08|
|3              深圳市艾博克斯      广州           98                07|
|4              嘉兴环亚包装        北京           56                03|
|5              济南金龙            山东           88                19|
|6              重庆元欧            重庆           79                16|
|____________________________________________________________________________|


3、建"Employees"表 它有如下字段
eid(序号)   ename(姓名)    eage(年龄)    ecity(城市)     esex(性别)    cid(对应的公司)
_____________________________________________________________________________________________
|1           赵家货          35              上海               男              3            |
|2           王庭军          27              北京               男              2            |
|3           杨洋            28              上海               女              1            |
|4           文强            27              江苏               男              6            |
|5           罗标            40              广东               男              3            |
|6           李豪强          36              重庆               男              1            |
|7           刘佳佳          22              四川               女              4            |
|8           罗兵            42              重庆               男              2            |
|9           王家燕          30              贵州               女              2            |
|10          刘小明          35              浙江               男              3            |
|____________________________________________________________________________________________|

执行以下SQL


/*1、新建数据库*/
CREATE DATABASE mydb;

/*2、选择数据库*/
use mydb;


/*3、新建company表结构*/
CREATE TABLE company(
	cid INT PRIMARY KEY IDENTITY,
	cname VARCHAR(20),
	caddr VARCHAR(20),
	cnum INT,
	cyear VARCHAR(20)
)

/*插入数据*/

TRUNCATE TABLE company;

INSERT INTO company(cname,caddr,cnum,cyear) VALUES('美盛隆制罐','广州',102,'10年');
INSERT INTO company(cname,caddr,cnum,cyear) VALUES('淄博大东金属','上海',116,'8年');
INSERT INTO company(cname,caddr,cnum,cyear) VALUES('深圳市艾博克斯','广州',98,'07年');
INSERT INTO company(cname,caddr,cnum,cyear) VALUES('嘉兴环亚包装','北京',56,'03年');
INSERT INTO company(cname,caddr,cnum,cyear) VALUES('济南金龙','山东',88,'19年');
INSERT INTO company(cname,caddr,cnum,cyear) VALUES('重庆元欧','重庆',79,'16年');



/*4、新建Employees表结构*/

CREATE TABLE Employees(
  eid INT PRIMARY KEY IDENTITY,
  ename VARCHAR(20),
  eage INT,
  ecity CHAR(10),
  esex CHAR(10),
  cid INT FOREIGN KEY REFERENCES company(cid)
)
/*插入数据*/
INSERT INTO Employees(ename,eage,ecity,esex,cid) VALUES('赵家货',35,'上海','男',3);
INSERT INTO Employees(ename,eage,ecity,esex,cid) VALUES('王庭军',27,'北京','男',2);
INSERT INTO Employees(ename,eage,ecity,esex,cid) VALUES('杨洋',28,'上海','女',1);
INSERT INTO Employees(ename,eage,ecity,esex,cid) VALUES('文强',27,'江苏','男',6);
INSERT INTO Employees(ename,eage,ecity,esex,cid) VALUES('罗标',40,'广东','男',3);
INSERT INTO Employees(ename,eage,ecity,esex,cid) VALUES('李豪强',36,'重庆','男',1);
INSERT INTO Employees(ename,eage,ecity,esex,cid) VALUES('刘佳佳',22,'四川','女',4);
INSERT INTO Employees(ename,eage,ecity,esex,cid) VALUES('罗兵',42,'重庆','男',2);
INSERT INTO Employees(ename,eage,ecity,esex,cid) VALUES('王家燕',30,'贵州','女',2);
INSERT INTO Employees(ename,eage,ecity,esex,cid) VALUES('刘小明',35,'浙江','男',3);








执行一下

SQL练习题如下

/*1、查询每个公司有多少人*/
select c.cname,count(e.ename) as '公司人数' from company as c,employees as e where c.cid = e.cid group by c.cname order by count(e.ename);

/*2、查询员工人数大于100的公司?*/
select * from company where cnum>100;

/*3、查询年龄在30-40(包括30、40)之间的员工信息?*/
select * from employees where eage>=30 and eage<=40;
select * from employees where eage between 30 and 40;


/*4、查询员工表中男、女员工分别多少个?*/
select '男员工数量' as '分类',count(esex) as '数量' from employees where esex='男'
union
select '女员工数量' as '分类',count(esex) as '数量' from employees where esex='女';

select esex,count(esex) as '人数' from employees group by esex;


/*5、员工表中哪个地市的员工人数最多?*/
select top 1 ecity,count(ename) as '人数' from employees group by ecity order by count(ename) desc;

/*6、分别查询出员工表中男员工和女员工中年龄最大的两个人的所有信息*/
select * from employees where eage=(select max(eage) from employees where esex='男')
union
select * from employees where eage=(select max(eage) from employees where esex='女');


/*7、都有哪些人在上海工作?*/
select * from employees as e,company as c where e.cid=c.cid and c.caddr='上海';


/*8、把叫“罗兵”的人转到“重庆元欧”下*/
update employees set cid=(select cid from company where cname='重庆元欧') where eid=(select eid from employees where ename='罗兵');

/*9、在“济南金龙”公司加入如下信息的一个员工(姓名:张俏俏,年龄:28,城市:昆明,性别:女)*/
DECLARE @cid INT;
SELECT @cid = cid FROM company WHERE cname = '济南金龙';
INSERT INTO employees(ename, eage, ecity, esex, cid) VALUES('张俏俏', 28, '昆明', '女', @cid);

/*10、人平均年龄最小的公司是哪个公司*/
select top 1 cname,avg(eage) as '公司的平均年龄' from company as a,employees as b where a.cid=b.cid group by cname order by avg(eage) asc;

/*11、删除“深圳市艾博克斯”中年龄最大的那个人的信息?*/
delete from employees where eid = (select e.eid from company as c,employees as e where c.cid=e.cid and c.cname='深圳市艾博克斯' and e.eage=(select max(e.eage) from company as c,employees as e where c.cid=e.cid and c.cname='深圳市艾博克斯'))






多表查询练习2


/*创建表*/
create table company(
id int primary key identity,
cname varchar(50),
cyear varchar(255),
csum int,
caddr varchar(50)
);

/*插入数据*/
insert into company(cname,cyear,csum,caddr) values('重庆新东方','10年',8000,'重庆');
insert into company(cname,cyear,csum,caddr)  values('成都水刚','8年',3800,'四川');
insert into company(cname,cyear,csum,caddr)  values('重庆欧元','11年',458,'重庆');
insert into company(cname,cyear,csum,caddr)  values('科技集团','3年',682,'重庆');
insert into company(cname,cyear,csum,caddr)  values('贵州茅台','5年',500,'贵州');


/*创建表*/
create table employees(
id int primary key identity,
ename varchar(50),
eage int,
ephone varchar(50),
esaley float(3),
epart varchar(50),
eid int,
foreign key(eid) references company(id)
);

/*插入数据*/
insert into employees(ename,eage,ephone,esaley,epart,eid) values('张军',26,'13562586912','3600','开发部',5);
insert into employees(ename,eage,ephone,esaley,epart,eid) values('王辉',30,'15802156236','5620','技术部',4);
insert into employees(ename,eage,ephone,esaley,epart,eid) values('张三进',21,'13562586912','2301','市场部',2);
insert into employees(ename,eage,ephone,esaley,epart,eid) values('杨小明',26,'13362586912','4520','开发部',2);
insert into employees(ename,eage,ephone,esaley,epart,eid) values('刘罗戈',19,'13862586912','6800','媒体部',4);
insert into employees(ename,eage,ephone,esaley,epart,eid) values('毛利华',26,'15552584448','324','市场部',1);

查询如下

/*1、在员工表中查询工资少于平均工资的人按年龄从高到低排序*/
select * from employees where esaley<(select avg(esaley) from employees) order by esaley desc;

/*2、每个公司有多少员工?(查询两张表)*/
select c.cname,count(e.eid) as '人数' from company as c,employees as e where c.id=e.eid group by c.cname;

/*3、查询姓张的人是哪几家公司的?*/
select c.cname,e.ename from company as c,employees as e where c.id=e.eid and e.ename like '张%';

/*4、查询工资最高与最低的两个人分别是*/
select * from employees where esaley=(select max(esaley) from employees)
union
select * from employees where esaley=(select min(esaley) from employees);

/*5、查询哪些员工在重庆的人*/
select c.caddr,e.ename from company as c,employees as e where c.id=e.eid and c.caddr='重庆';

/*6、查询每位员工分别在哪里上班*/
select c.caddr,e.ename from company as c,employees as e where c.id=e.eid;

/*7、查询哪个部门的人数最多*/
select top 1 epart,count(ename) from employees group by epart order by count(ename) desc;
select top 1 epart,count(a.eid) from employees as a group by epart order by count(a.eid) desc

/*8、哪个部门的工资(平均)最高*/
select top 1 epart,avg(esaley) from employees group by epart order by avg(esaley) desc;

/*9、显示成都水刚公司的员工人数*/
select Tab.cname,count(Tab.ename) from (select cname,ename from company inner join employees on company.id=employees.eid) as Tab where Tab.cname='成都水刚'group by Tab.cname;

/*10、查询哪家公司下没有员工!*/
select * from (select cname,ename from company left join employees on company.id=employees.eid) as Tab where Tab.ename is null;
/*验证*/
select cname,ename from company right join employees on company.id=employees.eid;

/*11、员工平均最小的公司是哪个公司*/
select top 1 cname as '公司名称',avg(eage)'平均年龄' from company as a,employees as b where a.cid=b.cid group by cname order by avg(eage) asc; 

select cname from company where cid=(select top 1 cid from employees group by cid order by avg(eage) asc)

当然大家也已自己发挥加入更多的测试数据,进行多表查询查询~

例如 以下给大家提出一些需求和修改~

4)、创建部门表"Department"
did(序号)     dname(部门名)
________________________________
|1             市场部          |
|2             媒体部          |
|3             宣传部          |
|4             软件部          |
|5             财务部          |
|6             研发部          |
|7             行政部          |
|______________________________|


5)、公司与部门对应表(Cop_dep)
cid(公司ID)     did(部门ID)
________________________________
|1                 1           |
|1                 2           |
|1                 7           |
|2                 1           |
|2                 3           |
|2                 5           |
|3                 6           |
|4                 4           |
|4                 6           |
|5                 2           |
|5                 3           |
|5                 7           |
|6                 1           |
|6                 2           |
|6                 4           |
|6                 7           |
|______________________________|


6)、修改"Employees",增加部门字段(did)
在不重新创建表的情况下,然后插入数据,如果如下:
eid(序号)   ename(姓名)    eage(年龄)    ecity(城市)     esex(性别)    cid(对应的公司)    did(部门ID)
__________________________________________________________________________________________________________
|1           赵家货          35              上海               男              3                2       |
|2           王庭军          27              北京               男              2                1       |
|3           杨洋            28              上海               女              1                7       |
|4           文强            27              江苏               男              6                6       |
|5           罗标            40              广东               男              3                1       |
|6           李豪强          36              重庆               男              1                4       |
|7           刘佳佳          22              四川               女              4                5       |
|8           罗兵            42              重庆               男              2                6       |
|9           王家燕          30              贵州               女              2                7       |
|10          刘小明          35              浙江               男              3                3       |
|________________________________________________________________________________________________________|  

SQL代码如下


/*创建部门表"Department"*/
create table department(
    did int primary key identity,
    dname varchar(20)
)

/*插入数据*/
insert into department(dname) values('市场部');
insert into department(dname) values('媒体部');
insert into department(dname) values('宣传部');
insert into department(dname) values('软件部');
insert into department(dname) values('财务部');
insert into department(dname) values('研发部');
insert into department(dname) values('行政部');


/*创建公司与部门对应表(Cop_dep)*/
create table cop_dep(
    cid int,
    did int,
    foreign key(did) references department(did),
    foreign key(cid) references company(cid)
);

/*插入数据*/
insert into cop_dep(cid,did) values(1,1);
insert into cop_dep(cid,did) values(1,2);
insert into cop_dep(cid,did) values(1,7);
insert into cop_dep(cid,did) values(2,1);
insert into cop_dep(cid,did) values(2,3);
insert into cop_dep(cid,did) values(2,5);
insert into cop_dep(cid,did) values(3,6);
insert into cop_dep(cid,did) values(4,4);
insert into cop_dep(cid,did) values(4,6);
insert into cop_dep(cid,did) values(5,2);
insert into cop_dep(cid,did) values(5,3);
insert into cop_dep(cid,did) values(5,7);
insert into cop_dep(cid,did) values(6,1);
insert into cop_dep(cid,did) values(6,2);
insert into cop_dep(cid,did) values(6,4);
insert into cop_dep(cid,did) values(6,7);


/*修改"Employees"表,增加部门字段(did)*/
alter table employees add did int; 


/*在不重新创建表的情况下,插入数据*/
update employees set did=2 where eid=1;
update employees set did=1 where eid=2;
update employees set did=7 where eid=;
update employees set did=6 where eid=4;
update employees set did=1 where eid=5;
update employees set did=4 where eid=6;
update employees set did=5 where eid=7;
update employees set did=6 where eid=8;
update employees set did=7 where eid=9;
update employees set did=3 where eid=10;

那么这样你就可以进行多表查询了,具体自行发挥吧~~

select * from company as c,department as d,cop_dep as c_d where c.cid = c_d.cid and d.did = c_d.did

如图

在查询中我们会灵活使用一些查询技巧以及子句,例如下:

分组查询解析 ✂️

在数据存在分组的情况下,有的时候我们需要把数据进行归类处理。

举个栗子

一个班级的学生,有时我们可能会按照性别进行归类。
一个学校的学生,我们可以按照年级进行归类等等。

在进行分组的查询的时候,分组要有依据,例如:国家的省份,如果你在查询的时候按照省份进行分组查询,
这样查询实际没有任何意义,这种情况的分组跟不分组查询没有区别,
因为省份本来就不可能出现重复,那么你归类的时候,本来有多少省份,最终你就会分出多少个组

例如下面这张表


查询每个部门员工的平均年龄!

问题分析

因为存在多个员工在一个部门的情况,所以我们要对部门进行分组处理!

SQL查询如下

select company, avg(age) as '平均年龄' from employees group by company

结果


group by …以XXX为分组的依据对数据进行查询。它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理。

注意:分组查询的时候,除了where子句中的字段和聚合函数里面的字段,任何其它地方出现的字段都必须在group by子句中出现
并且可以在包含 GROUP BY 子句的查询中使用 WHERE 子句,在进行任何分组之前,将消除不符合 WHERE 子句条件的数据行

As关键字 🔒

用来取别名,除了可以给字段取外,还可以给表取别名!

子查询 📍

把一个查询的结果作为另一个查询的条件!

举个栗子

查询年龄大于平均年龄的人 !

select * from username where page>(select avg(page) from username)

这就是子查询!
注意:子查询可以嵌套,嵌套多少层根据查询条件来确定。

我们再看看一个比较复杂一点点的多对多关系表查询案例~

SQL如下

/*1、创建一个名为“school”的数据库,基于这个数据库做以下操作*/
create database school;

/*2、创建学院表"college"*/
cid(序号)    cmark(学院标识)   cspe(专业名称)
_____________________________________________
|1              B001A           外语专业     |
|2              B002C           体育专业     |
|3              A010B           计算机专业   |
|4              B004C           音乐专业     |
|5              A002A           物理专业     |
|6              A004C           机械工程专业 |
|____________________________________________|


create table  college(
 cid int primary key identity,
 cmark varchar(50),
 cspe varchar(50)
);


/*插入数据*/
insert into college(cmark,cspe) values('B001A','外语专业');
insert into college(cmark,cspe) values('B002C','体育专业');
insert into college(cmark,cspe) values('A010B','计算机专业');
insert into college(cmark,cspe) values('B004C','音乐专业');
insert into college(cmark,cspe) values('A002A','物理专业');
insert into college(cmark,cspe) values('A004C','机械工程专业');


/*3、建"teacher"表 它有如下字段 */ 
tid(序号)     tname(姓名)    tclass(科目)    tage(年龄)      tyear(工龄)     t_cid(所在专业院校)
__________________________________________________________________________________
|1              赵言极           JAVA           35               103  |
|2              王小丫           音乐           28               084  |
|3              郭文彬           日语           32               071  |
|4              何静             数据库         26               033  |
|5              张兵             工程学         42               196  |
|6              刘波             体育           36               162  |
|________________________________________________________________________________|


create table teacher(
 tid int primary key identity,
 tname varchar(50),
 tclass varchar(50),
 tage int,
 tyear varchar(50),
 t_cid int,
 foreign key(t_cid) references college(cid)
);

/*插入数据*/
insert into teacher(tname,tclass,tage,tyear,t_cid) values('赵言极','JAVA',35,'10年',3);
insert into teacher(tname,tclass,tage,tyear,t_cid) values('王小丫','音乐',28,'08年',4);
insert into teacher(tname,tclass,tage,tyear,t_cid) values('郭文彬','日语',32,'07年',1);
insert into teacher(tname,tclass,tage,tyear,t_cid) values('何静','数据库',26,'03年',3);
insert into teacher(tname,tclass,tage,tyear,t_cid) values('张兵','工程学',42,'19年',6);
insert into teacher(tname,tclass,tage,tyear,t_cid) values('刘波','体育',36,'16年',2);

/*4、建"student"表 它有如下字段*/
sid(序号)   sname(姓名)    sage(年龄)    scity(城市)     sbirthday(出生年月)    
___________________________________________________________________________________________________
|1           杨言华          21              贵州               1988/02/05                        |
|2           王彬彬          19              陕西               1987/11/29                        |
|3           杨进            21              海南               1988/05/24                        |
|4           文军            22              新疆               1999/12/08                        |
|5           刘小燕          22              重庆               1999/02/09                        |
|6           李好强          23              贵州               1987/06/23                        |
|7           刘易阳          20              四川               1986/12/26                        |
|8           杨再妮          22              云南               1989/04/21                        |
|_________________________________________________________________________________________________|          


create table student(
   sid int primary key identity,
   sname varchar(20),
   sage int,
   scity varchar(20),
   times datetime
);

insert into student(sname,sage,scity,times) values('杨言华',21,'贵州','1988/02/05');
insert into student(sname,sage,scity,times) values('王彬彬',19,'陕西','1987/11/29 ');
insert into student(sname,sage,scity,times) values('杨进',21,'海南','1988/05/24');
insert into student(sname,sage,scity,times) values('文军',22,'新疆','1999/12/08');
insert into student(sname,sage,scity,times) values('刘小燕',22,'重庆','1999/02/09');
insert into student(sname,sage,scity,times) values('李好强',23,'贵州','1987/06/23');
insert into student(sname,sage,scity,times) values('刘易阳',20,'四川','1986/12/26');
insert into student(sname,sage,scity,times) values('杨再妮',22,'云南','1989/04/21');


/*5、学生与老师对应关系表"s_t"    /*是外键表!*/
老师tid          学生sid
__________________________
|1              3        |
|1              6        |
|2              2        |
|2              8        |
|3              1        |
|3              5        |
|4              7        |
|6              4        |
|________________________|


create table s_t(
    tid int,
    foreign key(tid) references teacher(tid),
    sid int,
    foreign key(sid) references student(sid),
    primary key(tid,sid)
);

/*插入数据*/
insert into s_t(tid,sid) values(1,3);
insert into s_t(tid,sid) values(1,6);
insert into s_t(tid,sid) values(2,2);
insert into s_t(tid,sid) values(2,8);
insert into s_t(tid,sid) values(3,1);
insert into s_t(tid,sid) values(3,5);
insert into s_t(tid,sid) values(4,7);
insert into s_t(tid,sid) values(6,4);

SQL查询练习题

/*1、在"teacher"中增加一位老师(潭兵法)  科目(数学)  年龄(35)   工龄(18年)   物理专业*/
DECLARE @target_cid INT;
SELECT @target_cid = cid FROM college WHERE cspe = '物理专业';
INSERT INTO teacher(tname, tclass, tage, tyear, t_cid) VALUES ('潭兵法', '数学', 35, 18, @target_cid);

/*2、把"刘易阳"转到新增老师"潭兵法"的科目下*/
update s_t set tid=(select tid from teacher where tname='潭兵法') where sid=(select sid from student where sname='刘易阳');

/*3、查询 哪些学生上的"音乐"科目*/
select sname,tclass from student as s,teacher as t,s_t as x where x.tid=t.tid and x.sid=s.sid and tclass='音乐';


/*4、查询除"重庆 云南 四川"以外的学生姓杨的人的所有信息*/
select * from student where scity not in('重庆','云南','四川') and sname like '杨%';


/*5、查询"贵州 海南"等地的人都在哪些老师那里上课*/
select t.tname,s.sname,s.scity from student as s,teacher as t,s_t as x where x.tid=t.tid and x.sid=s.sid and scity in('贵州','海南');


/*6、查询每个学生分别上的什么科目? 以及对应的老师是谁*/
select t.tname,t.tclass,s.sname from student as s,teacher as t,s_t as x where x.tid=t.tid and x.sid=s.sid;


/*7、查询上什么专业的学生最多*/
select top 1 c.cspe,count(x.sid) from college as c,teacher as t,student as s,s_t as x where c.cid=t.t_cid and x.tid=t.tid and x.sid=s.sid group by c.cspe order by count(s.sname) desc;


/*8、年龄最大的学生是什么专业*/
select top 1 s.sname,s.sage,c.cspe from college as c,teacher as t,student as s,s_t as x where c.cid=t.t_cid and x.tid=t.tid and x.sid=s.sid order by s.sage desc;

/*9、哪个老师的“工龄”最大,以及所教的专业是*/
select top 1 t.tname,t.tyear,c.cspe from teacher as t,college as c where c.cid=t.t_cid order by t.tyear desc;


/*10、年龄最大与最小的学生分别上的什么专业*/
select s.sname,s.sage,c.cspe from college as c,teacher as t,student as s,s_t as x where c.cid=t.t_cid and x.tid=t.tid and x.sid=s.sid and s.sage=(select max(sage) from student)
union
select s.sname,s.sage,c.cspe from college as c,teacher as t,student as s,s_t as x where c.cid=t.t_cid and x.tid=t.tid and x.sid=s.sid and s.sage=(select min(sage) from student);

/*12、删除“外语专业”专业*/
/*首先把外语专业下面的老师和学生关联关系 然后删除老师,最后删除外语这个专业*/

DECLARE @cid INT;
/*保存专业的ID*/
select @cid=c.cid from college as c,teacher as t where c.cid=t.t_cid and c.cspe='外语专业';
/*1.先删除老师和学生的关联表数据*/
delete from s_t where sid in (select s.sid from college as c,teacher as t,student as s,s_t as x where c.cid=t.t_cid and x.tid=t.tid and x.sid=s.sid and c.cspe='外语专业')
/*2.继续删除外语专业下的老师*/
delete from teacher where t_cid = @cid
/*最后删除专业*/
delete from college where cspe='外语专业';


/* 13、查询学生表中都有哪些地方的学生?*/
select distinct scity from student

/*14、都有哪些学生上体育课? */
select s.sname,t.tclass from student as s,teacher as t,s_t where s.sid=s_t.sid and t.tid=s_t.tid and t.tclass='体育'

/* 15、分别查询出老师跟学生中年龄最小的人? */
select '学生',sname,sage from student where sage=(select min(sage) from student)
union
select '老师',tname,tage from teacher where tage=(select min(tage) from teacher)


/*16、查询刘波老师对应的学生有几个*/
select * from teacher as t inner join s_t as st 
on st.tid=t.tid inner join student as s on st.sid=s.sid 
where t.tid=(select tid from teacher  where tname='刘波');

select '刘波'as '老师名称',count(s.sid) as '学生数' from teacher as t 
inner join s_t as st on st.tid=t.tid 
inner join student as s on st.sid=s.sid 
where t.tid=(select tid from teacher  where tname='刘波');


/*17、查询每个学生分别上的什么课*/
select s.sname,t.tclass from teacher as t inner join s_t
on t.tid = s_t.tid
inner join student as s
on s.sid = s_t.sid


/*18、查询哪些学生上有相同的课?*/

/*首先建立关系*/
select * from teacher as t inner join s_t
on t.tid = s_t.tid
inner join student as s
on s.sid = s_t.sid

/*查询结果*/
select * from student,(select * from s_t as top_st where top_st.tid not in(
select s_t.tid from teacher as t inner join s_t
on t.tid = s_t.tid
inner join student as s
on s.sid = s_t.sid
group by s_t.tid,t.tclass
having count(s_t.tid)<2)) as sub where student.sid = sub.sid


/*相反的问题:哪门课只有一个学生上?*/
select s_t.tid,t.tclass from teacher as t inner join s_t
on t.tid = s_t.tid
inner join student as s
on s.sid = s_t.sid
group by s_t.tid,t.tclass
having count(s_t.tid)<2;


/*19、上什么课的学生最多,老师是谁,以及人数*/

/*首先建立关系*/
select * from teacher as t 
inner join s_t on t.tid = s_t.tid
inner join student as s on s.sid = s_t.sid

/*进一步查询*/
select top 1 t.tclass,count(s.sid) as '学生人数',t.tname from teacher as t 
inner join s_t on t.tid = s_t.tid
inner join student as s on s.sid = s_t.sid
group by t.tclass,t.tname
order by count(s.sid) desc

/*方法2*/
select * from teacher as t,
/*创建临时表,再其中进行分组与排序*/
(select top 1 st.tid from student as s,s_t as st where s.sid = st.sid group by st.tid order by count(st.sid) desc) as temp_tab
/*整合关系*/
where t.tid = temp_tab.tid;


/* 20、每个老师上课的学生有多少,从少到多进行排列? */

/*首先建立关系*/
select * from teacher as t 
inner join s_t on t.tid = s_t.tid
inner join student as s on s.sid = s_t.sid


select t.tname as '老师姓名',count(s_t.sid) as '上课人数' from teacher as t 
inner join s_t on t.tid = s_t.tid
inner join student as s on s.sid = s_t.sid
group by s_t.tid,t.tname
order by count(s_t.sid) desc


/* 21、哪个老师教的学生平均年龄最小 */

/*首先建立关系*/
select * from teacher as t 
inner join s_t on t.tid = s_t.tid
inner join student as s on s.sid = s_t.sid


select t.tname as '老师姓名',avg(s.sage) as '学生平均年龄' from teacher as t 
inner join s_t on t.tid = s_t.tid
inner join student as s on s.sid = s_t.sid
group by s_t.tid,t.tname
order by avg(s.sage) asc




知识点复习 🛠

聚合函数 ⛓️‍💥

以上的SQL查询中我们也多次使用到了 这些聚合函数

函数名函数说明
SUM求和
MIN求最小值
MAX求最大值
COUNT(*)选择选定的行数(记录数)
AVG求平均数
表与表之间的关系 🔍

彻底搞清楚表与表之间的关系是非常重要的,这会涉及到我们SQL语句如何有利的去编写!

我们平常所遇见的表与表之间的关系也也就是以下几种情况:
✅ 一对一
✅ 一对多
✅ 多对多

举个栗子

1-1的关系(一对一) 🎁

例如:一台电脑对应一个地址(IP地址),学生与学号这种关系的建立
我们以学生与学号为例:

学生表

IDsName姓名sAge年龄sSex性别
1张三20
2张丽22
3小王18

学号表

IDnNum学号nClass学院
1001A02体育
2002B08英语
3001A12体育

针对这种1-1对应的关系情况,从表的结构可以分析出,不需要创建额外的键,只需要让他们的主键一一对应,就可以让它们建立关系。

1-n的关系(一对多) 🎁

举个栗子

学生跟寝室号,学生跟学校,人跟国籍,会员与订单等等, 下面我们以学生跟学校为例说明:

学生表

IDsName姓名sAge年龄sSex性别
1张三20
2张丽22
3小王18

学校表

IDsName学校名sCity所在城市
1清华北京
2复旦浙江
3重大重庆
4上海交大上海

这种一对多的关系我们该如何起来?

例如:张三跟小王都在重大读,张丽在清华。
通过分析,不可能再用主键搭关系,而需要再建立一个键(外键)

假如外键在一(学校)的一方,结构如下:

IDsName学校名sCity所在城市sid
1清华北京2
2复旦浙江
3重大重庆1,3
4上海交大上海

显示这样对于查询不方便,就好比学生跟老师,老师去记每一个学生是很难的

而每一个学校去记老师却是很容易的

所以外键应该建立在多的一方(多个对应一个的时候)。

所以我们上面的1-n的关系应该建立在学生表中。

这需要你平常要对数据结构分析有明确的理解!

如下

IDsName姓名sAge年龄sSex性别sID
1张三203
2张丽221
3小王183

搞懂了吧~~

n-n的关系(多对多) 🎁

举个栗子

学生跟老师的关系~

一个学生是不是可以在多个老师下上课?

反过来一个老师是不是可以给多个学生上课!

那么表如下建立~

学生表

IDsName姓名sAge年龄sSex性别
1张三20
2张丽22
3小王18
4刘波23

老师表

IDtName姓名tClass
1杨老师数学
2王老师英语
3罗老师体育

那么问题来了~ 假如:张三上的是英语,张丽跟刘波上的是数学,小王上的是体育

那么这种关系我们应该怎么建立?

首先

1、用主键对应绝对不可能

2、用外键,由于是多对多的关系,外键建立在任意一方都无所谓。

假如外面在老师表,最终老师表的结构如下:

IDtName姓名tClasssID
1杨老师数学2,4
2王老师英语1
3罗老师体育3

从表的结构可以看出,这种情况跟一对多的时候把外键建立在一的一方是一样的,

显然这对于处理数据非常麻烦,那么我们应该怎么办?

解决办法:用第三张表s_t

学生ID老师ID
12
21
33
41

用这种方法建立的第三张表

为了保证数据不能重复(以行为基础)就得建立联合主键 也就是多个字段同时整体作为主键

多表查询的方式 🎁

在前面的案例中,我们都进行了多个表的查询~

对两张以上的表进行的查询,如果直接对多个表查询的时候,表与表之间用逗号隔开。

就像下面员工表公司表一样,数据如下:



如果直接查询这两张表:

SQL如下

select * from company,employees

结果集部分数据如下

从结果集可以,最终得到的数据量是两张表记录数的乘积,在数学里面叫迪卡尔积

所以说我们在进行多表查询的时候要注意了,不要把没有建立关系的多表放在一起进行查询,否则会出现过多的无意义的数据!

多表的查询SQL基本机构

两个表的查询 如下:

SELECT * FROM1 ,2 WHERE [1].条件字段=2.条件字段

三个表的查询 如下

SELECT * FROM1,2,3 WHERE3.条件字段=1.条件字段 And3.条件字段=2.条件字段

注意:在多表查询的时候,尽量使用as关键字给表命名别名,方便查询!

union关键字 🧬

作用:合并结果集
查询条件:每个结果集的列数必须一致,每个字段的数据类型也必须一一对应

语法

语法:
SELECT 字段名(s) FROM table_name1 
UNION 
SELECT 字段名(s) FROM table_name2

举个栗子: 查询工资最高的人与最低的人

select * from employees where salary=(select max(salary) from employees)
union
select * from employees where salary=(select min(salary) from employees)
多表查询之级联查询 🖍
1. inner join…on 🔑

内联:把左表右表符合条件的查询出来,前面我们都有讲过·

语法结构

SELECT */[字段] FROM1,2 WHERE1.条件字段 =2.条件字段

等同于

SELECT */[字段] FROM1
INNER JOIN2 ON1.条件字段 =2.条件字段
ORDER BY ....

举个栗子:查询员工分别在哪个公司上班

select * from employees as e
inner join company as c
on e.cid=c.id

如果是3个表以上进行内联查询

语法

SELECT */字段 FROM1 AS 别名 INNER JOIN3 AS 别名
ON1.条件字段=3.条件字段
INNER JOIN2 AS 别名
ON2.条件字段=3.条件字段
....以此类推
2、left join…on 🔑

左外联:把左表全部查询出来,右表符合条件的查询出来,不符合条件补NULL

例如

select * from company as c
left join employees as e
on e.cid=c.id

如图

3.right join… on 🔑

右外联:把右表全部查询出来,左表符合条件的条件出来,不符合条件补NULL

例如

select * from employees as e
right join company as c
on e.cid=c.id

如图

4、full join…on 🔑

全联:把左边右边全部查询(按条件),不符合条件补NULL

例如

select * from employees as e
full join company as c
on e.cid=c.id

等同于

select * from company as c
full join employees as e
on e.cid=c.id

最后 🎀

在这里做一个简单的总结:
单表的查询使用SELECT语句,基本子句有SELECT、FROMWHERE
WHERE子句中可以对结果集做各种限制,ORDER BY子句可以对查询的结果集排序,同时SQL Server2000提供了大量函数,常用的有字符串函数、数学函数和日期时间函数

学到这里你应该掌握了理解数据库的实体关系模型,以及查看表间关系的方法,掌握内联接、外联接、交叉联接和自联接,掌握UNION合并结果集的方法了!

在我们学习数据的时候,要注重分析需求,创建表,定义列、主键和数据类型!
尤其是分析表之间的关系,定义外键约束保证参照完整性等等~~

我们在实际开发中,还会遇到很多表之间的关系结构,

如图

只有把基础掌握了,才能看懂这些关系~ 同时优化数据的设计,实现数据的完整性 !

"👍点赞" "✍️评论" "收藏❤️"

大家的支持就是我坚持下去的动力!

如果以上内容有任何错误或者不准确的地方,🤗🤗🤗欢迎在下面 👇👇👇 留个言指出、或者你有更好的想法,
欢迎一起交流学习❤️❤️💛💛💚💚

更多好玩 好用 好看的干货教程可以点击下方关注❤️微信公众号❤️
说不定有意料之外的收获哦..🤗嘿嘿嘿、嘻嘻嘻🤗!
🌽🍓🍎🍍🍉🍇

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值