面前后端的时候,SQL语句可以说是必被问到的一环。没有SQL语句,数据库就只停留在理论和设计阶段,无法实现。本节介绍常用的SQL语句合集(注意这里我们介绍的是SQL的基石,也就是从这些语句出发可以通吃SQL,包括像本节没介绍的嵌套查询等,万丈高楼平地起,掌握这些基本的其他都可以类推了),下节将如何将零散的SQL语句向像C/Java语言那样进行结构化设计。某些数学建模比赛提供的数据集,也可以导入到SQL数据库中进行数据清洗。
所谓SQL,全称是Structured Query Language,中文名为结构化查询语言,SQL是关系数据库的标准语言,集数据定义语言(DDL),数据操纵语言(DML),数据控制语言(DCL)功能于一体,可以独立完成数据库生命周期的全部活动,比如定义关系模式、维护数据库、安全控制等。SQL的嵌入性也很好,如嵌入到Java中,可以使用JDBC进行数据库交互;其他如嵌入到PHP,Python等。SQL的标准十分庞大,目前没有一个数据库能够支持SQL标准的所有概念和特性。
除了了解SQL,在准备面试的时候,我们其实也还需要准备一些其他可以和面试官apa的话题:
常见的关系型数据库如下,了解其对应的一些特性请参考这里
- MySQL
- Oracle
- DB2
- Microsoft SQL Server
- Microsoft Access
常见的非关系型数据库有:
- MongoDB
- redis(最好要准备一下这个类型的数据库,大概率问到→_→)
详细了解请参考这里,文末还有一些面试时数据库应该掌握的知识点,有需取。下面先讲完基本的SQL语句:
- 登录数据库:
mysql -u <用户名> -p <口令>
- 查看现有数据库:
show databases;
- 新建数据库:
create database <数据库名>;
- 选择数据库:
use <数据库名>;
- 删除数据库:
drop database <数据库名>;
- 查看一个数据库中的表:
show tables;
- 创建新表,模板是:
CREATE TABLE <表名> (
<列名1> <列类型1>,
<列名2> <列类型2>,
...
PRIMARY KEY(<某列名>),
FOREIGN KEY(<某列名>) REFERENCE <某表名>(某列名)
);
实例:
CREATE TABLE instructor (
ID CHAR(5),
name VARCHAR(20) NOT NULL,
dept_name VARCHAR(20),
salary NUMERIC(8,2),
PRIMARY KEY (ID),
FOREIGN KEY (dept_name) REFERENCES department(dept_name));
- 在表中插入新记录:
INSERT INTO <表名>(<列1>, <列2>...) VALUES (<值1>, <值2>...)
注:如果省略前面列名,则插入必须按照次序
- 在表中更新记录:
UPDATE <表名> SET <列1>=<值1>... WHERE <条件>
- 清空表:
delete from <表名>
- 删除表:
drop table <表名> where <条件>
- 查询:
select <列名1>, <列名2>... from <表名> WHERE <条件>
注:加上DISTINCT可以去除重复的值 - 分组,经常和COUNT,MAX,MIN,SUM,AVG等联用:
select <列名1>, <列名2>... from <表名> GROUP BY <列名>;
实例:
SELECT COUNT(course_id), dept_name
FROM course
GROUP BY dept_name;
- HAVING:
HAVING的一般用法是在分组查询中:
select <列名1>, <列名2>... from <表名> GROUP BY <列名> HAVING <条件>;
在面试中,通常会遇到WHERE和HAVING的区别,这里做个回答:
- WHERE针对行进行操作,在GROUP BY之前运行(也就是先通过WHERE筛选出符合条件的行,再通过GROUP BY语句对前面筛选出来的结果进行分组),WHERE子句中不能使用聚集函数
- Having是一个过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作,在Having可以使用聚合函数
- ORDER BY:
select <列名1>, <列名2>... from <表名> WHERE <条件> ORDER BY <列名> ASC | DESC
,默认ASC升序排序 - BETWEEN:选取区间范围
select <列名1>, <列名2>... from <表名> WHERE <列名> BETWEEN <值1> AND <值2>
- LIKE:一般用于匹配文本模式,
select <列名1>, <列名2>... from <表名> WHERE <列名> LIKE <模式>
,如select * from course WHERE name LIKE '%math%'
(name包含math模式),再如select * from course WHERE name LIKE 'CS%'
(name以CS模式开头) - IN:在某个集合里,格式为:
select <列名1>, <列名2>... from <表名> WHERE <列名> IN (<值1>, <值2>...)
- JOIN:
在关系代数一章节我们就已经讲述了外连接,左外连接和右外连接,之前也介绍过了这些连接的SQL语句,这里做个回顾:
- 外连接:
select <列名1>, <列名2> from <表1> join <表2> ON <表1>.<列1> = <表2>.<列2>
- 左外连接:
select <列名1>, <列名2> from <表1> left outer join <表2> ON <表1>.<列1> = <表2>.<列2>
- 右外连接:
select <列名1>, <列名2> from <表1> right outer join <表2> ON <表1>.<列1> = <表2>.<列2>
- 创建视图:
CREATE view <视图名> AS
select <列名1>, <列名2>... from <表名>;
- 删除视图:
drop view <视图名>
- 修改表列:
ALTER TABLE <表名> <ADD | ALTER | DROP ...> <列名> <新定义>
总结一下SQL中常用的数据类型: