SQL入门,就这么简单

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

  一  数据库简介安全

 

    1,什么是数据库网络

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

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

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

    

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

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

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

    

    3,什么是关系型数据库server

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

    前两种基本已经成为了历史,如今主流的是后两种,但占市场绝对优点的仍然是关系型数据库(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:

 1 create database "my_db";--建立一个库
 2 use "my_db";--选择刚刚穿件的库
 3 create table "my_tb"
 4 (
 5     --字段名1 数据类型 约束,
 6     --字段名2 数据类型 约束,
 7     --......
 8 );--在“my_db”中建立表“my_tb”
 9 
10 alter table "my_tb"
11 add 字段名 数据类型;--修改表,并向其新增一列
12 alter table "my_tb"
13 alter 字段名 数据类型;--修改表中某一列的数据类型
14 
15 drop table "my_tb";--删除表
16 drop database "my_db";--删除库
17 truncate table 表名;--清空表中的数据

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

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

    DML:

 1 /*以 Person 表为例*/
 2 insert into Person (name,age,sex,height)
 3 values('小明',12,'',150);
 4 --向表中插入一条数据,指定插入的列
 5 insert into Person
 6 values ('小黑',22,'',170);
 7 --若是须要插入每一列的数据,能够不指定具体的列
 8 update Person set sex='' where name='小明';
 9 --修改小明的性别为女
10 delete from Person where name='小明';
11 --删除姓名为小明的记录

    

    3,建立约束

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

    建立表时:

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

    表已建立时:

1 /*经过 alter 命令添加约束*/
2 alter table tablename
3 add
4     constraint ck_email check (email like '%@%');
5 --经过 constraint 能够指定约束的名字,建立表时添加约束也可使用,但它不是必须的

    联合主键:

 1 --建立表时:
 2 create table tablename
 3 (
 4     col1 ... ,
 5     col2 ... ,
 6     ......,
 7     constraint pk_name PRIMARY KEY (col1,col2)
 8 )
 9 --表已建立:
10 alter table tablename
11 add
12     constraint pk_name PRIMARY KEY (col1,col2)

 

    4,数据类型

    不一样数据库支持的数据类型有较大差别,即便相同的数据库不一样的版本也存在必定差别,因此在使用时请尽可能以官方文档为依据,这里仅列出部分经常使用的通用的数据类型:

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

  

  四  如何查询

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

    

    1,普通查询

    经过几条简单的查询语句来讲明:

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

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

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

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

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

    where 关键字用于指定过滤条件,经过 where 咱们能够只查询咱们须要的数据,提升查询速度。

    and 关键字用来链接不一样的过滤条件。

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

    like 用来指定模糊查询,% 表示零个或多个任意字符,_ 表示任意单个字符,[ ] 表示指定字符中的一个,[^ ] 表示不在指定字符中的一个。

    一个特别的:在过滤条件中,判断某列的值是否为空,应该使用 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() 格式化字符串

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

    单独使用聚合函数: 

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

    聚合函数 + group by:

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

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

    使用 order by 排序:

1 select * from Person order by age desc;
2 --按年龄从大到小排序查询全部信息,desc 表示倒序。默认是asc 表示升序,能够省略。group by 能够和 order by 一块儿使用,但 order by 永远在查询语句的最后

    

    3,链接查询

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

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

    咱们的关系型数据库正是经过各类各样的外键把不一样表关联起来的。只要根据他们的关系,咱们就能够在不一样的表中查找咱们想要的任何数据了。

    A:内链接

      内链接的用法以下:

1 select * from tableA,tableB;--方式一
2 select * from tableA A
3 join tableB B
4 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
1 select * from sta,sal;--会返回 9 条记录,每条记录有 5 个字段
2 select * from sta,sal
3 where sta.sal_grade = sal.sal_grade;--只会返回9条记录中sta.sal_grade = sal.sal_grade的数据,共3条
4 select * from sta join sal
5 on sta.sal_grade = sal.sal_grade;--也只返回 3 条记录,但他们的原理是有差异的,where 是在产生笛卡尔积后过滤,而 join 方式是在肯定链接关系时就开始过滤,最终不会产生笛卡尔积,除非 on 指定的条件为真
6 select sta.id,sta.name,sal.sal from sta join sal
7 on sta.sal_grande = sal.sal_grande;--只查询须要的字段,而不是两个表中全部的字段

    B:外链接

      外链接又分为左外链接和右外链接,左外链接会返回全部左表中的记录,不管是否知足链接条件,而右外链接恰好相反,会返回右表中全部的记录,不管是否知足链接条件。这里的左和右是指 join 关键字的左和右。

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

1 insert into sta values(4,'张五',5);
2 select sta.id,sta.name,sal.sal from sta 
3 left join sal
4 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 联合两张表。

1 select col1,col2,col3 from tableA
2 union
3 select col1,col2,col3 from tableB

    请注意,union 联合表后,默认只选取不一样的记录,若是你但愿在联合后的记录中容许相同的数据存在,请使用 union all。

相关文章
相关标签/搜索