前言
我们知道,在校招的过程中,笔试是一个非常重要的环节,公司不一样,考察的内容也五花八门。总结一下大概有计算机基础+岗位相关知识+算法题+其他(包括智力题、数学题等等),其中计算机基础的部分除了我们常见的计算机网络、操作系统、数据结构之外,还有非常容易被我们忽视的sql。虽然一般题量不多,难度也不高,但如果长时间没有复习过,也很有可能白白失分,所以这两天花了些时间复习了一遍sql的基本语法,这里做一个简单的总结
一、基本概念
- SQL (Structured Query Language:结构化查询语言) 是用于管理关系数据库管理系统(RDBMS)的语言
- RDBMS (关系型数据库管理系统)是 SQL 的基础,同样也是所有现代数据库系统的基础
- sql对大小写不敏感,但是建议语句使用大写,表名列名等数据使用小写
二、语法分类
sql的语法有着多种不同的分类方式,有的分成3类,有的4类5类,甚至6类的也有,虽然大同小异,但我们最好了解一下常见的几种方式,以免在做题时先入为主。
第一种
-
DDL(Data Definition Language): 数据定义语言 用来定义数据库对象:数据库,表,列等。 关键字:create,drop,,alter等。 -
DML(Data Manipulation Language): 数据操作语言 用来对数据库中的表进行增删改操作。 关键字:insert,delete,update等。 -
DQL(Data Query Language): 数据查询语言 用来查询数据库中表的记录(数据)。 关键字:select,where等 -
DCL(Data Control Language): 数据控制语言 用来定义数据库的访问控制权限和安全级别,及创建用户。关键字:grant,revoke等
第二种
第二种分类方式比上一种多了一类TCL事务控制语言,D开头的一般关心的是数据,而这类语法针对的主要是事务操作。
- TCL(Transaction Control Language): 事务控制语言
用来对数据库中的事务操作进行控制,如设置保存点、回滚提交等。 关键字:SAVEPOINT (设置保存点)ROLLBACK (回滚) COMMIT(提交)
第三种
这种分类方法在第一种的基础上,把DQL合并到了DML里面,变成了这样
-
DDL(Data Definition Language): 数据定义语言 用来定义数据库对象:数据库,表,列等。 关键字:create,drop,,alter等。 -
DML(Data Manipulation Language): 数据操作语言 用来对数据库中的数据进行增删查改操作。 关键字:insert,delete,update,select等。 -
DCL(Data Control Language): 数据控制语言 用来定义数据库的访问控制权限和安全级别,及创建用户。关键字:grant,revoke等
总结
总而言之,其实核心就是D开头的数据定义、操作和控制三种,其中数据操作DML也可以把查询部分DQL单独分出来变成4种,如果再加上事务控制(TCL)就是5种了。都是在核心分类上进行添加和演变。
三、查询顺序
写法顺序:select--from--join...on--where--group by--having--order by--limit
执行顺序:join...on--from--where--group by--having--select--order by--limit
就是select要放后面,如果有order by,则order by放最后,因为order by 是对结果进行排序
执行的时候: 1、首先通过from和join…on(先连接两表)获得我们的数据源表 2、然后使用where对源表进行条件筛选,得到临时表 3、group by对临时表进行分组,分组后having二次筛选,得到结果表 4、有了结果表我们才可以使用select选择和操作结果 5、最后再使用order by进行排序,排序后的结果可以用limit选择性展示
写一个结合上面语法顺序的完整查询语句:
SELECT DISTINCT column1, AGG_FUNC(column_or_expression), …
FROM mytable
JOIN another_table
ON mytable.column1 = another_table.column1
WHERE constraint_expression
GROUP BY column1
HAVING constraint_expression
ORDER BY column1 ASC/DESC
LIMIT count OFFSET COUNT;
四、DDL
1、创建:create
创建数据库
CREATE DATABASE test
创建表
CREATE TABLE pet (
id INT,
name VARCHAR(20),
owner VARCHAR(20),
s_id INT,
sex CHAR(1),
birth DATE
);
也可以加上一些约束
CREATE TABLE pet (
id INT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
owner VARCHAR(20) UNIQUE,
s_id INT,
sex CHAR(1) DEFAULT '1',
birth DATE,
FOREIGN KEY(s_id) REFERENCES class(id)
);
2、修改:alter
先看看alter的语法:
ALTER TABLE <表名> [修改选项]
{ ADD COLUMN <列名> <类型>
| CHANGE COLUMN <旧列名> <新列名> <新列类型>
| ALTER COLUMN <列名> { SET DEFAULT <默认值> | DROP DEFAULT }
| MODIFY COLUMN <列名> <类型>
| DROP COLUMN <列名>
| RENAME TO <新表名> }
alter主要是对表的结构进行增删改,如
ALTER TABLE pet ADD PRIMARY KEY(c_id);
ALTER TABLE pet MODIFY c_id INT PRIMARY KEY;
ALTER TABLE pet drop PRIMARY KEY;
其中change、modify和alter三种修改的区别是常考点,我们会在后面进行阐述。
3、删除:drop
删除数据库
DROP DATABASE test
删除表
DROP TABLE pet
用DROP INDEX还可以删除索引; drop、truncate和delete三种删除方式的区别也是常考点,同样在后面说明。
五、DML
插入数据
INSERT INTO test value(3,'大黄');
更新数据
UPDATE test SET name = '小黄' WHERE id = '3';
查询数据
SELECT name FROM test
删除数据
DELETE FROM test WHERE name = '小黄';
六、DQL
1、select
SELECT * FROM pet;
SELECT id,name FROM pet;
SELECT DISTINCT sex FROM pet;
2、join…on…
join是表连接的语法,利用它可以实现多表查询
SELECT * FROM pet
JOIN people ON pet.id = people.petid
常见的join有四种:
- inner join:内连接,默认join的完整写法,也叫等值连接
- left (outer) join:左连接,以左表为基准表,左表所有行都会出现在结果中,右表若匹配不到对应值则会出现null,是一种外连接。
- right (outer) join:右连接,以右表为基准表,右表所有行都会出现在结果中,左表若匹配不到对应值则会出现null,是一种外连接。
- full (outer) join:全连接,两边所有的行都会出现在结果中,匹配不到的值为null,也是一种外连接。
把菜鸟教程的图搬上来看看会清晰一点: 除了以上连接方法,还有交叉连接,相当于笛卡尔积,返回左表行数*右表行数。在多表查询时,我们可以根据场景的需要灵活使用不同的连接方式。
3、where
where可以对未分组的表进行筛选,后面可以用逻辑运算符and,or接上多个筛选条件。 (为方便理解,下面语法使用小写)
Select * from pet where id=7900;
Select * from pet where name='SMITH';
Select * drom pet where id>=7900;
Select * from pet where id > 2000 and id < 3000;
Select * from pet where id > 2000 or comm > 500;
select * from pet where not id > 1500;
Select * from pet where comm is (not) null;
Select * from pet where id between 1500 and 3000;
Select * from pet where id in (5000,3000,1500);
Select * from emp where name like 'M%';
where的筛选能力很强,作用也很多,这里只是做一个简单的总结。
4、group by
group by 语句可以使表按照指定的列分组展示。
SELECT * FROM pet
GROUP BY sex
5、having
having 和 group by 必须要连用,他的作用和where一样是筛选表,但是筛选的对象是分组后的结果。
SELECT * FROM pet
GROUP BY sex
HAVING sex=1000
having 的其他用法和where基本相同(见上方),后面会阐述having和where的不同。
6、order by
order by是对最后的结果进行排序展示,可以指定对应的列进行排序
SELECT * FROM pet ORDER BY id;
SELECT * FROM pet ORDER BY id desc;
SELECT * FROM pet ORDER BY id, name desc;
- desc 或者 asc 只对它紧跟着的第一个列名有效,其他不受影响,仍然是默认的升序。
- ORDER BY 多列时,先按照第一个column name排序,再按照第二个column name
7、limit
limit用来控制最终展示哪几行数据,是对最终结果进行选择性区域展示
SELECT * FROM pet LIMIT 3;
SELECT * FROM pet LIMIT 2,3;
SELECT * FROM pet LIMIT 2 OFFSET 3;
limit一般是数据展示前的最后处理,mysql里的分页就常使用limit。
七、聚合函数
sql里有许多用于计算的内建函数,其中,那些对多个值进行计算返回单一值的函数,我们称之为聚合函数。 常见的聚合函数有以下几种:
- count():用于计算一组值的数量
- sum():用于对一组值求和
- avg():用于求出一组值的平均数
- min():用于求出一组值的最小值
- max():用于求出一组值的最大值
例如:
SELECT COUNT(column_name) FROM table_name;
SELECT COUNT(column_name) AS nums FROM table_name;
null和0不等价,所以在使用这些函数的时候,函数一般不会把值为null的内容计算进去。
八、子查询
子查询就是将一个查询(子查询)的结果作为另一个查询(主查询)的数据来源或判断条件的查询,子查询必须是完整的语句。嵌套子查询的作用很强大,用法也很多,详情可以查看下方这篇博客。 sql中的子查询 由于子查询是比较高阶的sql内容,不再属于基本语法,这里不再赘述。
九、相关问题
这是我在做题和总结的过程中发现的一些坑,这里整理了一下答案,作为巩固和补充的知识点:
(1)、where和having有什么区别
- 虽然都是条件筛选语句,但一个在分组前执行,一个在分组后执行
- 书写顺序where在group by前面,having在group by后面
- having必须和group by连用,where则没有限制
- having后面可以接聚合函数,where后面不能接聚合函数
(2)、delete、truncate和drop有什么区别
- delete可以删除指定数据和全部数据,truncate和drop只能删除全部数据
- 三者的删除效率不同:drop>truncate>delete
- delete只删除表内容。truncate删除表内容并释放空间。drop不仅删除内容、释放空间,还会删除表的结构,删除得一干二净
- delete的删除可以通过回滚回复,truncate和drop的不能恢复
(3)、alter、modify和change有什么区别
- alter后面接modify只能修改字段类型
- alter后面接alter可以修改字段数据(如修改默认值)
- alter后面接change可以修改列名和字段类型
(4)、insert into select 和 select into from 的区别
下面两行代码都是把表B的所有内容插入表A,但是他们对表A的要求不同,表A存在才可以使用insert,表A不存在才可以使用select into from。
insert into A select * from B;
select * into A from B;
(5)、case when是什么用法
case … when … then … else … end是一个固定搭配,不能省略或改变其格式 这是简写语法,case函数一般有两种使用方法,都有固定的格式,详情可看下面这篇博客 sql中case when的使用
(6)、sql注入的关键是什么
sql 注入的关键是单引号 ` 的闭合
(7)、where 1、where0、count(1)、count(*)
- where 1 返回所有数据
- where 0 返回一个空集
- count(1)等同于count(*)返回所有数据,不会忽略空值
- count(字段名)会忽略空值
总结
感谢大家看到这里,sql还有非常多的内容可以深入挖掘和学习,博主整理的内容仅为入门知识,希望能够给正在回顾 sql 的你提供一点帮助。除此之外,我再推荐一个学习sql的网站平台 自学SQL 这个网站上可以在线刷SQL题目,只需要把前面12节基础课的题目刷完就可以入门了,后面的VIP课程听说质量不高,所以没有必要付费。当然,如果是想要为笔试做准备,牛客上面的专项练习有sql的专题,也是个不错的选择。
|