随着时代的发展,人类活动产生的信息越来越多,大家常说,现在这个时代是大数据时代。在这样一个前提下,数据的存储成为我们必须要认真对待和研究的问题了。SQL(Structured Query Language)结构化查询语言,是当今三大主流关系型数据库(MsSQL,MySQL,Oracle)的通用操作语言,今天就给大家分享一下我对数据库和 SQL 的一些认识,希望对大家有用。

  一  数据库简介

    1,什么是数据库

    在理解什么是数据库之前,我们首先要明白另一个问题,即什么是数据?

    一个人的身高、体重、年龄;一辆车的品牌、颜色,尺寸;一个运动员在完成比赛期间所用的时间,速度,心率;即使你计算机上的图片、视频等都是数据。我的结论就是:用于描述事物或事件的属性,并且能被人们识别的符号就是数据。

    明白了什么是数据,不难推测出:数据库就是数据存储的仓库,各种数据的集合。当然数据库中的数据都是有序的,有组织的,这是为了能让管理数据更方便。

    

    2,什么是数据库管理系统

    你可能常常听到人们常说:MsSQL 数据库、MySQL 数据库、Oracle 数据库等等,其实他们多数指的是不同的数据库管理系统。SQL server 是微软旗下的数据库管理系统,MySQL 和 Oracle 目前都属于甲骨文公司。

    数据库管理系统本质上是一套软件,专门用于帮助用户管理数据库中的数据。

    

    3,什么是关系型数据库

    根据数据库组织和存储数据的方式,数据库通常分为四类:层次式数据库、网络式数据库、关系型数据库、非关系型数据库。

    前两种基本已经成为了历史,现在主流的是后两种,但占市场绝对优势的仍然是关系型数据库(Relational Database Management System:RDBMS)。顾名思义,关系型数据库是依照数据与数据之间的关系来组织存储数据的。

    

    为了方便后面的书写,这里进行一个声明:从此之后,文中提到的所有数据库均指关系型数据库。

    

    4,数据库和 SQL 有什么联系

    SQL,指结构化查询语言,全称是 Structured Query Language。

    SQL 是用于访问和处理数据库的标准的计算机语言。

    SQL 是一种 ANSI(American National Standards Institute 美国国家标准化组织)标准的计算机语言。

    SQL 是一种命令式语言。

    当今三大数据库管理系统均支持标准 SQL。

  

  二  如何存储

    现在,我们已经知道什么是数据库、数据库管理系统和 SQL 了。那么,既然数据库是用来存储数据的,那么数据库具体是通过什么方式来进行存储的呢?它又是怎样保证数据的有效性、合法性呢?既然说现今社会主流的仍然是关系型数据库(RDBMS),那么数据库又是怎么在数据与数据之间确定关系的呢?

    

    1,数据的存储方式

    开门见山的说:数据库是通过“表”来存储数据,根据不同的数据库管理系统,以不同的文件格式最终被保存到物理磁盘上(多是硬盘)。

    这里的表类似 Excel 表格,表中的数据由不同的行和列组成,每一列在数据库中我们称为一个字段,每一行数据称为一条记录或元组,它算是数据在数据库中的基本单元。

    如果用一张表来记录一类事物,那么每一条记录可以看成这类事物单独的个体,而不同的列则是用来记录事物的每个具体的特性。例如一个Person 表,用来记录人员信息,每个人员都可以拥有自己的姓名,年龄,性别,身高等信息,那么这个表应该具有姓名,年龄,性别等这些列。

name age sex height birthday
张三 20 180 2000-01-01
李四 18 170 2002-01-01
王五 25 165 1995-01-01

    在这个表中,每一行就是一条记录,代表一个具体的人,每一列都是用来描述人的不同特征的,从表中可以看出,每个人都拥有不同的特性。

    

    2,确保数据的有效性

    上面的表格有一个问题:不能确保数据的有效性、合法性。为什么这么说呢?

    试想一下,这个世界上人那么多,总会有其他人也叫张三,并且年龄正好也是20,正好也是个身高180的大汉,那么在表中岂不是有两条一模一样的记录?那我们怎么来区分到底谁是谁呢?还有,在不加任何限制的情况下,我可以随意录入人员的年龄,比如我错把王五的年龄记录成了250,这世上还没有能活250岁的人吧,显然这样的数据是不合常理的。

    那么数据库是怎么解决这个问题的呢?答案是:约束。

    约束作用于表的列,约束用于规定表中的数据存储规则。如果我们在录入数据时,不符合约束的规定,那么你将不能把该数据录入数据库中。

    

    3,约束

    数据库中主要的约束有以下几种:

      NOT NULL - 指示某列不能存储 NULL 值,即空,什么都没有。

      UNIQUE - 保证每行的某一列必须具有唯一的值,不能重复。

      PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或多个列的结合,即联合主键)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。

      FOREIGN KEY - 保证表中某一列的数据来自另一个表中的某一列。能使用外键约束的列,其数据在另一个表中必须是主键。数据库正是通过外键来建立表与表之间的联系。

      CHECK - 保证列中的值符合指定的条件,确保数据的合理性。

      DEFAULT - 规定没有给列赋值时的默认值。

    本章主要讲解数据库如何存储数据和如何确保数据的有效性,下一章将详细介绍如何创建表,如何为表的字段添加约束,以及如何向表中插入和删除数据等。

  

  三  如何操作

    1,基础语法

    前面提到,SQL 是命令式语言,所以它的语法其实非常简单,每一条命令就是一条语句,每条语句以“;”结束(非必须)。并且 SQL 语句对大小写不敏感,不过为了方便阅读和维护代码,请尽量统一命令的大小写。

    SQL 中的命令总共分为四大类:

      A:DDL(Data Definition Language)数据定义语言

      主要命令包括:create(创建)、alter(修改)、drop(删除)

      B:DQL(Data Query Language)数据查询语言

      主要命令包括:select

      C:DML(Data Manipulation Language)数据操纵语言

      主要命令包括:insert(插入)、update(修改),delete(删除)

      很多时候,select 命令也被认为是 DML 语言的一种,所以,如果你在其他地方听到这种说法时,不必感到诧异。

      D:DCL(data Control Language)数据控制语言

      主要命令包括:grant(授权)、revoke(回收)、commit(提交)、rollback(回滚)等

      数据控制语言主要是针对数据库安全性方面的操作,可以简单理解为权限管理,这部分命令 DBA 经常使用,一般数据开发人员用的较少。

    

    2,使用方式

    DDL:

 create database "my_db";--创建一个库
use "my_db";--选择刚刚穿件的库
create table "my_tb"
(
--字段名1 数据类型 约束,
--字段名2 数据类型 约束,
--......
);--在“my_db”中创建表“my_tb” alter table "my_tb"
add 字段名 数据类型;--修改表,并向其新增一列
alter table "my_tb"
alter 字段名 数据类型;--修改表中某一列的数据类型 drop table "my_tb";--删除表
drop database "my_db";--删除库
truncate table 表名;--清空表中的数据

    DQL:数据查询语言是 SQL 的重中之重,将在下一页单独讲解,这里仅给出 select 命令的基础用法。

 /*以上面的 Person 表为例*/
select name ,age from Person;--查询Person表中所有人员的姓名及年龄
select * from Person;--查询Person表中的所有数据,*是通配符

    DML:

 /*以 Person 表为例*/
insert into Person (name,age,sex,height)
values('小明',12,'男',150);
--向表中插入一条数据,指定插入的列
insert into Person
values ('小黑',22,'男',170);
--如果需要插入每一列的数据,可以不指定具体的列
update Person set sex='女' where name='小明';
--修改小明的性别为女
delete from Person where name='小明';
--删除姓名为小明的记录

    

    3,创建约束

    创建约束有两种方式,其一:在创建表时同时创建约束,其二:同过 alter 命令向已创建的表添加约束。

    创建表时:

 /*创建表时即添加约束*/
create table tablename
(
id int identity(1,1) primary key,
name varchar(50) not null,
idcard char(18) unique,
city varchar(50) foreign key(city) references City(id),--city列的值通过外键绑定City表的id列
age int check (age>0 and age<150),
email varchar(50) not null
)

    表已创建时:

 /*通过 alter 命令添加约束*/
alter table tablename
add
constraint ck_email check (email like '%@%');
--通过 constraint 可以指定约束的名字,创建表时添加约束也可以使用,但它不是必须的

    联合主键:

 --创建表时:
create table tablename
(
col1 ... ,
col2 ... ,
......,
constraint pk_name PRIMARY KEY (col1,col2)
)
--表已创建:
alter table tablename
add
constraint pk_name PRIMARY KEY (col1,col2)

    4,数据类型

    不同数据库支持的数据类型有较大差异,即使相同的数据库不同的版本也存在一定差异,所以在使用时请尽量以官方文档为依据,这里仅列出部分常用的通用的数据类型:

      bigint(整型)、varchar(n)(可变长度字符串)、boolean(布尔值)、float(浮点型)、date(日期)、time(时间),timestamp(日期+时间型)、xml(XML型)。

  

  四  如何查询

    相较于其他命令,数据库开发中用的最多的就是 select 了,没有之一。

    

    1,普通查询

    通过几条简单的查询语句来说明:

 insert into Person values('张五',30,男,175,'1990-01-01');
insert into Person (name,sex,height,birthday)
values('张六',男,175,'1990-01-01');
--先插入两条新数据
select * from Person as P
where P.birthday between '1990-01-01' and '2010-01-01'
and P.name like '%张%'
and P.age is not null
--查询生日在1990-2010间姓名包含张并且年龄不为空的所有人员信息

    通过上面的例子,我要说明查询语句的一些基本用法。

    首先是紧跟在 select 命令之后的信息,它表示需要被查询的字段,* 星号表示通配符,意为查询所有表中的字段。

    其次是 from 关键字,它表示从哪个表中查询数据,紧跟在其后的是被查询的表名。

    as 关键字的作用是给表起一个别名,主要是为了简化代码,被查询的字段,也可以使用 as 起一个更通俗易懂的别名。

    where 关键字用于指定过滤条件,通过 where 我们可以只查询我们需要的数据,提高查询速度。

    and 关键字用来连接不同的过滤条件。

    between...and... 是一个组合范围关键字,如上例所示,它可以用来指定时间范围,还可以用来指定数字的取值范围等。

    like 用来指定模糊查询,% 表示零个或多个任意字符,_ 表示任意单个字符,[ ] 表示指定字符中的一个,[^ ] 表示不在指定字符中的一个。如果需要使用 like 查询包含特殊字符的列,比如 %、_等,那么你需要用到 escape 定义转意字符。

 select * from table
where col like '%$_%' escape '$';
-- $ 符号被定义成转意字符,紧跟在 $ 后面的字符会被当成普通字符匹配

    一个特别的:在过滤条件中,判断某列的值是否为空,应该使用 is 或 not is 关键字,而不是使用 = 等号或 != 不等号 。

    

    2,分组和排序

    SQL 中的分组使用 group by 实现,group by 通常和聚合函数一起使用,单独使用 group by 分组没有现实意义。

    SQL 中的聚合函数从列的计算中获取值,一般返回一个单一的值。SQL 中除了聚合函数,还有另一类标量函数,它们基于输入的值返回一个单一的值。

聚合函数 含义 标量函数 含义
AVG() 返回平均值 UCASE() 转换为大写
COUNT() 返回行数 LCASE() 转换为小写
FIRST() 返回第一个记录 SUBSTRING() 截取字符串
LAST() 返回最后一个记录 LEN() 返回字段长度
MAX() 返回最大值 ROUND() 四舍五入
MIN() 返回最小值 NOW() 返回系统时间
SUM() 返回总和 FORMAT() 格式化字符串

    不同数据库对函数的实现有一定差异,但常用的函数使用方式都相同:如上黑体字列出的聚合函数。 

    单独使用聚合函数: 

 select avg(age) as "平均年龄" from Person;--计算所有人的平均年龄
select max(age) as "最大年龄",min(age) as "最小年龄" from Person;--计算最大年龄和最小年龄
select count(name) as "人数" from Person;--统计表中的人数
--count()通过指定列来统计个数,忽略 NULL 值

    聚合函数 + group by:

 select sex,sum(name) as "人数" from Person
group by sex
having sum(name)>2;--查询性别人数之和大于的的性别和人数
--group by 后面为聚合(或者叫分组)的字段,查询中用来分组的字段都必须出现在 group by 之后,having 用来对聚合后的数据再过滤

    如果有多个字段需要被用来分组,那么他们的分组顺序是从左至右的,并且最右边的字段将被当做聚合函数计算的最小分组。

    使用 order by 排序:

 select * from Person order by age desc;
--按年龄从大到小排序查询所有信息,desc 表示倒序。默认是asc 表示升序,可以省略。group by 可以和 order by 一起使用,但 order by 永远在查询语句的最后

    

    3,连接查询

    连接查询分为三类:内连接,外连接,全连接。

    我们知道,现实世界中的事物都存在各种联系,通过事物之间的种种联系,你可以收集到更多在一类事物上不存在的信息。正如著名的七人理论:你最多只需要通过7个人就能和世上任何一个人认识。这也是一种典型的关系模型。

    我们的关系型数据库正是通过各种各样的外键把不同表关联起来的。只要根据他们的关系,我们就可以在不同的表中查找我们想要的任何数据了。

    A:内连接

      内连接的用法如下:

 select * from tableA,tableB;--方式一
select * from tableA A
join tableB B
on 1=1;--方式二(join 是inner join 的缩写,on 用来指定组合产生新数据连接的条件,这里1=1始终为真,意为没有任何限制的连接两个表)

      内连接会使用两个表中的数据产生一个笛卡尔积,简单的说就是:数据库把两个表中的数据认为是多对多的关系,用表 A 的每一条数据去和表 B 中的每一条数据组合成新的数据。

      最终的结果是:总记录的条数是两个表记录条数的乘积,字段数是两个表字段数的总和。

      很显然,通常情况下,笛卡尔积并不是我们需要的数据。方式一可以通过 where 来设置过滤条件,而方式二则是通过 on 指定连接条件。比如如下sta和sal两个表:

sta表 id name sal_grade sal表 sal_grade sal
1 张三 3 1 8000
2 李四 2 2 6000
3 王五 1 3 4000
 select * from sta,sal;--会返回 9 条记录,每条记录有 5 个字段
select * from sta,sal
where sta.sal_grade = sal.sal_grade;--只会返回9条记录中sta.sal_grade = sal.sal_grade的数据,共3条
select * from sta join sal
on sta.sal_grade = sal.sal_grade;--也只返回 3 条记录,但他们的原理是有差别的,where 是在产生笛卡尔积后过滤,而 join 方式是在确定连接关系时就开始过滤,最终不会产生笛卡尔积,除非 on 指定的条件为真
select sta.id,sta.name,sal.sal from sta join sal
on sta.sal_grande = sal.sal_grande;--只查询需要的字段,而不是两个表中所有的字段

    B:外连接

      外连接又分为左外连接和右外连接,左外连接会返回所有左表中的记录,无论是否满足连接条件,而右外连接刚好相反,会返回右表中所有的记录,无论是否满足连接条件。这里的左和右是指 join 关键字的左和右。

      外连接最终的输出结果表现为:总记录数不能确定,因为可能存在一对多的关系。而字段数仍为两个表字段数之和。那些满足连接条件的记录,每个字段都会有确定的值,而那些不满足连接条件的记录,则只有左表或右表的字段有值,另一个表的字段为 NULL(具体取决于是左外连接还是右外连接)。

 insert into sta values(4,'张五',5);
select sta.id,sta.name,sal.sal from sta
left join sal
on sta.sal_grande = sal.sal_grande;--返回 4 条记录,但张五的工资字段为 NULL,因为 sal 表中并没有 sal_grande 为 5 的记录可以匹配

    C:全连接和交叉连接

    全连接使用 full join,结果集的数量不确定,字段数是两个表字段数的总和,但是,依然会返回左右表中不满足连接条件的记录,只是另一边表的字段则均为 NULL。

    交叉连接使用 cross join,产生的结果仍是笛卡尔积,等价于内连接。

insert into sal values(4,2000);
select * from sta
full join sal
on sta.sal_grande = sal.sal_grande;--返回 5 条记录,但name为张五的记录中sal表的字段值均为 NULL,工资等级为 4 的记录中 sta 表的字段均值为 NULL

    

    4,联合查询

    连接查询是把表的字段横向组合到一起,从而产生新的数据,而联合查询是把两个表的记录纵向组合到一起,联合查询的要求是:两个表的字段数量和对应字段的数据类型必须相同。SQL 通过 union 联合两张表。

 select col1,col2,col3 from tableA
union
select col1,col2,col3 from tableB

    请注意,union 联合表后,默认只选取不同的记录,如果你希望在联合后的记录中允许相同的数据存在,请使用 union all。

SQL入门,就这么简单的更多相关文章

  1. sql数据黑马程序员——SQL入门

    最近研究sql数据,稍微总结一下,以后继续补充: ---------------------- ASP.Net+Android+IO开辟S..Net培训.等待与您交流! --------------- ...

  2. SQL入门经典(十) 之事务

    事务是什么?事务关键在与其原子性.原子性概念是指可以把一些事情当作一个执行单元来看待.从数据库角度看待.他是指应该全部执行或者全部不执行一条或多条语句的最小组合.当处理数据时候经常确保一件事发生另一件 ...

  3. 《SQL入门经典》总结

    <SQL入门经典>这本书从考试前就开了个头,一直到前两天才看完,拉的战线也够长的.放假来了,基本上什么内容都不记得了.好不容易看完了,就赶紧总结一下吧! 该书分为两大部分,第一部分是第1~ ...

  4. 数据库系统概论学习3-SQL 语句和关系代数(一)SQL 入门

    3. SQL 语句和关系代数(一)SQL 入门 3.1 数据库的编程语言 SQL 的优点 SQL 集成了数据查询(data query).数据操作(data manipulation).数据定义(da ...

  5. Oracle PL/SQL入门之慨述

    Oracle PL/SQL入门之慨述 一.PL/SQL出现的目的 结构化查询语言(Structured Query Language,简称SQL)是用来访问关系型数据库一种通用语言,它属于第四代语言( ...

  6. SQL入门语句之ORDER BY 和GROUP BY

    一.SQL入门语句之ORDER BY ORDER BY 是用来基于一个或多个列按升序或降序顺序排列数据 1.从数据库表获取全部数据按字段A的升序排列 select *from table_name o ...

  7. SQL入门语句之LIKE、GLOB和LIMIT

    一.SQL入门语句之LIKE LIKE用来匹配通配符指定模式的文本值.如果搜索表达式与模式表达式匹配,LIKE 运算符将返回真(true),也就是 1.这里有两个通配符与 LIKE 运算符一起使用,百 ...

  8. SQL入门语句之SELECT和WHERE

    一.SQL入门语句之SELECT SELECT语句用于从数据库表中获取数据,结果表的形式返回数据.这些结果表也被称为结果集 1.从数据库表中取部分字段 select 字段A,字段B from tabl ...

  9. SQL入门语句之INSERT、UPDATE和DELETE

    一.SQL入门语句之INSERT insert语句的功能是向数据库的某个表中插入一个新的数据行 1.根据对应的字段插入相对应的值 insert into table_name(字段A, 字段B, 字段 ...

  10. SQL入门经典(一)之简介

    今天是我第一天开通博客,也是我的第一篇博客.以后为大家带来第一篇关于学习技术性文章,这段时间会为大家带来是SQL入门学习.希望大家坚持读下去,因为学历有限.我也是初学者.语言表达能力不好和知识点不足, ...

随机推荐

  1. uni-app实现文件上传(h5方式)

    1.嵌入H5页面,需要采用web-view标签,如下: <web-view src="/hybrid/html/index.html" @message="hand ...

  2. Transformers 库常见的用例 | 三

    作者|huggingface 编译|VK 来源|Github 本章介绍使用Transformers库时最常见的用例.可用的模型允许许多不同的配置,并且在用例中具有很强的通用性.这里介绍了最简单的方法, ...

  3. 近期 github 机器学习热门项目top5

    磐创智能-专注机器学习深度学习的教程网站 http://panchuang.net/ 磐创AI-智能客服,聊天机器人,推荐系统 http://panchuangai.com/ [导读]:Github是 ...

  4. 高数解题神器:拍照上传就出答案,这个中国学霸做的AI厉害了 | Demo

    一位叫Roger的中国学霸小哥的拍照做题程序mathAI一下子火了,这个AI,堪称数学解题神器. 输入一张包含手写数学题的图片,AI就能识别出输入的数学公式,然后给出计算结果. 不仅加减乘除基本运算, ...

  5. canvas 实现手机图案解锁

    参考☞: https://www.cnblogs.com/chenyingying0/ 先上效果图: 我是在 vue 里面实现js 文件 ,所以如果需要在vue 里面使用 可以将以下内容import  ...

  6. Matlab——m_map指南(3)——实例

    m_map 实例 1. clear all m_proj('ortho','lat', 48,'long',-123');%投影方式,范围 m_coast('patch','r');%红色填充 m_g ...

  7. IDEA运行报错 Error:java: 错误: 不支持发行版本 xx

    解决方案 修改项目配置,进入Project Setting,截图可参考下面的截图 1.修改全局设置 修改Project->Project Language Level->选择版本比当前jd ...

  8. fiddler设置重定向

    fiddler支持将指定模式的url映射到另一个指定的url,即可用于拦截某一请求,并重定向到本地的资源或其他服务器地址 fiddler常用于: 解析请求:如:解析http请求状态,请求头,请求正文, ...

  9. c期末笔记(4)

    未命名易错点 1.0<y<10 在c语言中,0<y<10不是一个正确的表达式,应该利用逻辑运算符替换(y>0&&y<10或者!(y<=0||y ...

  10. Mysql数据库错误代码大全

                                                    Mysql数据库错误代码大全 出现较多的一些网页代码提示的意思: 1016错误:文件无法打开,使用后台修 ...