SQL 知识点学习汇总,SQL学习这一篇就足够了

SQL学习知识点汇总

1.SQL是什么?

  1. SQL其实是一种编程语言,用于访问和处理数据库的计算机语言
  2. 编程语言都有几个特性,有数据类型、可以做运算。
  3. 编程语言是为了编程而发明,而程序=数据+算法。所以编程语言是一定需要具备数据类型和运算能力的。
  4. 所以对比而言,html就不是编程语言,因为只有数据类型,而无法做运算。SQL是有数据类型,也可以做运算的。
  5. SQL,structural query language,结构化查询语言

2.SQL可以做什么?

  1. 可以访问数据库
  2. 可以对数据库做增删改查操作(数据创建、查询、删除、更新)等操作。
    数据库作用:
  • 存储数据的仓库,能够对数据进行条理化存储,方便后续查询、更新等操作
  • 能够更加快速便捷进行数据访问和处理

3.数据库类型

  1. 数据库可以从很多个维度进行划分。例如是关系型数据库还是非关系型数据库、是否是单机数据库还是分布式数据库等等
  2. 主要和常见的分类标准,划分是关系型数据库和非关系型数据库。
  3. 关系型数据库,可以简单类比Excel,为了客观地记录一类事物地信息,需要从很多个维度对这些事物进行数据描述,就需要建立多个表。一个数据库可以理解为一个excel文件,一个表就是一个excel地sheet。每个表中存储者从某个维度对这些事物地数据信息记录或者描述。例如一个人在电商公司数据库的信息,有基本的个人信息,有浏览网站和app的信息,有购买商品的信息,有收藏商品的信息。这么多维度的信息,一般都是放在不同的数据库表中进行存储。
  4. 非关系型数据库,这是由于数据本身各种各种,例如有些数据就是文件类型,就有文件型数据库。有些数据就是图片等数据,就会有对应类型的数据库来进行存储和管理。后续还会遇到各种各样的数据库,特别是一些小众或者应用相对狭窄的数据库类型。

4.SQL怎么使用?

4.1 使用前预备

  1. SQL是一种标准,ANSI(American National Standards Institute)制定的标准。顶级国家都是制定标准的国家,我们距离美国的国力差距还有很长的路要走,不骄傲,也不放弃,总会复兴的。
  2. 既然SQL是一种标准,那么就必然会发生遵守和不遵守这个标准和扩展这个标准的情况。所以SQL语句在很多数据库中并不是所有指令都能生效,但主要的指令会是一样的效果。如select、update、delete、insert、where
  3. 要使用SQL,首先需要安装一个数据库(相应的软件环境也需要安装好)。
  4. 数据库可以选择MySQL、microsoft access、sql server等等
  5. 这篇文章选择MySQL作为演示,
  6. MySQL在windows下安装,MySQL在windows下安装
  7. 关系型数据库都是以行跟列组合方式显示,跟excel形式是一样的。如下图
    SQL 知识点学习汇总,SQL学习这一篇就足够了_第1张图片
  8. 数据类型
  • 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 数据
  1. sql注释,单行和多行
# 这是单行注释

-- 这是单行注释

/*
这是多行注释
*/

4.2知识点分类

1.DDL,data definition language

1.1背景知识
  1. 这是数据定义语言,在关系型数据库中,数据库本身就是一个文件,例如我创建的一个数据库及一个数据库表,最终体现在windows中mysql安装目录下data目录下的一个文件夹
    SQL 知识点学习汇总,SQL学习这一篇就足够了_第2张图片
  2. 一个数据库,database,可以看做是一个特殊文件夹。里面的数据库表,注意是由2部分数据组成,表结构和表数据。表结构就是常说的schema,表数据就是metadata。
  3. 关系型数据库存储的数据都是结构化数据,也就是在数据表定义时,就规定了有哪些字段,每个字段什么类型(存储是以多少个字节存储,什么格式读取和写入)。知道这些信息后,读取文件的元数据信息时,就可以拿着这些信息来读取数据,确保数据和字段正确匹配,并且正确被读取出来。
  4. sql语言中大小写不敏感,所以关键字大小写都ok,不过传统程序员一般都会将SQL的关键字大写,其他小写以示区分。不过目前一些公司内部并没有严格约束,一般这些关键字要么全部大写,要么全部小写,本身还是以代码运行起来为准。
  5. 大家看一些视频,资料时,会发现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;
  1. 这里SQL语句命名有多种风格,一种是大驼峰法,就是数据库名字,数据库表名字,字段名都是大驼峰法。还有使用小驼峰法,我这里使用小写结合下划线的风格。具体使用看每个公司的规范和约束。
  2. 这里定义了person_id 、lastaname 、firstname 、address 、province 、city 6个字段,也就是数据库表中的列名。
  3. 这里涉及了几种数据类型,int就是32位整数,varchar就是可变字符串类型,这里指定字符串长度最长是255字节,comment就是字段注释,没错,sql中可以对每个字段加注释。
1.4.数据库规范
  1. 注意,sql正规的建表是需要遵守各个公司的规范。国内很多公司参考阿里巴巴的java开发手册,其中就有mysql的规范包括数据库建表规范。
    https://developer.aliyun.com/topic/java2020?spm=a2c6h.12873639.0.0.18e917d91067Lg
    SQL 知识点学习汇总,SQL学习这一篇就足够了_第3张图片
    SQL 知识点学习汇总,SQL学习这一篇就足够了_第4张图片

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就是或者的意思
SELECT * FROM tb_person
WHERE city='changsha'
AND person_id > 50;

SELECT * FROM tb_person
WHERE city='changsha'
OR province='hubei';
  • 针对查询结果做排序
-- 注意字符串也是可以排序的,ASC就是ascending,DESC就是descending,不过默认就是asc升序,所以升序时可以省略ASC

SELECT * FROM tb_person
ORDER BY firstname ASC;

SELECT * FROM tb_person
ORDER BY person_id DESC;
  • 针对查询结果,做条数限制,limit就是返回的结果数量限制为3条,这一点对于实际生产很有用,因为一个数据库中符合要求的数据可能成百上千条,但一般都只是关注前十,前三等数据,不需要全部数据。
SELECT *
FROM tb_person
LIMIT 3;
  • 针对字符串等类型字段做模糊匹配和查询,like关键词
# 查询数据库中city字段中,以字母c开头的所有数据并返回;%代表匹配0个或者多个字母
SELECT * FROM tb_person
WHERE city LIKE 'c%';

-- 查询所有数据中,字段province以字母i结尾的所有数据,并返回
SELECT * FROM tb_person
WHERE province LIKE '%i';

-- 查询所有数据中,字段address中包含changsha的数据,并返回
SELECT * FROM  tb_person
WHERE address LIKE '%changsha%';

-- 下划线_ 就是匹配一个字母,这里就是查找数据库中,字段address以某个字母开头,但后面内容是unanshengchangshashiyueluqu的数据,并返回
SELECT * FROM tb_person 
WHERE address LIKE '_unanshengchangshashiyueluqu';

/* regexp就是regex expression正则表达式的意思,可以在其中插入正则表达式进行处理
	这里的意思就是以^就是开头,[GFS]就是以这个中括号中字母的任意一个,合并起来就是以GFS中任意一个字母开头的值。数据库中firstname中,以GFS中任意一个字母开头的数据
*/
SELECT * FROM tb_person
WHERE firstname REGEXP  '^[GFS]';
  • 针对where限制条件,给出多个选择值,in
-- 检索数据库中每一条数据,对比字段lastname在('zhao','qian', 'sun', 'li', 'zhou', 'wu', 'zheng', 'wang')中的数据,并返回
SELECT * FROM tb_person
WHERE lastname IN ('zhao','qian', 'sun', 'li', 'zhou', 'wu', 'zheng', 'wang');
  • 针对where限制条件,给出连续的选择值
# 检索数据库中每一条数据,字段person_id [1, 20],大于等于1,并且小于等于20
SELECT * FROM tb_person
WHERE person_id BETWEEN 1 AND 20;
2.3修改数据

注意使用update语句,一定一定记得加where约束,否则会导致表中所有数据被更新,这是一个有风险的操作,请一定注意。

-- 记得加where约束条件
UPDATE tb_person
SET city='shanghai', person_id=7
WHERE province='shanghai';
2.4删除数据

在公司开发中,数据删除分为物理删除和逻辑删除,逻辑删除就是给数据一个标记如deleted为true,但是数据本身不会被从数据库或者文件中删除;物理删除就是真正的把数据删除掉,一般物理删除操作需要比较谨慎处理,因为数据才是公司最大财富

# 根据约束条件进行删除,注意做约束条件处理,这也是一个危险操作
DELETE FROM tb_person
WHERE person_id=5;
2.5数据库联结JOIN

LEFT JOIN、RIGHT JOIN、INNER JOIN、OUTER JOIN四大类,组合起来是大致7种场景。如果进行嵌套,则会有更复杂的情形。
数据库联结可以看作是数学里面的集合运算,交集、并集、差集以及它们的组合运用。
经典截图如下
SQL 知识点学习汇总,SQL学习这一篇就足够了_第5张图片
数据准备,常见的电商场景,用户信息和用户收藏记录

-- 用户信息表
create table if not exists tb_user(
uid int primarykey auto_increment not null comment '用户的id,一般使用算法生成如雪花算法',
name varchar(255) comment '用户名字,全名',
address varchar(255) comment '用户地址',
birthday date comment '用户生日,一般精确到天即可,注意时区处理'
)charset=utf8;


-- 用户收藏商品表
create table if not exists tb_collect(
collect_id int primarykey auto_increment not null comment '收藏记录id,每条数据都有一个唯一id',
uid int not null comment '用户id',
item_name varchar(255) comment '收藏的商品名',
item_id varchar(255) comment '收藏商品id',
collect_time datetime comment '收藏时间'
)charset=utf8;
  • inner join,内联,就是2张数据表,以on后面的联结条件对各自数据库表中数据做匹配得出的结果集合。在基于此结果集进行查询等操作
    如果2个表中有至少一个数据匹配条件,则返回行
# 从表tb_user和tb_collect中,找到符合tb_user.uid=tb_collect.uid的数据,再从这个结果集合中,分别检索tb_user.name, tb_user.birthday和tb_collect.item_name, tb_collect.datetime的数据,再展示出来
SELECT tb_user.name, tb_user.birthday, tb_collect.item_name, tb_collect.datetime
FROM tb_user
INNER JOIN tb_collect
ON tb_user.uid=tb_collect.uid;
  • left join,左联。从左表返回所有的行,即使右表中没有匹配的数据,以左表为主。
-- 将tb_user和tb_collect左联,tb_user为主。条件是tb_user.uid=tb_collect.uid。再从这个结果集中针对tb_user.name, tb_user.birthday以及 tb_collect.item_name, tb_collect.datetime做结果查询。
SELECT tb_user.name, tb_user.birthday, tb_collect.item_name, tb_collect.datetime
FROM tb_user
LEFT JOIN tb_collect
ON tb_user.uid=tb_collect.uid
ORDER BY tb_user.name DESC;
  • right join,右联。从右表返回所有的行,即使左表中没有匹配。
-- 将tb_user跟tb_collect右联,tb_collect为主。
SELECT tb_user.name, tb_user.birthday, tb_collect.item_name, tb_collect.datetime
FROM tb_user
RIGHT JOIN tb_collect
ON tb_user.uid=tb_collect.uid
ORDER BY tb_user.name DESC;
  • full join,全联接,生成笛卡尔积的操作,慎用。返回左表和右表中所有的行。
-- 这和会生成笛卡尔积,数据量会暴涨,所以对于笛卡尔积操作慎用,处分其中一个表较小,否则2个大表做笛卡尔积运算,内存可能溢出。
SELECT tb_user.name, tb_user.birthday, tb_collect.item_name, tb_collect.datetime
FROM tb_user
FULL JOIN tb_collect
ON tb_user.uid=tb_collect.uid
ORDER BY tb_user.uid DESC;
2.6 Union 合并select的结果集(join是针对数据库表做交、并、差集处理)

UNION 不能用于列出两个表中所有的uid。如果一些uid是同一个,每个uid只会列出一次。UNION 只会选取不同的值

-- 将2个select结果集合做合并,同时去掉重复的值
SELECT uid FROM tb_user
UNION
SELECT uid FROM tb_collect
ORDER BY uid;

# 将2个select的结果集合做合并,不管是否重复,都展示出来
SELECT uid FROM tb_user
UNION ALL
SELECT uid FROM tb_collect
ORDER BY uid;
2.7 数据库中的字段约束

这些是字段约束设置,可以通过 CREATE TABLE 语句定义,或者在表创建之后通过 ALTER TABLE 语句修改。

  • NOT NULL - 指示某列不能存储 NULL 值。
/*
NOT NULL 约束强制列不接受 NULL 值。
NOT NULL 约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。
*/

-- 建表时设置约束
CREATE TABLE tb_computer(
    id int NOT NULL comment '电脑的id',
    brand varchar(255) NOT NULL comment '电脑品牌',
    price decimal(10, 3) NOT NULL comment '电脑价格,使用decimal,不使用float和double',
    color varchar(30) comment '颜色'
)charset=utf8;

-- 建表后设置约束
ALTER TABLE tb_computer
MODIFY color varchar(30) NOT NULL;

-- 建表后去除约束
ALTER TABLE tb_computer
MODIFY color varchar(30) NULL;
  • UNIQUE - 保证某列的每行必须有唯一的值。
    UNIQUE 约束唯一标识数据库表中的每条记录。
    UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。
    PRIMARY KEY 约束拥有自动定义的 UNIQUE 约束。
    请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。
    在业务场景中,往往会给每一个事物一个独立的唯一的id,方便进行查找和处理。
CREATE TABLE tb_mobilephone
(
phone_id int NOT NULL comment '电话id',
brand varchar(255) NOT NULL comment '品牌',
color varchar(255) comment '颜色',
price decimal(10, 2) comment '价格',
UNIQUE (phone_id )
)charset=utf8;

-- 建表后,给某个字段单独加约束
ALTER TABLE tb_mobilephone
ADD UNIQUE (phone_id )

-- 建表后,给多个字段一起加约束,还可以对这个约束命名
ALTER TABLE tb_mobilephone
ADD CONSTRAINT constraint_id_name UNIQUE (phone_id , brand )

-- 撤销约束
ALTER TABLE tb_mobilephone
DROP INDEX constraint_id_name 
  • PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
    PRIMARY KEY 约束唯一标识数据库表中的每条记录。
    主键必须包含唯一的值。
    主键列不能包含 NULL 值。
    每个表都应该有一个主键,并且每个表只能有一个主键。
CREATE TABLE tb_cpu
(
cpu_id int NOT NULL comment 'cpu id',
brand varchar(255) NOT NULL comment '品牌',
model varchar(255) comment '型号',
gen int comment '第几代CPU',
price decimal(10, 2) comment '价格',
PRIMARY KEY (cpu_id )
)charset=utf8;

-- 添加主键,一般业务场景都不会随便修改主键。从流程上来说,数据库表前期建立就会遵循很严格的流程,保证字段数目,命名,主键等设置符合现在以及未来需求。而不是建立好之后修改主键,成本和代价是比较高的,一般不建议这么做。
ALTER TABLE tb_cpu
ADD PRIMARY KEY (cpu_id )

-- 撤销主键
ALTER TABLE tb_cpu
DROP PRIMARY KEY

注意,数据库是存储公司数据的仓库,是非常重要的资产。虽然mysql提供了很多功能,但一些危险性和敏感性操作,一般都不要去尝试,特别是在生产环境下。切记切记

  • 自增auto_increment,Auto-increment 会在新记录插入表中时生成一个唯一的数字。
CREATE TABLE tb_mouse
(
id int NOT NULL AUTO_INCREMENT comment '鼠标id',
color varchar(255) NOT NULL comment '颜色',
brand varchar(255) comment '品牌',
price decimal(10, 2) comment '价格',
model varchar(255) comment '型号',
PRIMARY KEY (ID)
)charset=utf8;

-- 让自增从100开始
ALTER TABLE tb_mouse AUTO_INCREMENT=100

默认地,AUTO_INCREMENT 的开始值是 1,每条新记录递增 1。SQL中数组等计数都是从1开始的,和生活中计数是一样的规则

  • FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
    一个表中的 FOREIGN KEY 指向另一个表中的 UNIQUE KEY(唯一约束的键)
    FOREIGN KEY 约束用于预防破坏表之间连接的行为。
    FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
CREATE TABLE tb_order
(
order_id int NOT NULL comment '订单id',
order_price decimal(10, 2) NOT NULL comment '订单价格',
uid int comment '用户id',
PRIMARY KEY (order_id) comment '设置主键',
FOREIGN KEY (uid) REFERENCES tb_user(uid) comment '设置外键'
)charset=utf8;

-- 表建立后,设置外键
ALTER TABLE tb_order
ADD FOREIGN KEY (uid)
REFERENCES tb_user(uid)

-- 表建立后,设置多个外键并给约束添加名字
ALTER TABLE tb_order
ADD CONSTRAINT constraint_order
FOREIGN KEY (uid)
REFERENCES tb_user(uid)

-- 表建立后,去除外键
ALTER TABLE tb_order
DROP FOREIGN KEY constraint_order
  • CHECK - 保证列中的值符合指定的条件。
    CHECK 约束用于限制列中的值的范围。
    如果对单个列定义 CHECK 约束,那么该列只允许特定的值。
    如果对一个表定义 CHECK 约束,那么此约束会基于行中其他列的值在特定的列中对值进行限制。
-- 检查cup_id必须大于0
CREATE TABLE tb_cup
(
cup_id int NOT NULL comment '杯子id',
brand varchar(255) NOT NULL comment '品牌',
color varchar(30) comment '颜色',
price decimal(10, 2) comment '价格',
CHECK (cup_id >0)
)charset=utf8;

-- 建表后,添加check约束
ALTER TABLE tb_cup
ADD CHECK (cup_id >0)

-- 建表后,添加check约束并命名
ALTER TABLE tb_cup
ADD CONSTRAINT check_cup CHECK (cup_id >0 AND color='black')

-- 建表后,删除约束
ALTER TABLE tb_cup
DROP CHECK check_cup 
  • DEFAULT - 规定没有给列赋值时的默认值。
    DEFAULT 约束用于向列中插入默认值。
    如果没有规定其他的值,那么会将默认值添加到所有的新记录。
CREATE TABLE tb_shoes
(
    shoes_id int NOT NULL comment '鞋子id',
    brand varchar(255) NOT NULL comment '品牌',
    color varchar(30) comment '颜色',
    price decimal(10, 2) comment '价格',
    size decimal(8, 2) DEFAULT 0,
    stock int comment '库存数量'
)charset=utf8;

-- 建表后,添加默认值
ALTER TABLE tb_shoes
ALTER brand SET DEFAULT 'xiaomi'

-- 建表后,删除字段默认值
ALTER TABLE tb_shoes
ALTER brand DROP DEFAULT

2.8 数据库索引

CREATE INDEX 语句用于在表中创建索引。
==在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。==在表中创建索引,以便更加快速高效地查询数据。无法看到索引,它们只能被用来加速搜索/查询。
==更新一个包含索引的表需要比更新一个没有索引的表花费更多的时间,这是由于索引本身也需要更新。==因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。

-- 创建一个简单索引,允许重复的值
CREATE INDEX index_price
ON tb_shoes(price);

-- 建立多个字段的索引值
CREATE INDEX s_index
ON tb_shoes(brand , price );

-- 在表上创建一个唯一的索引。不允许使用重复的值:唯一的索引意味着两个行不能拥有相同的索引值. 所以一般是针对unique字段进行索引建立
CREATE UNIQUE INDEX index_id
ON tb_shoes(shoes_id );
2.9 Drop、Alter指令
  1. Drop
  • 通过使用 DROP 语句,可以轻松地删除索引、表和数据库。
-- mysql删除索引
ALTER TABLE table_name DROP INDEX index_name;

-- mysql 删除数据库表
DROP TABLE table_name;

-- mysql删除数据库
DROP DATABASE database_name;

-- 删除数据库表中数据, TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。删除速度比delete更快
TRUNCATE TABLE table_name;

-- 删除数据库表中数据,delete操作会删除数据,但会保留表结构,并且在之后需要时可以回滚数据
DELETE TABLE table_name;
  1. Alter
  • ALTER TABLE 语句用于在已有的表中添加、删除或修改列。
-- 向表中添加列
ALTER TABLE table_name
ADD column_name datatype;

-- 删除表中的列
ALTER TABLE table_name
DROP COLUMN column_name;

-- 改变表中字段类型
ALTER TABLE table_name
MODIFY COLUMN column_name datatype;
2.10 数据库视图

视图是基于 SQL 语句的结果集的可视化的表。可以理解为编程语言当中的集合变量,例如代码执行中使用arraylist来承载中间过程中产生的数据集合。
视图总是显示最新的数据!每当用户查询视图时,数据库引擎通过使用视图的 SQL 语句重建数据.如果接触过计算型变量如swift语言,就可以有比较深的感受

  • 创建语法
CREATE VIEW view_name AS
SELECT column_name1, column_name2, column_name3
FROM table_name
WHERE condition;
-- 建立视图
CREATE VIEW [High Price Shoes] AS
SELECT price, color
FROM tb_shoes
WHERE price > 200;

-- 查询视图中数据
SELECT * FROM [High Price Shoes];
  • 更新语法
CREATE OR REPLACE VIEW view_name AS
SELECT column_name1, column_name2, column_name3
FROM table_name
WHERE condition;
-- 像视图中添加一列内容数据
CREATE VIEW [High Price Shoes] AS
SELECT price, color, brand
FROM tb_shoes
WHERE price > 200;
  • 删除语法
DROP VIEW view_name;
2.11 别名、日期、Null
  • 别名,就是给一个sql中的结果或者变量一个更短的名字或者更有含义的名字,类似于很多编程语言里面的变量名或者宏定义一样
-- 注意看这里,AS之前是原始的字段或者值,as之后就是别名。 很多时候也有省略的写法,但这样会带来困扰,建议还是加上as会让sql语句可读性高很多
SELECT firstname AS fn, city AS c
FROM tb_person;

-- 数据库表名也可以起别名,针对嵌套的sql语句,某个查询结果集也是可以起别名的
SELECT city
FROM tb_person AS person;
  • 日期
    在实际生产中,如何记录时间是一件很头疼的事情。时间日期有不同的格式,有时区,有时间制度如12小时和24小时制等等不一而足。
    处理日期时,最难的任务恐怕是确保所插入的日期的格式,与数据库中日期列的格式相匹配。

sql自带的日期函数,可以返回日期相关的值

  1. NOW() 返回当前的日期和时间
  2. CURDATE() 返回当前的日期
  3. CURTIME() 返回当前的时间
  4. DATE() 提取日期或日期/时间表达式的日期部分
  5. EXTRACT() 返回日期/时间的单独部分
  6. DATE_ADD() 向日期添加指定的时间间隔
  7. DATE_SUB() 从日期减去指定的时间间隔
  8. DATEDIFF() 返回两个日期之间的天数
  9. DATE_FORMAT() 用不同的格式显示日期/时间

MySQL中日期数据类型

DATE - 格式:YYYY-MM-DD
DATETIME - 格式:YYYY-MM-DD HH:MM:SS
TIMESTAMP - 格式:YYYY-MM-DD HH:MM:SS
YEAR - 格式:YYYY 或 YY

-- 不涉及时分秒具体时间的日期比较其实很简单
SELECT * FROM tb_order WHERE datetime='20018-12-1'
  • Null
    NULL 值代表遗漏的未知数据。默认地,表的列可以存放 NULL 值。无法比较 NULL 和 0;它们是不等价的。这一点在很多编程语言都是通用的
    IS NULL 和 IS NOT NULL是2个操作符,可以用来判断
-- 在where条件中判断值是否为null
SELECT price, brand, FROM tb_shoes
WHERE brand IS NULL;

-- 在where条件中判断值是否不是null
SELECT price, brand, FROM tb_shoes
WHERE brand IS NOT NULL;
2.12 数据库函数

函数可以大致分为2类,SQL Aggregate 函数(计算从列中取得的值,返回一个单一的值)SQL Scalar 函数(基于输入值,返回一个单一的值)。
SQL Aggregate 函数

  1. AVG() - 返回平均值
  2. COUNT() - 返回行数
  3. FIRST() - 返回第一个记录的值
  4. LAST() - 返回最后一个记录的值
  5. MAX() - 返回最大值
  6. MIN() - 返回最小值
  7. SUM() - 返回总和
  • AVG() 平均数函数
SELECT AVG(column_name) FROM table_name;

-- 获取所有鞋子录入到数据库中所有价格的平均数
SELECT AVG(price) FROM tb_shoes;
  • COUNT()函数, 返回匹配指定条件的行数。
SELECT COUNT(column_name) FROM table_name;

-- 返回数据库中所有记录的条数
SELECT COUNT(*) FROM table_name;

-- 返回指定列不同值的条数,DISTINCT 去重
SELECT COUNT(DISTINCT column_name) FROM table_name;
  • FIRST() 函数, 返回指定的列中第一个记录的值。
-- mysql中,使用以下方式可以获取first()函数一样的效果,虽然Mysql本身不支持这个first()函数
SELECT column_name FROM table_name
ORDER BY column_name ASC
LIMIT 1;
  • LAST() 函数, 返回指定的列中最后一个记录的值。
-- 最后一条的化,直接倒序排列,再取第一条也是一样的效果。mysql不支持这个函数
SELECT column_name FROM table_name
ORDER BY column_name DESC
LIMIT 1;
  • MAX() 函数返回指定列的最大值。
SELECT MAX(column_name) FROM table_name;
  • MIN() 函数返回指定列的最小值。
SELECT MIN(column_name) FROM table_name;
  • SUM() 函数, 返回数值列的总数。
SELECT SUM(column_name) FROM table_name;
  • GROUP BY 语句用于结合聚合函数,根据一个或多个列对结果集进行分组。
-- 物以群分,根据某个字段对数据做分类
SELECT brand, price
FROM tb_shoes
WHERE color = 'black'
GROUP BY brand;
  • HAVING() , 过滤条件,可以和函数组合使用,这一点是where关键词的补充.
    SQL 中增加 HAVING 原因是,WHERE 关键字无法与聚合函数一起使用。HAVING 子句可以让我们筛选分组后的各组数据。
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value;
  • EXISTS(), 用于判断查询子句是否有记录,如果有一条或多条记录存在返回 True,否则返回 False。
SELECT column_name(s)
FROM table_name
WHERE EXISTS
(SELECT column_name FROM table_name WHERE condition);
  • FINULL()
-- 检索数据库中的鞋子数量乘以单价得到总价,品牌
SELECT brand, price * IFNULL(stock, 0)
FROM tb_shoes;

SQL Scalar 函数

  1. UCASE() - 将某个字段转换为大写
  2. LCASE() - 将某个字段转换为小写
  3. MID() - 从某个文本字段提取字符,MySql 中使用
  4. SubString(字段,1,end) - 从某个文本字段提取字符
  5. LEN() - 返回某个文本字段的长度
  6. ROUND() - 对某个数值字段进行指定小数位数的四舍五入
  7. NOW() - 返回当前的系统日期和时间
  8. FORMAT() - 格式化某个字段的显示方式
  • UCASE() 函数把字段的值转换为大写。
SELECT UCASE(column_name) FROM table_name;
  • LCASE() 函数把字段的值转换为小写。
SELECT LCASE(column_name) FROM table_name;
  • MID() 函数用于从文本字段中提取字符。
-- 从brand字段中提取前四个字符,就是1--4且包含,注意sql计数从1开始
SELECT MID(brand,1,4) AS short_brand
FROM tb_shoes;
  • LEN() 函数返回文本字段中值的长度。
SELECT LENGTH(column_name) FROM table_name;
  • ROUND() 函数用于把数值字段舍入为指定的小数位数。
SELECT ROUND(column_name,decimals) FROM table_name;
  • NOW() 函数返回当前系统的日期和时间。
SELECT NOW() FROM table_name;
  • FORMAT() 函数用于对字段的显示进行格式化。
SELECT FORMAT(column_name,format) FROM table_name;

4.SQL注意事项

  1. SQL语句有自己的格式和语法,建议在数据库软件或者文本工具中写好后,进行校验,再执行,这样可以降低出错概率。如NotePad++、Navicat下都可以写SQL语句,并且还会有相应关键词提示。
    如下,notepad++的语言中设置语言是sql,则会有相应颜色的关键字提示
    SQL 知识点学习汇总,SQL学习这一篇就足够了_第6张图片
  2. 数据库是存储公司业务数据的重要载体,一般公司环境划分开发环境、测试环境、预发布环境、生产环境,所有针对生产环境的操作一般都需要经过前面的开发、测试、预发布环境验证后才能应用于生产环境。SQL数据库操作也是如此,规范一些的公司会有专门的DBA部门负责校验和检查代码中的sql操作语句,防止出现危险操作和提升sql性能。

你可能感兴趣的:(数据库,mysql,SQL,sql,数据库,mysql)