SQL基础

Posted zhichun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL基础相关的知识,希望对你有一定的参考价值。

SQL基础

SQL基础部分是本人学习《深入浅出mysql数据库开发、优化与管理维护》这本书看的第二章。练习上面的SQL语句,并将自己练习的SQL语句和重点的总结罗列出来。

DDL(Data Definition Language)

数据定义语言,这些语句定义了不同数据段,数据库,表,列,索引等数据库对象

DML(Data Manipulation Language)

数据操纵语言,用于添加、删除、更新和查询数据库记录

DCL(Data Control Language)

数据控制语句,用于控制不同数据段直接的许可和访问级别的语句

DDL语句

数据库的创建与删除

CREATE database testchapter2;
DROP DATABASE testchapter2;

数据库和表内容的显示

SHOW DATABASES;
USE testchapter2;
SHOW TABLES;

注意,

针对TABLES和DATABASES时,使用SHOW命令

针对单个表内的字段时,使用DESC

创建表与删除表

CREATE table emp(ename VARCHAR(10), hiredate date,sal decimal(10,2),deptno int(2) );
SHOW CREATE TABLE emp;
SHOW TABLES;
DROP TABLE emp;
SHOW TABLES;
SHOW CREATE TABLE emp;

decimal(5,2)

In this example, 5 is the precision and 2 is the scale. The precision represents the number of significant digits that are stored for values, and the scale represents the number of digits that can be stored following the decimal point.

Standard SQL requires that DECIMAL(5,2) be able to store any value with five digits and two decimals, so values that can be stored in the salary column range from -999.99 to 999.99.

修改表

  • 修改表类型
ALTER TABLE emp MODIFY ename VARCHAR(20);
desc emp;
  • 增加表字段
ALTER TABLE emp ADD column age int(3);
desc emp
  • 删除表字段
ALTER TABLE emp DROP age;
desc emp;
  • 字段改名
ALTER TABLE emp CHANGE ename ename1 int(4);
DESC emp

注意,修改字段名时,字段类型也必须加上;ADD增加字段默认是加在表的最后位置,而CHANGE/MODIFY默认都不会改变字段的位置。

  • 修改字段排列顺序
ALTER TABLE emp MODIFY ename int(3) first;
ALTER TABLE emp add birth date after ename;
  • 更改表名
ALTER TABLE emp rename emp1;

DML语句

插入记录

INSERT into emp VALUES('lisa','2003-2-1','3000',2);
INSERT Into emp(ename,hiredate,sal,deptno) VALUES('zzx1','2000-01-02','2000',1);
INSERT INTO emp (ename,sal) VALUES('dony',1000);
--一次性插入多条记录
INSERT Into emp(ename,hiredate,sal,deptno) VALUES('zzx2','2000-01-02','2000',1),('zzx3','2000-01-02','2000',1);

注意,同时插入多条语句时,最外围不需要大括号。

更新记录

UPDATE emp set sal=4000 where ename='lisa';

删除记录

delete from emp where ename='dony';

查询记录

  • 查询不重复的记录
select distinct ename from emp;
  • 条件查询
select * from emp where deptno=1 and sal<3000;
  • 排序和限制

排序中,如果不写关键字,则默认升序,否则使用降序

select * from emp ORDER BY sal desc;

对于排序后的记录,如果希望使用部分记录,则可以使用limit关键字来实现。

SELECT...[LIMIT offset_start,row_count]

其中offset_start表示记录的起始偏移量,row_count表示显示的行数

select * from emp ORDER BY sal desc LIMIT 3;

limit经常和order by一起配合使用来进行记录的分页显示。

聚合

很多情况下,用户需要进行一些汇总操作,比如统计整个公司的人数或者统计每个部门的人数,这时就需要用到SQL的聚合操作

聚合函数有sum, count,max,min

GROUP BY关键字表示要进行分类聚合的字段,比如按照部门分类统计员工数量,部门就应该写在group by后面

WITH ROLLUP是可选语法,表明是否对分类聚合后的结果再进行汇总给你

HAVING关键字表示对分类后的结果再进行过滤

其中having和where的区别在于,having 是 对聚合后的结果进行条件的过滤,而 where是在聚合前就对记录进行过滤,如果逻辑允许,我们应该尽可能先用where进行过滤。

  • 统计emp表中人数
-- 统计公司总人数
select count(1) from emp;

-- 统计各部门人数
select deptno, count(1) from emp group by deptno;

-- 既要统计各部门人数,又要统计总人数
select deptno, count(1) from emp GROUP BY deptno with rollup;

-- 统计人数大于1人的部门
select deptno, count(1) from emp GROUP BY deptno having count(1)>1

-- 统计所有员工的薪水总额,最高和最低薪水
select sum(sal),max(sal),min(sal) from emp;

表连接

  • 内连接
select ename, deptname from emp,dept where emp.deptno = dept.deptno;

只选出两张表中互相匹配的记录。

  • 外连接
    • 左连接 包含所有左表中的记录甚至是右表中没有和它匹配的记录
    • 右连接 包含所有右表中的记录甚至是左表中没有和它匹配的记录
select ename,deptname from emp left join dept on emp.deptno = dept.deptno;
select ename, deptname from dept right join emp on emp.deptno = dept.deptno;

本例中列出了所有的用户名,即使有的用户名并不存在合法的部门名称;

如果在右连接中将表的位置互换,则效果是相同的,因为都是保证emp表中所有的记录都出现。

同理,如果要保证dept中所有的数据都匹配,而不必保证emp表和它匹配的记录

select ename,deptname from dept left join emp on emp.deptno = dept.deptno;

子查询

在某些情况下,当进行查询时,需要的条件是另一个select的结果,这个时候,就要用到子查询

子查询的关键字有in、not in、 =、 !=、 exists、 not exists、

select * from emp where deptno in (select deptno from dept);

如果子查询记录数唯一,可以用 = 代替 in

select * from emp where deptno = (select deptno from dept limit 1)

记录联合

将两个表的数据按照一定的条件查询出来后,按照结果合并在一起显示出来。

select deptno from emp 
union all
select deptno from dept;

union all是直接将结果合并在一起。

Union和Union all的主要区别是union all是把结果直接合并在一起,而UNION是将UNION ALL后的结果再进行一次DISTINCT, 去掉重复记录。

select deptno from emp 
union
select deptno from dept;

以上是关于SQL基础的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft SQL Server 代码片段收集

缺少 SQL SERVER 2014 代码片段

sql Oracle代码片段

sql 日期转换代码片段 - Dato,120,konvertere

以下代码片段是不是容易受到 Rails 5 中 SQL 注入的影响?

Discuz代码片段