以下以mysql为例
1、mysql有哪些语句
(1)检索数据,SELECT语句,如
SELECT prod_name
FROM products;
(2)排序数据,ORDER BY语句,如
SELECT prod_name
FROM products
ORDER BY prod_name;
(3)过滤数据,WHERE语句,如
SELECT prod_name, prod_price
FORM products
WHERE prod_price = 2.50;
组合WHERE子句,常见的操作符有AND,OR,IN,NOT,举例如下
SELECT prod_name,prod_price
FROM products
WHERE vend_id NOT IN (1002,1003)
ORDER BY prod_name;
(4)计算字段相关,字段基本上和列好意思相同,经常互换使用,不过一般称数据库列为列,而术语字段通常用于计算字段的连接上。如拼接字段
SELECT Concat(vend_name,'(',vend_country,')')
FROM vendors
ORDER BY vend_name;
执行算术计算
SELECT prod_id,quantity,item_price,quantity*item_price AS expanded_price
FROM vendors
WHERE order_num = 20005;
(5)通配符
使用LIKE操作符(注意LIKE是匹配整个列),常用通配符有%(表示任何字符出现任意次数),_(表示单个字符),例如
SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE '% ton anvil';
(6)正则表达式
关键字为REGEXP(正则表达式在列值内进行匹配,如果被匹配的文本在列值中出现,则相应的行会被返回)
.匹配任意一个字符,如
SELECT prod_name
FROM products
WHERE prod_name REGEXP '.000'
ORDER BY prod_name;
进行OR匹配使用**|**,如
SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000|2000'
ORDER BY prod_name;
匹配几个字符之一,使用**[]**
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[123] Ton'
ORDER BY prod_name;
排除范围之内使用如
[^123]
表示排除123三个字符
范围表示,如
[1-9]
[a-z]
匹配特殊字符,用\如
\\.
\\(
\\\
匹配字符类如
[:alnum:]
[:alpha:]
[:digit:]
[:lower:]
重复元字符,如?表示前面一个字符出现了0-无限次
[[:digit:]{4}]表示出现4个数字
定义符,如
^[0-9]表示以数字开头
[0-9]$表示以数字结尾
(7)数据处理函数
文本处理函数,如
Length()
Lower()
Upper()
日期和时间处理函数
Date()
Day()
Hour()
Minute()
Month()
Now()
Second()
Time()
Year()
数值处理函数
Abs()
Cos()
Exp()
Mod()
Pi()
Rand()
Sin()
Sqrt()
Tan()
(8)汇总数据
需要用到聚集函数,这些函数运行在行组上,计算和返回单个值,如
AVG()
COUNT()
MAX()
MIN()
SUM()
(9)分组数据
创建分组GROUP BY,过滤分组HAVING,排序ORDER BY,如
SELECT order_num, SUM(quantity*item_price) AS ordertotal
FROM orderitems
GROUP BY order_num
HAVING ordertotal >= 50
ORDER BY ordertotal;
(10)子查询:嵌套在其他查询的查询
SELECT cust_id
FROM orders
WHERE order_num IN (SELECT order_num
FROM orderitems
WHERE prod_id = 'TNT2');
(11)联结
如果数据存储在多个表中,怎样用单条SELECT语句检索出数据,答案是使用联结
创建联结
SELECT vend_name, prod_name, prod_price
FROM vendors, products
WHERE vendors.vend_id = products.vend_id
ORDER BY vend_name, prod_name;
内部联结,与上面类似,不过加了关键字INNER JOIN,WHERE换成了ON
SELECT vend_name,prod_name,prod_price
FORM vendors INNER JOIN products
ON vendors.vend_id = products.vend_id;
自联结,可以用来代替子查询
子查询:
SELECT prod_id, prod_name
FROM products
WHERE vend_id = (SELECT vend_id
FROM products
WHERE prod_id = 'DINTR');
自联结:
SELECT p1.prod_id,p1.prod_name
FORM products AS p1, products AS p2
WHERE p1.vend_id = p2.vend_id
AND p2.prod_id = 'DTNTR';
外部联结,联结中包含了相关表中没有关联的行
SELECT customers.cust_id, orders.order_num
FROM customers LEFT OUTER JOIN orders
ON customers.cust_id = orders.cust_id;
左外联结会选择左表中的全部行
(12)组合查询:执行多个查询后将结果作为单个查询结果返回,关键字是UNION(取消重复行),如果不想取消重复行使用UNION ALL
SELECT vend_id,prod_id, prod_price
FORM products
WHERE prod_price =<= 5
UNION
SELECT vend_id, prod_id, prod_price
FROM products
WHERE vend_id IN (1001,1002);
(13)全文本搜索,关键函数Match(),Against()
SELECT note_text
FROM productnotes
WHERE Match(note_text) Against('rabbit');
(14)操控数据
插入行
INSERT INTO customers(cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country,
cust_contact,
cust_email)
VALUES('Pep E. LaPew',
'100 Main Street',
'Los Angles',
'CA',
'90046',
'USA',
NULL,
NULL)
更新数据
UPDATE customers
SET cust_email = 'elmer@fudd.com'
WHERE cust_id = 10005;
删除数据,删除一行
DELETE FROM customers
WHERE cust_id = 10006;
创建表
CREATE TABLE customers
(
cust_id int NOT NULL AUTO_INCREMENT,
cust_name char(50) NOT NULL,
cust_address char(50) NULL,
PRIMARY KEY(cust_id)
)ENGINE=InnoDB;
更新表
ALTER TABLE vendors
ADD vend_phone CHAR(20);
删除表
DROP TABLE customers;
(15)视图,虚拟的表,与包含数据的表不一样,视图只包含使用时动态检索数据的查询。
创建视图 CREATE VIEW
CREATE VIEW customeremaillist AS
SELECT cust_id, cust_name, cust_email
FROM customers
WHERE cust_email IS NOT NULL;
查看创建视图SHOW CREATE VIEW viewname
删除视图 DROP VIEW viewname
更新视图可以先删除在创建,也可以CREATE OR REPLACE VIEW
(16) 存储过程,为以后使用保存的一条或多条MySQL语句的集合
创建
CREATE PROCEDURE productpricing()
BEGIN
SELECT Avg(prod_price) AS priceaverage
FROM products
END;
调用
CALL productpricing()
删除
DROP PROCEDURE procedure_name;
输入输出参数,可以使用IN和OUT指定输入输出参数,调用时使用@加参数的方式。
(17) 游标,是存储在MySQL服务器上数据库查询,它不是一条SELECT语句,而是被该语句检索出来的结果集,在存储了游标之后,应用程序可以根据需要滚动或者浏览其中的数据
创建、打开关闭、使用游标数据的过程如下
CREATE PROCEDURE processorders()
BEGIN
DECLARE o INT;
DECLARE ordernumbers CURSOR
FOR
SELECT order_num FROM orders;
OPEN ordernumbers;
FETCH ordernumbers INTO o;
CLOSE ordernumbers;
END;
(18)触发器,MySQL响应以下任意语句而自动执行的一条MySQL语句
- DELETE
- INSERT
- UPDATE
(19)事务管理
关闭自动提交
SET autocommit = 0;
(20)安全管理
管理用户
USE mysql
SELECT user FROM user
创建用户账号
CREATE USER ben INENTIFIED BY 'p@$$wOrd';
删除用户
DROP USER ben
设置访问权限
GRANT SELECT ON crashcourse.* TO ben;
撤销权限
REVOKE SELECT ON crashcourse.* TO ben;
以下参考https://www.cnblogs.com/donleo123/p/11646081.html
2 内联结、外联结
内连接返回满足条件的行;外联结不只返回满足条件的行,分为左外联结,右外联结,全外联结,对于左外联结,除了返回满足条件的行外,还返回左表的所有行,右外联结则相反,全外联结则返回左表和右表的全部行
3 什么是存储过程,用什么来调用
存储过程是为以后使用而保存的预编译的一条或多条mysql语句的集合,创建一次后可以进行多次调用,可以用CALL来进行调用,可以输入参数和输出结果
4 触发器的作用
触发器是用来响应某些mysql语句,自动执行的mysql语句,可以用来保证数据的一致性,创建审计跟踪等
5 索引的作用和它的优缺点
索引是一种特殊的查询表,好处和作用:数据库的搜索引擎可以利用它加速对数据的检索,它很类似于现实生活中的目录,缺点是减慢了数据录入的速度,同时也增大了数据库的尺寸。
6 如何维护数据库的完整性和一致性
尽可能使用约束,如主键、外键、非空字段来进行约束,这样效率最高也最方便,其次是使用触发器
7 什么是事务,什么是锁
事务是满足ACID的一组mysql语句,包括原子性、一致性、隔离性和持久性,可以用来维护数据库的完整性,它要么全部执行,要么全部不执行。
锁是实现事务的关键,可以保证事务的完整性和并发性,分为共享锁(只读不写),排它锁(可读可写)
8 什么是视图、什么是游标
视图是虚拟的表,与数据库中的表不一样,视图只包含使用时动态检索数据的查询;
游标是SELECT语句检索出来的结果集,在存储游标之后,应用程序可以根据需要滚动或浏览其中的数据。
9 什么是主键、什么是外键
主键是唯一区分表中的每一行的列,每一行的主键是唯一的,不可以为空
外键是某个表中的一列,它包含另一个表的主键值,定义了两个表的关系
10 什么是相关子查询
子查询是嵌套在其他查询中的查询
11 可以用什么来确保表格里的字段只接受特定范围里的值?
可以使用Check()或者触发器
12 如何优化数据库,提高数据库的性能
- 给数据库做索引,合理的索引可以提升性能
- 适当的情况下使用存储过程来代替sql语句,因此存储过程是预编译过的,运行速度更快
- 优化查询语句,使用高性能的查询语句
13 UNION和UNION ALL的区别
UNION会自动去掉重复的行
UNION ALL会保留重复的行
14 mysql常见的搜索引擎
InnoDB:事务型的引擎,不支持全文本搜索,自动崩溃恢复
MyISAM:性能很高的引擎,支持全文本搜索,不支持事务处理
MEMORY:功能和MyISAM类似,但是数据存放在内存中,速度很快。
15 数据库设计的三个范式
https://blog.csdn.net/dosthing/article/details/87954213
第一范式:必须不包含重复组的关系,既每一列都是不可拆分的原子项
第二范式:首先必须满足第一范式,然后所有的非主属性都完全依赖于主码
第三范式:首先满足第二范式,然后所有的非主属性对任何候选关键字都不存在传递依赖,既没有属性都和主键有直接关系而不是间接关系
以下补充一些常见的笔试题目引申出来的知识
16 实体的联系
一对一:实体A只对应一个实体B,实体B只对应一个实体A,比如电影院的座位和观众
一对多:实体A对应多个实体B,实体B只对应一个实体A,比如班级和学生
多对一:实体A对应一个实体B,实体B对应多个实体A,比如学生和班级
多对多:实体A对应多个实体B,实体B对应多个实体A,比如工程项目和职工
17 子查询中的ALL ANY SOME关键字
ALL表示每一个都有满足条件
ANY和SOME表示只要有一个满足条件
18 mysql中drop、truncate、delete的区别
语法:
drop table 表名
truncate table 表名
delete from 表名 where 列名 = 值
区别
1、drop(删除表):删除表的内容和定义,释放空间,简单来说就是把整个表去掉,如果要新增数据必须新建一个表,同时drop语句将删除表的结构被依赖的约束,触发器、索引,依赖于该表的存储过程或者函数会被保留但是状态变为invalid
2、truncate(情况表中的数据):删除内容,释放空间但不删除定义(保留表的结构),同时truncate不能删除行数据,要删就要把表清空
3、delete(删除表中的数据):删除表中的行,同时该操作会在日志中保存
4、truncate table 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用delete。如果要删除表定义及其数据,请使用 drop table 语句。
5、对于由foreign key约束引用的表,不能使用truncate table ,而应使用不带where子句的delete语句。由于truncate table 记录在日志中,所以它不能激活触发器。
6、执行速度,一般来说: drop> truncate > delete。
7、delete语句是数据库操作语言(dml),这个操作会放到 rollback segement 中,事务提交之后才生效;如果有相应的 trigger,执行的时候将被触发。truncate、drop 是数据库定义语言(ddl),操作立即生效,原数据不放到 rollback segment 中,不能回滚,操作不触发 trigger。
19 高水位回收
可以使用shrink和move,参考https://www.cnblogs.com/rikinrei/p/10750878.html
20 sql语言分类
21 CHARINDEX函数
通过CHARINDEX如果能够找到对应的字符串,则返回该字符串位置,否则返回0。如
select ename, case charindex(‘A‘,ename)
when 1 then ‘字符A在首位‘
when len(ename) then
‘字符A在末位‘
when 0 then ‘没有字符A‘
else ‘字符A在中间‘
end 名称类别 from emp;
22 DATEDIFF() 函数
参考https://www.nowcoder.com/test/question/done?tid=38542560&qid=305197#summary
DATEDIFF() 函数返回两个日期之间的时间
23 INSERT INTO和SELECT INTO
INSERT INTO 语句用于向表格中插入新的行。
INSERT INTO table_name VALUES (值1, 值2,....)
指定所要插入数据的列:
INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中。常用于创建表的备份复件或者用于对记录进行存档。
把所有的列插入新表
SELECT *
INTO new_table_name [IN externaldatabase]
FROM old_tablename
只把希望的列插入新表
SELECT column_name(s)
INTO new_table_name [IN externaldatabase]
FROM old_tablename
24 &
25 if语句
if(条件,结果1,结果2)
select sno,
sum(if(class='english',score,0)) as english,
sum( if(class='math',score,0) ) as math
from sc
where class in('english','math')
group by sno
26 count
1、count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL。
2、count(1)同样不会忽略列值为NULL。
3、count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为空。
27 case when then else end语句
如
select Date As 比赛日期, SUM(case when Win='胜' then 1 else 0 end) 胜, SUM(case when Win='负' then 1 else 0 end) 负 from result group by Date
28 给字段添加默认值
alter table 表名 alter column 字段名 set default 默认值;
29 模式
外模式 外模式又称子模式或用户模式,对应于用户级。它是某个或某几个用户所看到的数据库的数据视图,是与某一应用有关的数据的逻辑表示。外模式是从模式导出的一个子集,包含模式中允许特定用户使用的那部分数据。用户可以通过外模式描述语言来描述、定义对应于用户的数据记录(外模式),也可以利用数据操纵语言(Data Manipulation Language,DML)对这些数据记录进行操作。外模式反映了数据库的用户观。
概念模式 模式又称概念模式或逻辑模式,对应于概念级。它是由数据库设计者综合所有用户的数据,按照统一的观点构造的全局逻辑结构,是对数据库中全部数据的逻辑结构和特征的总体描述,是所有用户的公共数据视图(全局视图)。它是由数据库管理系统提供的数据模式描述语言(Data Description Language,DDL)来描述、定义的,体现、反映了数据库系统的整体观。
内模式 内模式又称存储模式,对应于物理级,它是数据库中全体数据的内部表示或底层描述,是数据库最低一级的逻辑描述,它描述了数据在存储介质上的存储方式和物理结构,对应着实际存储在外存储介质上的数据库。内模式由内模式描述语言来描述、定义,它是数据库的存储观。 在一个数据库系统中,只有唯一的数据库, 因而作为定义 、描述数据库存储结构的内模式和定义、描述数据库逻辑结构的模式,也是唯一的,但建立在数据库系统之上的应用则是非常广泛、多样的,所以对应的外模式不是唯一的,也不可能是唯一的。
30 并运算
不同行保留,相同行只保留一个
31 数据库设计包括六个主要步骤
1、需求分析:了解用户的数据需求、处理需求、安全性及完整性要求;
2、概念设计:通过数据抽象,设计系统概念模型,一般为E-R模型(提供了表示实体类型、属性和联系的方法,用来描述现实世界的概念模型);
3、逻辑结构设计:设计系统的模式和外模式,对于关系模型主要是基本表和视图;
4、物理结构设计:设计数据的存储结构和存取方法,如索引的设计;
5、系统实施:组织数据入库、编制应用程序、试运行;
6、运行维护:系统投入运行,长期的维护工作。
32 数据库概念
数据库是长期存储在计算机内,有组织的,可共享的大量数据的集合,数据库中的数据按一定的数据模型组织,描述和存储,具有较小的冗余度,较高的数据独立性,和易扩展性,并可为各种用户共享。概括来讲 数据库具有,永久存储,有组织,可共享,三个基本特点。