SQL学习知识点汇总
1.SQL是什么?
- SQL其实是一种编程语言,用于访问和处理数据库的计算机语言
- 编程语言都有几个特性,有数据类型、可以做运算。
- 编程语言是为了编程而发明,而程序=数据+算法。所以编程语言是一定需要具备数据类型和运算能力的。
- 所以对比而言,html就不是编程语言,因为只有数据类型,而无法做运算。SQL是有数据类型,也可以做运算的。
- SQL,structural query language,结构化查询语言
2.SQL可以做什么?
- 可以访问数据库
- 可以对数据库做增删改查操作(数据创建、查询、删除、更新)等操作。
数据库作用:
- 存储数据的仓库,能够对数据进行条理化存储,方便后续查询、更新等操作
- 能够更加快速便捷进行数据访问和处理
3.数据库类型
- 数据库可以从很多个维度进行划分。例如是关系型数据库还是非关系型数据库、是否是单机数据库还是分布式数据库等等
- 主要和常见的分类标准,划分是关系型数据库和非关系型数据库。
- 关系型数据库,可以简单类比Excel,为了客观地记录一类事物地信息,需要从很多个维度对这些事物进行数据描述,就需要建立多个表。一个数据库可以理解为一个excel文件,一个表就是一个excel地sheet。每个表中存储者从某个维度对这些事物地数据信息记录或者描述。例如一个人在电商公司数据库的信息,有基本的个人信息,有浏览网站和app的信息,有购买商品的信息,有收藏商品的信息。这么多维度的信息,一般都是放在不同的数据库表中进行存储。
- 非关系型数据库,这是由于数据本身各种各种,例如有些数据就是文件类型,就有文件型数据库。有些数据就是图片等数据,就会有对应类型的数据库来进行存储和管理。后续还会遇到各种各样的数据库,特别是一些小众或者应用相对狭窄的数据库类型。
4.SQL怎么使用?
4.1 使用前预备
- SQL是一种标准,ANSI(American National Standards Institute)制定的标准。顶级国家都是制定标准的国家,我们距离美国的国力差距还有很长的路要走,不骄傲,也不放弃,总会复兴的。
- 既然SQL是一种标准,那么就必然会发生遵守和不遵守这个标准和扩展这个标准的情况。所以SQL语句在很多数据库中并不是所有指令都能生效,但主要的指令会是一样的效果。如select、update、delete、insert、where
- 要使用SQL,首先需要安装一个数据库(相应的软件环境也需要安装好)。
- 数据库可以选择MySQL、microsoft access、sql server等等
- 这篇文章选择MySQL作为演示,
- MySQL在windows下安装,MySQL在windows下安装
- 关系型数据库都是以行跟列组合方式显示,跟excel形式是一样的。如下图
- 数据类型
- character(n), 字符/字符串。固定长度 n字符,不可变长度
- varchar(n) 或 charactervarying(n) , 字符/字符串。可变长度。最大长度 n字符,在version5之后,就是按照字符来计算长度了。
- binary(n), 二进制串,理论上任何数据都可以二进制形式存储。固定长度 n。
- boolean, 存储 TRUE 或 FALSE 值
- varbinary(n) 或 binaryvarying(n) 二进制串。可变长度。最大长度 n。
- integer§, 整数值(没有小数点)。精度 p。
- smallint,整数值(没有小数点)。精度 5。
- integer, 整数值(没有小数点)。精度 10。
- bigint, 整数值(没有小数点)。精度 19。
- decimal(p,s), 精确数值,精度 p,小数点后位数 s。例如:decimal(5,2) 是一个小数点前有 3 位数,小数点后有 2 位数的数字。阿里巴巴的规范中强制要求浮点数都使用decimal来存储,使用float或者double存取时会有精度损失
- numeric(p,s) 精确数值,精度 p,小数点后位数 s。(与 DECIMAL 相同)
- float§ 近似数值,尾数精度 p。一个采用以 10 为基数的指数计数法的浮点数。该类型的 size 参数由一个指定最小精度的单一数字组成。
- real 近似数值,尾数精度 7。
- float 近似数值,尾数精度 16。
- doubleprecision 近似数值,尾数精度 16。
- date 存储年、月、日的值。
- time 存储小时、分、秒的值。
- timestamp 存储年、月、日、小时、分、秒的值。
- interval 由一些整数字段组成,代表一段时间,取决于区间的类型。
- array 元素的固定长度的有序集合
- multiset 元素的可变长度的无序集合
- xml 存储 XML 数据
- sql注释,单行和多行
# 这是单行注释
-- 这是单行注释
/*
这是多行注释
*/
4.2知识点分类
1.DDL,data definition language
1.1背景知识
- 这是数据定义语言,在关系型数据库中,数据库本身就是一个文件,例如我创建的一个数据库及一个数据库表,最终体现在windows中mysql安装目录下data目录下的一个文件夹
- 一个数据库,database,可以看做是一个特殊文件夹。里面的数据库表,注意是由2部分数据组成,表结构和表数据。表结构就是常说的schema,表数据就是metadata。
- 关系型数据库存储的数据都是结构化数据,也就是在数据表定义时,就规定了有哪些字段,每个字段什么类型(存储是以多少个字节存储,什么格式读取和写入)。知道这些信息后,读取文件的元数据信息时,就可以拿着这些信息来读取数据,确保数据和字段正确匹配,并且正确被读取出来。
- sql语言中大小写不敏感,所以关键字大小写都ok,不过传统程序员一般都会将SQL的关键字大写,其他小写以示区分。不过目前一些公司内部并没有严格约束,一般这些关键字要么全部大写,要么全部小写,本身还是以代码运行起来为准。
- 大家看一些视频,资料时,会发现sql语言的关键字都是大写,本文也会采取这种方式。但需要知道,本身sql对大小写是不敏感的。
1.2建数据库
注意我们建立数据库或者表时,数据库一般以db_开头,数据表一般以tb_开头,算是一种命名风格,不过不同公司规范不一样,我说的这个只是一种命名规范。
CREATE DATABASE db_my;
-- 展示有多少个数据库
show databases;
1.3建数据库表
CREATE TABLE tb_person
(
person_id int primarykey auto_increment not null comment '用户id',
lastaname varchar(255) comment '姓,英文中姓名倒置',
firstname varchar(255) comment '名,英文中姓名倒置',
address varchar(255) comment '用户住址,会尽可能精确到省市区县乡村组级别',
province varchar(255) comment '所在省',
city varchar(255) comment '所在城市'
)charset=utf8;
-- 展示数据库表信息
show tables;
-- 显示数据库表结构信息
desc tb_person;
- 这里SQL语句命名有多种风格,一种是大驼峰法,就是数据库名字,数据库表名字,字段名都是大驼峰法。还有使用小驼峰法,我这里使用小写结合下划线的风格。具体使用看每个公司的规范和约束。
- 这里定义了person_id 、lastaname 、firstname 、address 、province 、city 6个字段,也就是数据库表中的列名。
- 这里涉及了几种数据类型,int就是32位整数,varchar就是可变字符串类型,这里指定字符串长度最长是255字节,comment就是字段注释,没错,sql中可以对每个字段加注释。
1.4.数据库规范
- 注意,sql正规的建表是需要遵守各个公司的规范。国内很多公司参考阿里巴巴的java开发手册,其中就有mysql的规范包括数据库建表规范。
https://developer.aliyun.com/topic/java2020?spm=a2c6h.12873639.0.0.18e917d91067Lg
2.DML,data manipulation language
- 数据操作,增删改查,不过需要注意,修改的时候Alter命令比较特殊,可以对数据库、数据库表、表字段都可以进行修改。
- 数据查询,书写顺序 :
select -> from ->join/union -> where -> group by -> having -> order by->limit by
执行顺序:
from ->join/union-> where -> group by -> having -> select -> order by->limit by
2.1 增加数据
- 所有字段数据插入, 注意一行完整的sql语句结束后,一般都以分号;标识结束,和java语言是一样的
/*
所有字段数据插入,字段顺序和插入数据类型必须和数据库表定义时一样
person_id int ,
lastaname varchar(255) ,
firstname varchar(255) ,
address varchar(255) ,
province varchar(255) ,
city varchar(255)
*/
INSERT INTO tb_person
VALUES (2, 'shen', 'lei', 'hunanshengchangshashiyueluqu','hunan', 'changsha');
# 插入多条数据
INSERT INTO tb_person
VALUES (3, 'bing', 'shao', 'hubeiwuhanhanyi','hubei', 'wuhan'), (4, 'zi', 'jiao', 'henanzhengzhouyixu','henan', 'zhengzhou');
- 针对部分字段数据插入
-- 注意看,这时候字段顺序可以做调换,只要按照字段顺序进行值的插入即可
INSERT INTO tb_person (city,province,person_id)
VALUES ('guangzhou','guangdong', 5);
- 从一个数据表中查询信息插入另外一个表来创建数据
# 这里,SELECT uid FROM tb_user WHERE id=1是一个数据集合,插入到tb_collect表中,插入时需要更新的字段是uid这个字段,当然可以是多个字段。
INSERT INTO tb_collect(uid)
SELECT uid FROM tb_user
WHERE id=1;
2.2查询数据
- 针对某个字段做查询,注意这里没有使用约束条件如where、group by、having
SELECT person_id,city
FROM tb_person;
- 针对所有字段做查询,注意这里没有使用约束条件如where、group by、having
SELECT * FROM table_name;
- 针对字段值去重查询,以下语句会把数据库中所有city字段取出,同时去掉重复的数据。
SELECT DISTINCT city
FROM tb_person;
- 针对查询做值约束, 以下语句意思是从数据库表中取出所有行数据中,city字段值是“changsha”的数据。*代表通配符,这一点在很多语言和场景下都适用,注意注意。
SELECT * FROM tb_person WHERE city='changsha';
- 针对查询结果,做多条件判断,and就是同时满足的意思,or就是或