链接
自然链接
是一种特殊的等值连接,它要求两个关系进行比较的分量必须是相同的属性组,并且在结果集中将重复属性列去掉。
内链接
内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符)。包括相等联接和自然联接。
内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。
例如,检索 students和courses表中学生标识号相同的所有行。
外链接
外联接可以是左向外联接、右向外联接或完整外部联接
下面用实验来表示一下
1.首先建立一个用于试验的两个表A,B;
CREATE TABLE A(
id INT NOT NULL PRIMARY KEY,
name CHAR(30) NOT NULL,
);
CREATE TABLE B(
id INT NOT NULL PRIMARY KEY,
class INT NOT NULL,
text INT NOT NULL
);
2.添加一些内容
USE student;
INSERT INTO dbo.A(id,name)VALUES(1,'Tom');
INSERT INTO dbo.A(id,name)VALUES(2,'Jack');
INSERT INTO dbo.A(id,name)VALUES(3,'Mary');
INSERT INTO dbo.B(id,class,text)VALUES(1,'001',1);
INSERT INTO dbo.B(id,class,text)VALUES(2,'002',2);
INSERT INTO dbo.B(id,class,text)VALUES(3,'003',4);
下面就开始链接实验;
对照表
1) 内连接
SELECT A.*,B.* FROM A INNER JOIN B ON A.id=B.text;
结果是
2)左连接
SELECT A.*,B.* FROM A LEFT JOIN B ON A.id=B.text;这里写代码片
结果是
3) 右连接
SELECT A.*,B.* FROM A RIGHT JOIN B ON A.id=B.text;
结果是
4) 完全连接
SELECT A.*,B.* FROM A FULL JOIN B ON A.id=B.text;
结果是
备注:
1.在做链接时,如果不加限制赋,展现出来的时两个表的笛卡尔集;
2.当在SQL Server 上进行sql语句操作时,要注意,有些名词报错是因为同框上一条语句还也没有执行,所以建议逐条执行;
多表查询
复合条件链接,多表联合查询(注意对应关系)
SELECT A.*,B.* FROM A,B WHERE A.id=B.id;
sql标准 in () 为 集合
SELECT A.*,B.* FROM A,B WHERE A.id=B.id AND A.id IN (1,3);
嵌套查询
工作方式是:先处理内查询,由内向外处理。
举例:
SELECT student.name,class.grade
FROM student,class
WHERE student.id=class.id
AND
grade=(SELECT MAX(grade) FROM class)
//这是在查询成绩最好的学生的姓名和成绩
实例 不相关嵌套
SELECT A.name,B.text
FROM A,B
WHERE A.id=B.id
AND text=(SELECT MAX(text) FROM B);
小知识 | |
---|---|
AVG() | 平均值 |
SUM() | 总和值 |
MAX() | 最大值 |
MIX() | 最小值 |
COUNT() | 返回被选行数 |
LAST() | 返回所在域中最后一个记录的值 |
实例 多层嵌套
SELECT id,name FROM student WHERE Sno IN ******
SELECT * FROM A WHERE //3.第三步进行将选了这门课程的学生列出
id IN(SELECT id FROM B WHERE//2.第二步,将课程id所对应的学生id传给最外层
text = (SELECT id FROM C WHERE subject='physics')//1.第一步选出physics所对应的课程id
)
注意
多层嵌套,如同递归,剥茧抽丝,利用多表嵌套查询,从而层层对应得到需要的答案,在使用时会有许多表中其他元素做干扰,要注意!!!
实例 相关子查询
复习:别名的使用
SELECT id,name FROM A X
WHERE id <=(SELECT AVG(text)FROM B Y
WHERE Y.id=X.id);
SELECT AVG(text)FROM B;
当我们把sql语句进行修改,去掉了联合查询,此时id=2
SELECT id,name FROM A
WHERE id =(SELECT AVG(text)FROM B);
在进行相关子查询时,要注意使用表的联查,否则会导致查询范围出错。
同时注意查询思路,以及对应括号的数量。
带有ANY(SOME)或ALL谓词修饰,需要比较运算符
SELECT FROM student *********
EXISTS 子查询中存在谓词
插入数据
使用INSERT INTO 语句,语句有两种,
将所有的列全部列出
INSERT INTO B(id,class,text)VALUES (1,001,1);
/*当要插入的数据为字符型的时候,需要在数据上加单引号*/
INSERT INTO A(id,name)VALUES(4,'Jack');
INSERT INTO A(id,name)VALUES(5,'Mak');
INSERT INTO A(id,name)VALUES(6,'Bob');
将所需添加的数据列出即可
INSERT INTO D(id,name)VALUES(1,'JARY');
INSERT INTO D(id,age)VALUES(2,15);
1.要注意顺序问题,插入值与前方的列对应
2. 当列的规范性约束可以为空时,才能选择不添加
按照表的顺序将数据写入
当然在与表进行全部按顺序添加数据的时候,可以直接简便的写成
INSERT INTO D VALUES(3,'JARY',14);
INSERT INTO D VALUES(4,'Tom',15);
总结 INSERT INTO
- 1.注意顺序
2.字符型要加单引号
3.当约束条件有 NOT NULL
就不能令其为空