SQL语句以及面试题整理

SQL语句以及面试题整理

SQL语句:

SQL SELECT 语句:
用于从表中选取数据。结果被存储在一个结果表中(称为结果集)。

     1、SELECT 列名称 FROM 表名称:SELECT LastName,FirstName FROM Persons
     2、SELECT * FROM 表名称:SELECT * FROM Persons

SQL SELECT DISTINCT 语句:
在表中,可能会包含重复值。关键词 DISTINCT 用于返回这些重复值中的一个,不重复值正常返回。

SELECT DISTINCT 列名称 FROM 表名称:SELECT DISTINCT Company FROM Orders

SQL WHERE 子句:
如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句。条件语句,多和其他语句配合使用。确认条件使用值的类型。

SELECT 列名称 FROM 表名称 WHERE 列 运算符 值:SELECT * FROM Persons WHERE FirstName='Bush'(文本值)
                                            SELECT * FROM Persons WHERE Year>1965(数据值)

SQL AND & OR 运算符:
AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来。
如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。
如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录。

SELECT * FROM Persons WHERE FirstName='Thomas' AND LastName='Carter'
SELECT * FROM Persons WHERE firstname='Thomas' OR lastname='Carter'
SELECT * FROM Persons WHERE (FirstName='Thomas' OR FirstName='William') AND LastName='Carter'

SQL ORDER BY 子句:
ORDER BY 语句用于根据指定的列对结果集进行排序。
ORDER BY 语句默认按照升序对记录进行排序。
如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。

以逆字母顺序显示公司名称,并以数字顺序显示顺序号:
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC

SQL INSERT INTO 语句:
INSERT INTO 语句用于向表格中插入新的行。

INSERT INTO 表名称 VALUES (值1, 值2,....):INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees')

SQL UPDATE 语句:
Update 语句用于修改表中的数据。

UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值:UPDATE Person SET FirstName = 'Fred' WHERE LastName = 'Wilson' 

SQL DELETE 语句:
DELETE 语句用于删除表中的行。

DELETE FROM 表名称 WHERE 列名称 = 值:DELETE FROM Person WHERE LastName = 'Wilson' 
删除所有行:DELETE * FROM table_name

SQL TOP 子句:
TOP 子句用于规定要返回的记录的数目。
对于拥有数千条记录的大型表来说,TOP 子句是非常有用的。
注释:并非所有的数据库系统都支持 TOP 子句。

MySQL 等价语法:SELECT column_name(s) FROM table_name LIMIT number
Oracle 等价语法:SELECT column_name(s) FROM table_name WHERE ROWNUM <= number
SELECT TOP number|percent column_name(s) FROM table_name:SELECT TOP 50 PERCENT * FROM Persons/SELECT TOP 2 * FROM Persons

SQL LIKE 操作符:
IKE 操作符用于在 WHERE 子句中搜索列中的指定模式。

SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern:SELECT * FROM Persons WHERE City LIKE '%lon%'
#从 "Persons" 表中选取居住在包含 "lon" 的城市里的人
#"%" 可用于表示模式中缺少的字母。

SQL Alias(别名):
通过使用 SQL,可以为列名称和表名称指定别名(Alias)。

表的 SQL Alias 语法:SELECT column_name(s) FROM table_name AS alias_name
列的 SQL Alias 语法:SELECT column_name AS alias_name FROM table_name
SELECT po.OrderID, p.LastName, p.FirstName  FROM Persons AS p, Product_Orders AS po WHERE p.LastName='Adams' AND p.FirstName='John'
SELECT LastName AS Family, FirstName AS Name FROM Persons

SQL JOIN:
Join 和 Key
有时为了得到完整的结果,我们需要从两个或更多的表中获取结果。我们就需要执行 join。
数据库中的表可通过键将彼此联系起来。主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。在表中,每个主键的值都是唯一的。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons, Orders WHERE Persons.Id_P = Orders.Id_P 
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons INNER JOIN Orders ON Persons.Id_P = Orders.Id_P ORDER BY Persons.LastName
#上下两个语句效果相同

SQL UNION 和 UNION ALL 操作符:
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。

SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
#默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。

SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2
#SQL UNION ALL 语法

SQL SELECT INTO 语句:
SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中。
SELECT INTO 语句常用于创建表的备份复件或者用于对记录进行存档。

SELECT column_name(s)
INTO new_table_name [IN externaldatabase] 
FROM old_tablename   
eg:
#创建一个名为 "Persons_Order_Backup" 的新表,其中包含了从 Persons 和 Orders 两个表中取得的信息
SELECT Persons.LastName,Orders.OrderNo
INTO Persons_Order_Backup
FROM Persons
INNER JOIN Orders
ON Persons.Id_P=Orders.Id_P

SQL CREATE INDEX 语句:
CREATE INDEX 语句用于在表中创建索引。
在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据
更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。

在表上创建一个简单的索引。允许使用重复的值:
CREATE INDEX index_name
ON table_name (column_name)
在表上创建一个唯一的索引。唯一的索引意味着两个行不能拥有相同的索引值:
CREATE UNIQUE INDEX index_name
ON table_name (column_name)
eg:
1、创建一个简单的索引,名为 "PersonIndex",在 Person 表的 LastName 列:
CREATE INDEX PersonIndex
ON Person (LastName) 
2、索引不止一个列:
REATE INDEX PersonIndex
ON Person (LastName, FirstName)
3、降序索引某个列中的值,可以在列名称之后添加保留字 DESC:
CREATE INDEX PersonIndex
ON Person (LastName DESC) 

SQL 撤销索引、表以及数据库:

SQL DROP INDEX 语句(用于 MySQL 的语法):ALTER TABLE table_name DROP INDEX index_name
SQL DROP TABLE 语句(DROP TABLE 语句用于删除表(表的结构、属性以及索引也会被删除):DROP TABLE 表名称
SQL DROP DATABASE 语句:DROP DATABASE 数据库名称
SQL TRUNCATE TABLE 语句(仅仅删除表格中的数据,但并不删除表本身):TRUNCATE TABLE 表名称

SQL ALTER TABLE 语句:
ALTER TABLE 语句用于在已有的表中添加、修改或删除列。

SQL ALTER TABLE 语法:
1、在表中添加列
ALTER TABLE table_name
ADD column_name datatype
2、删除表中的列
ALTER TABLE table_name 
DROP COLUMN column_name
3、改变表中列的数据类型
ALTER TABLE table_name
ALTER COLUMN column_name datatype

在表 "Persons" 中添加一个名为 "Birthday" 的新列:
ALTER TABLE Persons
ADD Birthday date

SQL GROUP BY 语句:
合计函数 (比如 SUM) 常常需要添加 GROUP BY 语句。

SQL GROUP BY 语法:
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
eg: 
1、"Orders" 表中,查找每个客户的总金额。
SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
2、也可以对一个以上的列应用 GROUP BY 语句:
SELECT Customer,OrderDate,SUM(OrderPrice) FROM Orders
GROUP BY Customer,OrderDate

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

SQL HAVING 语法:
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value

eg:
1、在"Orders" 表中,查找订单总金额少于 2000 的客户
SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
HAVING SUM(OrderPrice)<2000
2、查找客户 "Bush" 或 "Adams" 拥有超过 1500 的订单总金额
SELECT Customer,SUM(OrderPrice) FROM Orders
WHERE Customer='Bush' OR Customer='Adams'
GROUP BY Customer
HAVING SUM(OrderPrice)>1500

SQL面试题整理:
1、用一条SQL 语句 查询出每门课都大于80 分的学生姓名,有3列name,subject,grade,表名table

select name from table
group by name
having min(grade) > 80

2、删除除了自动编号不同, 其他都相同的学生冗余信息,表名table
图片

delete from table
where 自动编号 not in(
select min( 自动编号)
from table
group by 学号,姓名,课程编号,课程名称,分数)
#select * from table group by 学号,姓名,课程编号,课程名称,分数)已经分好组,同类项合并,然后获取id,id不在的则删除掉

3、一个叫 team 的表,里面只有一个字段name, 一共有4 条纪录,分别是a,b,c,d, 对应四个球对,现在四个球对进行比赛,用一条sql 语句显示所有可能的比赛组合。

select team.name into teama,teamb from team
select *
from team a, team b 
where a.name < b.name

4、请用SQL 语句实现:从TestDB 数据表中查询出所有月份的发生额都比101 科目相应月份的发生额高的科目。请注意:TestDB 中有很多科目,都有1 -12 月份的发生额。
AccID :科目代码,Occmonth :发生额月份,DebitOccur :发生额。
数据库名:JcyAudit ,数据集:Select * from TestDB

1、101科目所有月份的发生额
select Occmonth,DebitOccur from TestDB where AccID= 101
2、接着查询表中除了101科目外,月发生额比101对应月份的发生额高的科目信息
select a.* from TestDB a,
(select Occmonth,DebitOccur from TestDB where AccID= 101)b
where a.OccMonth=b.OccMonth and a.DebitOccur>b.DebitOccur
3、最后去掉不是每一个月份的发生额都比101科目对应月份的发生额高的科目
select AccID from 
(
    select a.* from account a,
        (select occMonth,debitOccur from account where accID='101') b 
    where a.occMonth=b.occMonth and a.debitOccur>b.debitOccur
) c 
group by AccID having count(occMonth)=12;

5、怎么把这样一个表儿
在这里插入图片描述
查成这样一个结果
在这里插入图片描述

select year,
(select amount as m1from table  where month = 1 ),
(select amount as m2 from table  where month = 2) ,
(select amount as m3 from table t where month = 3 ) ,
(select amount as m4 from table  where month = 4 ) 
from table group by year

6、说明:复制表( 只复制结构, 源表名:a新表名:b)

select * into b from a where 1<>1
select top 0 * into b from a

7、说明:拷贝表( 拷贝数据, 源表名:a目标表名:b)

insert into b(a, b, c)
select d,e,f from a;

8、说明:显示文章、提交人和最后回复时间

select a.title,a.username,b.adddate
from table a,(
select max(adddate) adddate
from table where table.title=a.title
) b

9、说明:外连接查询( 表名1 :a表名2 :b)

select a.a, a.b, a.c, b.c, b.d, b.f
from a LEFT OUTER JOIN b ON a.a = b.c

10、说明:日程安排提前五分钟提醒

select * from 日程安排
where datediff('minute',开始时间,getdate())>5

11、说明:两张关联表,删除主表中已经在副表中没有的信息

Delete from info
where not exists (
select * from infobz
where info.infid=infobz.infid

)

12、有两个表A 和B ,均有key 和value 两个字段,如果B 的key 在A 中也有,就把B 的value 换为A 中对应的value
这道题的SQL 语句怎么写?

update b set b.value=(
select a.value
from a where a.key=b.key)
where b.id in(
select b.id from b,a
where b.key=a.key);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值