(以下内容是本人在准备面试时从相关网站整理出来的数据库知识汇总,实际面试做题时只遇到很简单的题目,贴在这里供日后自己回顾和大家参考)
1、SQL(Structured Query Language):结构化查询语言。SQL使我们有能力访问数据库,SQL是一种ANSI(美国国家标准化组织)的标准计算机语言。SQL对大小写不敏感,语句末可加分号。
2、SQL能做什么? ------增删改查
- 面向数据库执行查询;
- 可从数据库取回数据;
- 可在数据库中插入新的记录;
- 可更新数据库中的数据;
- 可从数据库删除记录;
- 可创建新数据库;
- 可在数据库中创建新表;
- 可在数据库中创建存储过程;
- 可在数据库中创建视图;
- 可以设置表、存储过程和视图的权限
3、SQL是一门ANSI的标准计算机语言,用来访问和操作数据库系统。SQL语句用于取回和更新数据库中的数据。SQL可与数据库程序协同工作,比如MS Access、DB2、Informix、MS SQL Server、Oracle、Sybase以及其他数据库系统。
4、RDBMS指的是关系型数据库管理系统。RDBMS是SQL的基础,同样也是所有现代数据库系统的基础。RDBMS中的数据存储在表(tables)中,表是相关的数据项的集合,由行和列组成。
5、SQL可分为两个部分:
- 数据操作语言(DML):SELECT、DELETE、INSERT INTO、UPDATE
- 数据定义语言(DDL):CREATE、DROP、ALTER
6、SQL SELECT 语句:
- SELECT * FROM table;
- SELECT LastName,FirstName FROM Persons;
7、SQL SELECT DISTINCT语句:
- SELECT DISTINCT LastName FROM Persons;
8、SQL WHERE 子句:
操作符有(=、<>、>、<、>=、<=、BETWEEN、LIKE、IN、NULL)
- SELECT * FROM Persons WHERE City =’Beijing’;
- SELECT * FROM Persons WHERE Year>1965;
9、SQL AND & OR 运算符:
- SELECT * FROM Persons WHERE (FirstName=’Thomas’ OR FirstName=’William’) AND LastName=’Carter’
10、SQL ORDER BY子句:(顺序ASC、倒序DESC)
- SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC
11、SQL 函数:
- AVG():返回数值列的平均值,不包括null值;
- COUNT():返回匹配指定条件的行数;
- SELECT COUNT(Store_Name) FROM Store_Information WHERE Store_Name IS NOT NULL;
- SELECT COUNT(DISTINCT Store_Name) FROM Store_Information;
3. MAX():返回一列中的最大值,null值不包括在计算中;
4. MIN():返回一列中的最小值,null值不包括在计算中;
- SELECT MIN(Salary) FROM Store_Information;
5. SUM() :返回数值列的总数(总额);
- SELECT SUM(Sales) FROM Store_Information;
6. FIRST():返回指定的字段中第一个记录的值;
- SELECT FIRST(OrderPrice) AS FirstOrderPrice FROM Orders;
7. LAST():返回指定的字段中最后一个记录的值;
- SELECT LAST(OrderPrice) AS LastOrderPrice FROM Orders;
8. UCASE():把字段的值转换为大写;
- SELECT UCASE(LastName) AS LN, FirstName FROM Persons;
9. LCASE():把字段的值转换为小写;
- SELECT LCASE(LastName) AS LN, FirstName FROM Persons;
10. MID():从文本字段中提取字符;
- SELECT MID(City,1,3) AS SC FROM Persons;
11. LEN():返回文本字段中值的长度;
- SELECT LEN(City) AS LengthOfCity FROM Persons;
12. ROUND():把数值字段舍入为指定的小数位数;
- SELECT ProductName, ROUND(UnitPrice,1) AS UP FROM Products;
13. NOW():返回当前的日期和时间;
- SELECT ProductName, UnitPrice, Now() as PerDate FROM Products;
14. FORMAT():对字段的显示进行格式化;
- SELECT ProductName, UnitPrice, FORMAT(Now(),'YYYY-MM-DD') as PerDate FROM Products
12、SQL CONVERT()函数:
CONVERT()函数是把日期转换为新数据类型的通用函数,可以用不同的格式显示日期/时间数据。
CONVERT(data_type(length),data_to_be_converted,style)
例:CONVERT(CHAR(10),birthday,120)
isnull(convert(char(10),birthday,120), ‘日期不详’)
如果birthday为空,则显示‘日期不详’;否则显示yyyy-mm-dd
data_type(length)规定目标数据类型(带有可选的长度);data_to_be_converted含有需要转换的值;style规定日期/时间的输出格式
13、SQL FORMAT函数:
用于对字段的显示进行格式化。SELECT FORMAT(column_name,format) FROM table_name
例:SELECT FORMAT(Now(),’YYYY-MM-DD’) as PerDate;
14、SQL GROUP BY子句:
- SELECT Store_Name, SUM(Salary) FROM Store_Information GROUP BY Store_Name;
15、SQL HAVING 子句:
- SELECT Store_Name,SUM(Salary) FROM Store_Information GROUP BY Store_Name HAVING SUM(Salary) >1500;
16、SQL alias 别名(空格):
- SELECT A1.Store_Name Store, SUM(A1.Salary) ‘Total Salary’ FROM Store_Information A1 Group by A1.Store_Name;
17、SQL 表格连接(join): inner join | cross join | ,
SELECT G.Region_Name,SUM(S.Sales) SALES FROM Store_Information S,Geography G WHERE S.Store_Name = G.Store_Name GROUP BY G.Region_Name;
18、SQL 外部连接(outer join): left join | right join | full join
SELECT G.Store_Name, SUM(S.Sales) SALES FROM Store_Name S,Geography G WHERE G.Store_Name = S.Store_Name(+)
19、SQL SUBSTRING函数:用来抓出一个栏位资料中的其中一部分。
MySQL: SUBSTR(), SUBSTRING()
Oracle: SUBSTR()
SQL Server: SUBSTRING()
例:SUBSTR(str,pos) SELECT SUBSTR(store_name, 3)... 不适用sql server,
SUBSTR(str,pos,len) SELECT SUBSTR(store_name,2,4)...
20、SQL TRIM函数:用来移除掉一个字符串中的字头或字尾,如空白格。
MySQL:TRIM(), RTRIM(), LTRIM()
Oracle:RTRIM(), LTRIM()
SQL Server:RTRIM(), LTRIM()
TRIM([[位置][要移除的字符串]FROM]字符串) :[位置]的可能值有LEADING、TAILING、BOTH,可将[要移除的字符串]从字符串的起头、结尾或是起头及结尾移除,如果我们没有列出[要移除的字符串]是什么的话,那空白就会被移除;
LTRIM(字符串):将所有字符串起头的空白移除;
RTRIM(字符串):将所有字符串结尾的空白移除。
例:SELECT TRIM(‘ Sample ‘); 结果:’Sample’ ;
SELECT LTRIM(‘ Sample ’); 结果:’Sample ’;
SELECT RTRIM(‘ Sample ’); 结果:’ Sample’;
21、SQL UNION指令:联集,两个SQL语句所产生的栏位需要是同样的资料种类。
- UNION结果去除重复记录:[SQL语句1] union [SQL语句2];
- UNION ALL结果保留全部记录:[SQL语句1]union all[SQL语句2];
22、SQL INTERSECT指令:交集,不同的值只会被列出一次。
[SQL语句1] intersect [SQL语句2];
23、SQL MINUS指令:先找出第一个SQL语句所产生的结果,然后看这些结果有没有在第二个SQL语句的结果中。如果有的话,那这一笔资料就被去除,而不会在最后的结果中出现。不同的值只会被列出一次。[SQL语句1] minus [SQL语句2];
24、SQL SELECT INTO 语句:可用于创建表的备份复件。
SELECT * INTO new_table_name [in externaldatabase] FROM old_tablename;
- SELECT * INTO Persons_backup FROM Persons;
- SELECT * INTO Persons IN ‘Backup.mdb’ FROM Persons;
- SELECT LastName,FirstName INTO Persons_backup FROM Persons WHERE City=’Bj’;
- SELECT Persons.LastName,Orders.OrderNo INTO Persons_Order_Backup INNER JOIN Orders ON Persons.ID_P = Orders.ID_P;
25、SQL Subquery:在一个SQL语句中放入另一个SQL语句。
SELECT “栏位1”
FROM “表格”
WHERE “栏位2” [比较运算符]
(SELECT “栏位1”
FROM “表格”
WHERE [条件]);
- 使用IN运算符的子查询;
- 使用比较运算符的子查询 < 、>、<=、>=、=、<>等;
- 使用ANY或ALL运算符的嵌套查询;
- ANY运算符表示至少一或某一。若s比R中至少一个值大,则s>ANY R为真,否则为假;若s比R中至少一个值小,则s<ANY R为真,否则为假。
- ALL运算符表示所有或每个。若s比R中每个值大,则s>ALL R为真,否则为假;若s比R中每个值小,则s<ALL R为真,否则为假。
运算符 | 含义 |
>ANY | 大于子查询结果中的某个值,即大于查询结果中的最小值 |
>ALL | 大于子查询结果中的所有值,即大于查询结果中的最大值 |
<ANY | 小于子查询结果中的某个值,即小于查询结果中的最大值 |
<ALL | 小于子查询结果中的所有值,即小于查询结果中的最小值 |
>=ANY >=ALL <=ANY <=ALL =ANY =ALL <>ANY <>ALL |
例:查询教师中工资低于自控系任一教师的教师编号、姓名和工资: <ANY()
查询年龄最低的学生的学号、姓名和年龄:<=ALL()
4.使用EXISTS运算符的嵌套查询;
用来测试内查询有没有产生任何结果,如果有的话,系统就会执行外查询中的SQL,否则整个SQL语句就不会产生任何结果。
SELECT “栏位1”
FROM “表格”
WHERE EXISTS
(SELECT *
FROM “表格”
WHERE [条件])
- EXISTS表示是否存在。当且仅当R为非空时,EXISTS R为真;当且仅当R为空时,NOT EXISTS为真。带有EXISTS的子查询不返回任何数据,只生成逻辑值真或假。
例:查询选修了所有课程的学生学号和姓名:(不存在他没有选修的课程)
select snum,sname from s where not exists (select * from c where not exists
(select * from sc where sc.snum = s.snum and sc.cnum = c.cnum));
26、SQL CASE 语句:作为if-then-else之类逻辑的关键字。
SELECT CASE("栏位名”)
WHEN “条件1” THEN “结果1”
WHEN “条件2” THEN “结果2”
...
[ELSE “结果N”]
END
FROM “表格名”
例:select store_name, (case store_name
when ’Los Angeles’ then sales*2
when ‘San Diego’ then sales*1.5
else sales end) as “new sales”, date
from store_information;
27、SQL INSERT INTO 语句:
- INSERT INTO Persons VALUES (‘Gates’, ‘Bill’, ‘Xuanwumen’, ‘Beijing’);
- INSERT INTO Persons (LastName, Address) VALUES (‘Wilson’, ‘Champs-Elysees’);
28、SQL UPDATE 语句:
- UPDATE Persons SET FirstName = ‘Fred’ WHERE LastName = ‘Wilson’;
- UPDATE Persons SET Address = ‘Zhongshan 23’, City = ‘Nanjing’ WHERE LastName = ’Wilson’
29、SQL DELETE 语句:
- DELETE FROM Persons WHERE LastName = ‘Wilson’;
- DELETE * FROM Persons; (在不删除表的情况下删除所有的行)
30、SQL TOP语句:
SELECT TOP number|percent column_name(s) FROM table_name;
- SELECT TOP 5 * FROM Persons;
- SELECT TOP 50 PERCENT * FROM Persons;
31、MySQL语句是组成MySQL脚本的基本单位,每条语句能完成特定的操作,它是由SQL标准语句+MySQL扩展语句组成。
32、MySQL中的数据类型:
- 数字:整数(tinyint、smallint、mediumint、int、bigint),浮点数(float、double、real、decimal)
- 日期时间:date、time、datetime、timestamp、year
- 字符串:字符串(char、varchar),文本(tinytext、text、mediumtext、longtext),二进制(tinyblob、blob、mediumblob、longblob)
33、MySQL创建一个数据库:
create database samp_db character set gbk; (为了便于在命令提示符下显示中文,在创建时通过character set gbk将数据库字符编码指定为gbk。)
34、MySQL选择所要操作的数据库:
use samp_db;
35、MySQL创建数据库表:
create table students
(
id int unsigned not null auto_increment primary key,
name char(8) not null,
sex char(4) not null,
age tinyint unsigned not null,
tel char(13) null default “-“
);
36、SQL约束:约束用于限制加入表的数据的类型。
- NOT NULL约束强制列不接受NULL值;
- UNIQUE约束唯一标识数据库表中的每条记录;
例:命名unique约束,并为多个列定义unique约束:
CONSTRAINT uc_PersonID UNIQUE (Id_P, LASTNAME);
3. PRIMARY KEY约束唯一标识数据库表中的每条记录;
例:命名primary key约束,并为多个列定义primary key约束:
CONSTRAINT pk_PersonID PRIMARY KEY (ID_P, LastName);
4.FOREIGN KEY约束用于预防破坏表之间连接的动作,也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一;
例:FOREIGN KEY (Id_P) REFERENCES Persons(Id_P);
5. CHECK约束用于限制列中的值的范围;
例:CHECK (Id_P>0);
6. DEFAULT约束用于向列中插入默认值;
例:City varchar(255) DEFAULT ‘Sandnes’; OrderDate date DEFAULT GETDATE();
37、SQL CREATE INDEX语句:在不读取整个表的情况下,更快地查找数据。
- 简单索引,允许使用重复的值:
CREATE INDEX index_name ON table_name (colunm_name);
例:CREATE INDEX PersonIndex ON Person (LastName DESC, FirstName);
2. 唯一索引,两个行不能拥有相同的索引值:
CREATE UNIQUE INDEX index_name ON table_name (colunm_name);
38、SQL CREATE VIEW语句:
1. 创建视图
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition;
例:
CREATE VIEW [Products Above Average Price] AS
SELECT ProductName, UnitPrice
FROM Products
WHRER UnitPrice>(SELECT AVG(UnitPrice) FROM Products);
2.更新视图:先删除,再重新创建
3. 删除视图:DROP VIEW view_name;
4. 查询视图:SELECT * FROM view_name;
39、SQL DROP INDEX语句:删除索引。
DROP INDEX index_name ON table_name;
40、操作MySQL数据库:
1. 向表中插入数据:insert into students values (NULL, “王刚”, “男”, 20, “13833884932”);
insert into students (name, sex, age) values (“孙丽华”, “女”, 21);
2. 查询表中的数据:select name, age from students;
3. 按特定条件查询:
select * from students where sex="女";
select * from students where name like "%王%";
select * from students where id<5 and age>20;
4. 更新表中的数据:
update students set tel=default where id=5;
update students set age=age+1;
update students set name="张伟鹏", age=19 where tel="13288097888";
5. 删除表中的数据:delete from students where age<20;
41、MySQL创建后表的修改:
1. 添加列:alter table students add address char(60);
alter table students add birthday date after age;
2. 修改列名,使用change需加上数据类型:
alter table students change tel telphone char(13) default “-”;
alter table students change name nm char(16) not null;
3. 修改数据类型,使用alter:alter table students alter name char(10);
4. 删除列:alter table students drop birthday;
5. 重命名表:alter table students rename workmates;
6. 清除表格数据:truncate table students;
7. 删除整张表:drop table workmates;
8. 删除整个数据库:drop database samp_db;
42、SQL AUTO INCREMENT字段:在插入新纪录时,自动的创建主键字段的值,因此在插入新纪录时,不需要为有AUTO INCREMENT字段的列规定值。
例:P_Id int NOT NULL AUTO_INCREMENT;
43、SQL DATE 函数:
MySQL Date函数 | 描述 |
NOW() | 返回当前的日期和时间 |
CURDATE() | 返回当前的日期 |
CURTIME() | 返回当前的时间 |
DATE(date) | 提取日期或日期/时间表达式的日期部分 |
EXTRACT(unit FROM date) | 返回日期/时间的单独部分 |
DATE_ADD(date,INTERVAL expr type) | 给日期添加指定的时间间隔 |
DATE_SUB(date,INTERVAL expr type) | 从日期减去指定的时间间隔 |
DATEDIFF(date1,date2) | 返回两个日期之间的天数 |
DATE_FORMAT(date,format) | 用不同的格式显示日期/时间 |
SQL Server Date函数 | 描述 |
GETDATE() | 返回当前日期和时间 |
DATEPART(datepart,date) | 返回日期/时间的单独部分 |
DATEADD(datepart,number,date) | 在日期中添加或减去指定的时间间隔 |
DATEDIFF(datepart,startdate,enddate) | 返回两个日期之间的时间 |
CONVERT(data_type(length),data_to_be_converted,style) | 用不同的格式显示日期/时间 |
44、SQL NULL值:NULL值是遗漏的未知数据,无法比较null和0值,它们是不等价的;测试null值需要用IS NULL和IS NOT NULL操作符。
45、SQL ISNULL()、NVL()、IFNULL()和COALESCE函数:
1. SQL Server/MS Access用ISNULL()函数:
例:SELECT ProductName,UnitPrice*(UnitsInStock+ISNULL(UnitOnOrder,0)) FROM Products;
2. Oracle用NVL()函数:
例:SELECT ProductName,UnitPrice*(UnitsInStock+NVL(UnitOnOrder,0)) FROM Products;
3. MySQL用IFNULL()函数:
例:SELECT ProductName,UnitPrice*(UnitsInStock+IFNULL(UnitOnOrder,0)) FROM Products;
或者:SELECT ProductName,UnitPrice*(UnitsInStock+COALESCE(UnitOnOrder,0)) FROM Products;
46、算排名:要以SQL列出排名,基本的概念是要做一个表格自我连接(self join),将结果依序列出,然后算出每一行之前(包括那一行本身)有多少行数。
Name | Sales |
John | 10 |
Jennifer | 15 |
Stella | 20 |
Sophia | 40 |
Greg | 50 |
Jeff | 20 |
48、数据备份(转储):
分为完全备份、差异备份。
完全备份:每次备份全部数据库;差异备份:每次只备份上次备份后被更新过的数据。
按备份状态分:静态备份(离线备份,在系统中无事务进行时进行的备份操作);动态备份(在线备份,备份操作与用户事务并发进行,备份期间允许对数据库进行存取或修改)。
DBA需要根据数据库使用情况确定适当的备份周期和备份方法。
49、登记日志文件:
日志文件是用来记录事务对数据库的更新操作的文件。对数据库的每次修改,都将被修改项目的原始值和新值写在一个叫做运行日志的文件中,目的是为数据库的恢复保留详细的数据。日志文件先写原则,保证数据库可恢复。
日志文件的两种格式:以记录为单位的日志文件;以数据库为单位的日志文件。
1. 以记录为单位的日志文件,需要登记的内容包括:
①各个事务的开始标记(BEGIN TRANSACTION)
②各个事务的结束标记(COMMIT或ROLLBACK)
③各个事务的所有更新操作
2. 以数据块为单位的日志文件,只要某个数据块中有数据被更新,就要将整个块更新前和更新后的内容放入日志文件中。
50、如何利用T-SQL语句进行数据库的备份和恢复:
①添加一个名为myBak的磁盘备份设备,其物理名称为C:\Program Files\Microsoft SQL Server\MSSQL\BACKUP\Sclass.bak。:
USE master /*在主数据块master中执行*/
EXEC sp_addumpdevice 'disk', 'myBak',
C:\Program Files\Microsoft SQL Server\MSSQL\BACKUP\Sclass.bak
GO /*创建一逻辑磁盘设备myBak,并指定备份文件存放的绝对路径*/
②对“学生选课”数据库做一次全库备份,备份的名字为“学生选课backup”,备份设备是“myBak”逻辑磁盘设备,此备份将覆盖以前所有的备份:
BACKUP DATABASE 学生选课 /*对“学生选课”数据库进行备份*/
TO myBak /*备份设备是 前面创建的逻辑磁盘设备myBak*/
WITH INIT, /*此设备将覆盖以前所有的备份*/
NAME = '学生选课backup' /*备份的名字为“学生选课backup”*/
③对“学生选课”数据库做一次差异备份,备份的名字为“学生选课backup”,备份设备是“myBak”逻辑磁盘设备,新备份的数据将添加到备份设备上原备份内容的后面:
BACKUP DATABASE 学生选课 /*对“学生选课”数据库进行备份*/
TO myBak /*备份设备是 前面创建的逻辑磁盘设备myBak*/
WITH DIFFERENTIAL, /*差异备份*/
NOINIT, /*新备份的数据将添加到备份设备上原备份内容的后面*/
NAME = '学生选课backup' /*备份的名字为“学生选课backup”*/
③对“学生选课”数据库做一次日志备份,备份的名字为“学生选课backup”,备份设备是“myBak”逻辑磁盘设备,新备份的数据将添加到备份设备上原备份内容的后面:
BACKUP LOG 学生选课 /*对“学生选课”数据库进行日志备份*/
TO myBak /*备份设备是 前面创建的逻辑磁盘设备myBak*/
WITH NOINIT, /*新备份的数据将添加到备份设备上原备份内容的后面*/
NAME='学生选课backup' /*备份的名字为“学生选课backup”*/
④假设“学生选课”数据库在“myBak”逻辑磁盘备份上做了3次备份(一次全库备份、一次差异备份和一次日志备份)后发生了介质故障,要求用RESTORE语句恢复该数据库:
RESTORE DATABASE 学生选课
FROM myBak
WITH
FILE=1,
NORECOVERY /*从磁盘设备的第一个备份恢复数据*/
RESTORE DATABASE 学生选课
FROM myBak
WITH
FILE=2,
NORECOVERY /*从磁盘设备的第一个备份恢复数据*/
RESTORE DATABASE 学生选课
FROM myBak
WITH
FILE=3,
RECOVERY /*从磁盘设备的第一个备份恢复数据*/