SQL杂记(一)
SQL杂记
理论篇
-
什么是SQL?
SQL(结构化查询语言)是一种设计用于检索和操作数据的数据库。它属于美国国家标准协会(ANSI)的一种标准,可用于执行Select(选择)、Update(更新)、Delete(删除)和Insert(插入)等数据任务。 -
数据库中的表和字段是什么?
数据库是有序形式的一组信息,用于访问、存储和检索数据,表是在具有列和行的模型中设计的数据集合。在表中,指定了列数称为字段,但未定义行数称为记录。 -
DBMS的类型是什么?
DBMS是一个控制数据维护和使用的程序,它被认为是管理数据的文件管理器。有四种类型的DBMS:关系DBMS、 分层DBMS、网络DBMS、面向对象的关系DBMS,最有用的DBMS是Relational DBMS。它为数据提供了一个关系运算符。 -
SQL中的视图是什么?
它包含来自一个或多个表的行和列,可以定义为虚拟表。它消耗的内存较少。
CREATE VIEW view_name AS
SELECT column_name1, column_name2
FROM table_name
WHERE CONDITION;
-
什么是SQL中的Joins(连接)?
Join用于从相关的行和列中检索数据。它在两个或多个表之间工作,并且它从两个表返回至少一个匹配
Joins类型是:
Right Join (右连接)
Left Join(左连接)
Inner Join(内连接)
Outer Join(外连接)
Self-Join (自连接)
Cross Join(交叉连接)
·Full Join(全连接 -
SQL中的Constraints(约束)是什么?
它可用于设置表中数据类型的限制。在创建或更新表语句时,可以使用约束。一些限制是:
NOT NULL
PRIMARY KEY
FOREIGN KEY
UNIQUE
CHECK
DEFAULT -
SQL中有多少Key(键),它们如何工作?
SQL中有不同类型的键:
SuperKey(超级密钥)——一个或多个密钥的集合被定义为超级密钥,它用于唯一地标识表中的记录。主键,唯一键和备用键是超级键的子集。
PrimaryKey(主键)——它是表中的一个或多个字段的集合。它们不接受空值和重复值。并且表中只存在一个主键。
ForeignKey(外键)——在一个表中定义主键并在另一个表中定义字段的键被标识为外键。
UniqueKey(唯一键)——除了主键之外,表中还有更多键,它们只标识记录,但唯一的区别是它们只接受一个空值但不接受重复值。
·CandidateKey(候选密钥)——在任何情况下,如果需要,任何候选密钥都可以作为主键。
CompoundKey(复合键)——此键是候选键和主键的组合。
· AlternateKey(备用密钥)——在任何情况下,如果需要,任何备用密钥都可以作为主键或候选键。 -
什么是Index(索引)?
索引用于加速查询的性能。它可以更快地从表中检索数据。可以在一组列上创建索引。
Clustered(群集)和Non-Clustered Index(非群集)索引之间有什么区别?
聚集索引——有助于轻松检索数据,并且只有一个聚集索引与一个表一起分配。它会更改记录在数据库中的保存方式。
非聚集索引——与聚集索引相比,非聚集索引很慢。并且在非集群索引的情况下,该表可以具有多个索引,为表创建一个对象,该表是搜索后指向表的一个点。 -
什么是Aggregate Functions(聚合函数)?
它是一个返回单个值的数学函数。SQL中的聚合函数是:
AVG()——返回平均值
COUNT()——返回行数
MAX()——返回最大值
MIN()——返回最小值
ROUND()——基于十进制规范,此函数对数字字段进行舍入
SUM()——返回总和 -
什么是String Functions(字符串函数)?
为了操作字符串,我们使用字符串函数。其中一些是:
LEN()——返回值的长度。
LOWER()——将字符数据转换为小写。
UPPER()——将字符数据转换为大写。
SUBSTRING()——提取字符。
LTRIM()——从头开始删除字符串的所有空格。
RTRIM()——删除结尾处字符串的所有空格。
CONCAT()——连接函数。
REPLACE()——更新内容。 -
SQL中有哪些Operators(运算符)?
运算符是一个保留字,主要用于SQL语句的WHERE子句中以进行操作。
算术运算
逻辑运算
比较运算符()
复合算子() -
如何定义NULL值,Blank Space(空格)和ZERO(0)?
Null值是没有值的字段。它与0不同。假设有一个表,并且在表中有一个字段,可以在不添加值的情况下将记录插入字段,然后该字段将以NULL值保存。
空格是我们提供的值,0只是一个数字。 -
如何确一个带有名为Fld1字段的TableB表格里只具有Fld1字段里的那些值,而这些值同时在名为TableA的表格的Fld1字段里?
这个与关系相关的问题有两个可能的答案。第一个答案(而且是您希望听到的答案)是使用外键限制。外键限制用来维护引用的完整性。它被用来确保表格里的字段只保存有已经在不同的(或者相同的)表格里的另一个字段里定义了的值。这个字段就是候选键(通常是另外一个表格的主键)。
另外一种答案是触发器。触发器可以被用来保证以另外一种方式实现与限制相同的作用,但是它非常难设置与维护,而且性能一般都很糟糕。由于这个原因,微软建议开发人员使用外键限制而不是触发器来维护引用的完整性。 -
对一个投入使用的在线事务处理表格有过多索引需要有什么样的性能考虑?
你正在寻找进行与数据操控有关的应聘人员。对一个表格的索引越多,数据库引擎用来更新、插入或者删除数据所需要的时间就越多,因为在数据操控发生的时候索引也必须要维护。 -
你可以用什么来确保表格里的字段只接受特定范围里的值?
这个问题可以用多种方式来回答,但是只有一个答案是“好”答案。您希望听到的回答是Check限制,它在数据库表格里被定义,用来限制输入该列的值。
触发器也可以被用来限制数据库表格里的字段能够接受的值,但是这种办法要求触发器在表格里被定义,这可能会在某些情况下影响到性能。因此,微软建议使用Check限制而不是其他的方式来限制域的完整性。
如果应聘者能够正确地回答这个问题,那么他的机会就非常大了,因为这表明他们具有使用存储过程的经验。
返回参数总是由存储过程返回,它用来表示存储过程是成功还是失败。返回参数总是INT数据类型。
OUTPUT参数明确要求由开发人员来指定,它可以返回其他类型的数据,例如字符型和数值型的值。(可以用作输出参数的数据类型是有一些限制的。)您可以在一个存储过程里使用多个OUTPUT参数,而您只能够使用一个返回参数。
案例篇
- 语句 查询出每门课都大于80 分的学生姓名
name kecheng fenshu
张三 语文 81
张三 数学 75
李四 语文 76
李四 数学 90
王五 语文 81
王五 数学 100
王五 英语 90
答案一:: select distinct name from table where name not in (select distinct name from table where fenshu<=80)
答案二:select name from table group by name having min(fenshu)>80
- 学生表 如下:
自动编号 学号 姓名 课程编号 课程名称 分数
1 2005001 张三 0001 数学 69
2 2005002 李四 0001 数学 89
3 2005001 张三 0001 数学 69
删除除了自动编号不同, 其他都相同的学生冗余信息
delete tablename where 自动编号 not in(select min( 自动编号) from tablename group by 学号, 姓名, 课程编号, 课程名称, 分数)
- 请用SQL 语句实现:
从TestDB 数据表中查询出所有月份的发生额都比101 科目相应月份的发生额高的科目。请注意:TestDB 中有很多科目,都有1 -12 月份的发生额。
AccID :科目代码;Occmonth :发生额月份;DebitOccur :发生额。
数据库名:JcyAudit ;数据集:Select * from TestDB
select a.*from TestDB a ,(select Occmonth,max(DebitOccur) Debit101ccur from TestDB where AccID=’101’ group by Occmonth) bwhere a.Occmonth=b.Occmonth and a.DebitOccur>b.Debit101ccur
- 用一条SQL语句,怎么显示如下结果
id dptID department name
1 1 设计 张三
2 1 设计 李四
3 2 市场 王五
4 3 售后 彭六
5 4 黑人 陈七
建表语句如下create table testtable1 ( id int IDENTITY, department varchar(12) ); select * from testtable1 insert into testtable1 values('设计’) insert into testtable1 values('市场’) insert into testtable1 values('售后’); /* 结果 id department 1 设计 2 市场 3 售后 */ create table testtable2 ( id int IDENTITY, dptID int, name varchar(12) ); insert into testtable2 values(1,’张三’); insert into testtable2 values(1,’李四’); insert into testtable2 values(2,’王五’); insert into testtable2 values(3,’彭六’); insert into testtable2 values(4,’陈七’)
;
SELECT testtable2.* , ISNULL(department,’黑人’)FROM testtable1 right join testtable2 on testtable2.dptID = testtable1.ID
- 有表A,结构如下:
A: p_ID p_Num s_id
1 10 01
1 12 02
2 8 01
3 11 01
3 8 03
其中:p_ID为产品ID,p_Num为产品库存量,s_id为仓库ID。请用SQL语句实现将上表中的数据合并,合并后的数据为:
p_ID s1_id s2_id s3_id
1 10 12 0
2 8 0 0
3 11 0 8
其中:s1_id为仓库1的库存量,s2_id为仓库2的库存量,s3_id为仓库3的库存量。如果该产品在某仓库中无库存量,那么就是0代替。
select p_id ,sum(case when s_id=1 then p_num else 0 end) as s1_id,sum(case when s_id=2 then p_num else 0 end) as s2_id,sum(case when s_id=3 then p_num else 0 end) as s3_id
- 怎么把这样一个表
year month amount
1991 1 1.1
1991 2 1.2
1991 3 1.3
1991 4 1.4
1992 1 2.1
1992 2 2.2
1992 3 2.3
1992 4 2.4
查成这样一个结果
year m1 m2 m3 m4
1991 1.1 1.2 1.3 1.4
1992 2.1 2.2 2.3 2.4
select year, (select amount from aaa m where month=1 and m.year=aaa.year) as m1,(select amount from aaa m where month=2 and m.year=aaa.year) as m2,(select amount from aaa m where month=3 and m.year=aaa.year) as m3,(select amount from aaa m where month=4 and m.year=aaa.year) as m4from aaa group by year
- 有3个表S,C,SC:
S(SNO,SNAME)代表(学号,姓名)
C(CNO,CNAME,CTEACHER)代表(课号,课名,教师)
SC(SNO,CNO,SCGRADE)代表(学号,课号,成绩)
问题:
1,找出没选过“黎明”老师的所有学生姓名。
2,列出2门以上(含2门)不及格学生姓名及平均成绩。
3,既学过1号课程又学过2号课所有学生的姓名。
- 考察条件筛选select sname from s where sno not in( select sno from sc where cno in (select distinct cno from c where cteacher='黎明' ));
- 考察聚合函数,条件筛选select s.sname, avg_grade from sjoin(select sno from sc where scgrade < 60 group by sno having count(*) >= 2) t1on s.sno = t1.snojoin(select sno, avg(scgrade) as avg_grade from sc group by sno ) t2on s.sno = t2.sno;
- 考察筛选、连接select sname from( select sno from sc where cno = 1) ajoin (select sno from sc where cno = 2) bon a.sno = b.sno
SQL面试题还有很多,今天就先列举一部分,想要更多的练习题目,可以关注网站:https://link.zhihu.com/?target=http%3A//www.w3school.com.cn/sql/index.asp
- 本文转载自公众号:风控圈子,作者:研习社-winnie。如有侵权,请联系我删除。
本文地址:https://blog.csdn.net/weixin_43127295/article/details/110946207