文章目录
前言
- 一晃,24年了,正式参加工作也有两年多了,从一个懵懵懂懂的菜鸟,到现在负责提供业务数据支撑,从各个工作阶段也使用过不同的数据库,现在项目上统一使用的微软的SQL server ,回想起来,第一次接触SQL server 的时候,还是在学校的数据库基础理论课程上,那时候,操作的还是SQL server 2008 ,2012,当时感觉SSMS还是古老的界面,后来工作了,也使用过2016,2019,直到现在使用SQL server 2022 …
- 直到最近准备跑路了,整理笔记的时候,翻出一篇篇关于SQL server的学习记录,还是在学校学习的时候留下的,我的校园时代呀
SQL Server简介
-
怎么安装SQL server ,到处都是安装教程,看一下登录界面吧
-
一张简单的登录页面图,重点是看这张,登录方式第一种呢,是用windows 身份验证,第二种呢,使用账号密码,另外的一些呢,主要是微软的Azure 的一些东西,我不太了解这块,但是链接我放这了,有兴趣可以了解一下https://azure.microsoft.com/zh-cn/explore/
-
登录OK后,可以先把sa账号打开,默认sa账号是禁止登录的,怎么打开sa账号,网上随便找教程,这个就不啰嗦了,重点来看这个SQL Sever 系统数据库(我这边换电脑了,本地新装的数据库,可不敢拿业务数据库瞎搞,之前听说有个倒霉蛋拿业务数的一些存储以及部分交易过账的数据表搞,被总部那边判定为故意泄露数据,直接GG,现在已经进去吃饭了)
-
master 数据库记录了所有的 SQL Server 数据库系统的系统级信息,如用户帐户,配置设置,并存在所有其他数据库信息。
-
model 数据库是一个模板数据库。每当创建一个新的数据库(包括系统数据库的TempDB),会创建一个以 Model 数据库为副本数据库,并更改成你创建数据库时所用的名称。
-
msdb 数据库是 SQL Server 代理的数据库,用于配置警报使用 SQL Server 代理和预定作业等。
-
tempddb 数据库是由 SQL Server 用于暂时存储数据的,这其中包含所有临时表,临时存储过程,并通过 SQL Server 生成任何其他临时存储需求。
数据库的基本概念
- 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库
- 数据库的本质是一个文件系统,还是以文件的形式,将数据保存在电脑上
- 虽然可以将数据存储在普通文件中,但是在普通文件中读写数据速度相对较慢
- 使用关系型数据库管理系统(RDBMS)来存储和管理的大数据量,关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据
为什么使用数据库?
使用数据库存储数据, 用户可以非常方便对数据库中的数据进行增加, 删除, 修改及查询操作。
数据存储方式的比较:
存储方式 | 优点 | 缺点 |
---|---|---|
内存 | 速度快 | 不能够永久保存,数据是临时状态的 |
文件 | 数据是可以永久保存的 | 使用IO流操作文件, 不方便 |
数据库 | 1.数据可以永久保存;2.方便存储和管理数据;3.使用统一的方式操作数据库(SQL) | 占用资源,有些数据库需要付费(比如Oracle) |
比较常见的数据库
数据库 | 介绍 |
---|---|
MySql | 开源免费的数据库,环境搭建简单 |
Oracle | 收费的大型数据库,Oracle公司的核心产品。 |
SQL Server | MicroSoft 微软公司收费的中型的数据库。 |
数据库管理系统
- 数据库管理系统(DataBase Management System,DBMS):指一种操作和管理维护数据库的大型软件。
- SSMS就是一个数据库管理系统软件, 安装了SQL Server的电脑称为数据库服务器.
- 数据库管理系统的作用:用于建立、使用和维护数据库,对数据库进行统一的管理。
- 数据库管理系统、数据库 和表之间的关系:SQL Server中管理着很多数据库,在实际开发环境中 一个数据库一般对应了一个的应用,数据库当中保存着多张表,每一张表对应着不同的业务,表中保存着对应业务的数据。
- 数据以表格的形式出现,每行为各种记录名称,每列为记录名称所对应的数据域,多个行和列组成表单,多个表单组成database数据库
- 数据库中以表为组织单位存储数据,数据表中的每个字段都有对应的数据类型。
RDNMS 常见知识点
- 数据库: 数据库是一些关联表的集合。
- 数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格
- 列: 一列(数据元素) 包含了相同的数据
- 行:一行(=元组,或记录)是一组相关的数据,
- 冗余:存储两倍数据,冗余可以使系统速度更快
- 主键:主键是唯一的。一个数据表中只能包含一个主键。可以使用主键来查询数据
- 外键:外键用于关联两个表。
- 复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引
- 索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构
- 参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。
SQL的概念
- 结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
SQL的作用
- SQL是所有关系型数据库的统一查询规范,不同的关系型数据库都支持SQL
- 所有的关系型数据库都可以使用SQL,但是不同数据库之间的SQL 有一些区别
SQL的通用语法
- SQL语句可以单行 或者 多行书写,以分号 结尾 ;
- 可以使用空格和缩进来增加语句的可读性。
- MySql中使用SQL不区分大小写,一般关键字大写,数据库名 表名列名 小写。
SQL的分类
分类 | 说明 |
---|---|
数据定义语言 | 简称DDL(Data Definition Language),用来定义数据库对象:数据库,表,列 |
数据操作语言 | 简称DML(Data Manipulation Language),用来对数据库中表的记录进行更新。 |
数据查询语言 | 简称DQL(Data Query Language),用来查询数据库中表的记录。 |
数据控制语言 | 简称DCL(Date Control Language),用来定义数据库的访问权限和安全级别,及创建用户。 |
DDL操作数据库
-
创建数据库命令
-
选择数据库命令
命令 | 说明 |
---|---|
use 数据库 | 切换数据库 |
- 删除数据库命令:
DDL 操作数据表
- SQL Server 中常见的数据类型:
- char类型与 varchar类型,都对应了 Java中的字符串类型,区别在于:char类型是固定长度的: 根据定义的字符串长度分配足够的空间。varchar类型是可变长度的: 只使用字符串长度所需的空间
- char类型适合存储固定长度的字符串,比如 密码 ,性别一类
- varchar类型适合存储 在一定范围内,有长度变化的字符串
类型 | 描述 |
---|---|
int | 整型 |
double | 浮点型 |
char/varchar | 字符串型 |
date | 日期类型,给是为 yyyy-MM-dd ,只有年月日,没有时分秒 |
datetime | 日期类型,给是为 yyyy-MM-dd HH:mm:ss,年月日时分秒 |
创建表
CREATE TABLE 表名(
字段名称1 字段类型(长度),
字段名称2 字段类型 注意 最后一列不要加逗号
);
创建商品分类表:
分类ID :cid ,为整型,分类名称:cname,为字符串类型,指定长度20
-- 创建表
CREATE TABLE category(
cid INT,
cname VARCHAR(20)
);
删除表
命令 | 说明 |
---|---|
drop table 表名; | 删除表(从数据库中永久删除某一张表) |
drop table if exists 表名; | 判断表是否存在, 存在的话就删除,不存在就不执行删除 |
-- 直接删除 test1 表
DROP TABLE test1;
-- 先判断 再删除test2表
DROP TABLE IF EXISTS test2;
修改表
修改表名:rename table 旧表名 to 新表名
需求: 将category表 改为 category3
RENAME TABLE category TO category3;
修改表的字符集:alter table 表名 character set 字符集
需求: 将category表的字符集 修改为gbk
alter table category character set gbk;
向表中添加列, 关键字 ADD:
alert table 表名 add 字段名称 字段类型
需求: 为分类表添加一个新的字段为 分类描述 cdesc varchar(20)
ALTER TABLE category ADD cdesc VARCHAR(20);
修改表中列的 数据类型或长度 , 关键字 MODIFY
alter table 表名 modify 字段名称 字段类型
需求:对分类表的描述字段进行修改,类型varchar(50)
ALTER TABLE category MODIFY cdesc VARCHAR(50);
修改列名称 , 关键字 CHANGE:
alter table 表名 change 旧列名 新列名 类型(长度);
需求: 对分类表中的 desc字段进行更换, 更换为 description varchar(30)
ALTER TABLE category CHANGE cdesc description VARCHAR(30);
删除列 ,关键字 DROP:alter table 表名 drop 列名;
需求: 删除分类表中description这列
ALTER TABLE category DROP description;
DML 操作表中数据
-
SQL中的DML 用于对表中的数据进行增删改操作
-
插入数据,语法格式:
insert into 表名 (字段名1,字段名2...) values(字段值1,字段值2...);
-
插入数据
方式一:插入全部字段, 将所有字段名都写出来 INSERT INTO student (sid,sname,age,sex,address) VALUES(1,'孙悟空',20,'男','花果山'); 方式2: 插入全部字段,不写字段名 INSERT INTO student VALUES(2,'孙悟饭',10,'男','地球'); 方式3:插入指定字段的值 INSERT INTO category (cname) VALUES('白骨精');
- 插入数据时,值与字段必须要对应,个数相同&数据类型相同
- 值的数据大小,必须在字段指定的长度范围内
- varchar char date类型的值必须使用单引号,或者双引号 包裹。
- 如果要插入空值,可以忽略不写,或者插入null
- 如果插入指定字段的值,必须要上写列名
-
更改数据:
- 不带条件的修改:
update 表名 set 列名 = 值
- 带条件的修改:
update 表名 set 列名 = 值 [where 条件表达式:字段名 = 值 ]
- 不带条件修改,将所有的性别改为女(慎用!!)
UPDATE student SET sex = '女';
,WHERE 子句指定更新条件,如果忘记WHERE语句,则可能导致表中所有数据 - 带条件的修改,将sid 为3的学生,性别改为男:
UPDATE student SET sex = '男' WHERE sid = 3;
- 一次修改多个列, 将sid为 2 的学员,年龄改为 20,地址改为 北京:
UPDATE student SET age = 20,address = '北京' WHERE sid = 2;
- 不带条件的修改:
-
删除数据
- 删除所有数据:
delete from 表名
- 指定条件 删除数据:
delete from 表名 [where 字段名 = 值]
- 删除 sid 为 1 的数据:
DELETE FROM student WHERE sid = 1;
- 删除所有数据:
DELETE FROM student;
- 删除 sid 为 1 的数据:
- 如果要删除表中的所有数据,有两种做法
- delete from 表名; 不推荐. 有多少条记录 就执行多少次删除操作. 效率低
- truncate table 表名: 推荐. 先删除整张表, 然后再重新创建一张一模一样的表. 效率高:
truncate table student;
- 删除所有数据:
DQL 查询表中数据
-
查询不会对数据库中的数据进行修改.只是一种显示数据的方式 SELECT, SELECT语句的结果称为结果集,它是行列表,每行由相同数量的列组成
-
. 使用(*)可能会返回不使用的列的数据,在mysql数据库服务器和应用程序之间产生不必要的I/O磁盘和网络流量。
-
如果明确指定列,则结果集更可预测并且更易于管理。 当使用星号(*)并且有人通过添加更多列来更改表格数据时,将会得到一个与预期不同的结果集。
-
使用星号(*)可能会将敏感信息暴露给未经授权的用户。
-
语法格式:
select 列名 from 表名
-
查询emp中的 所有数据:
SELECT * FROM emp; -- 使用 * 表示所有列
-
查询emp表中的所有记录,仅显示id和name字段:
SELECT eid,ename FROM emp;
-
将所有的员工信息查询出来,并将列名改为中文
别名查询,使用关键字 as# 使用 AS关键字,为列起别名 SELECT eid AS '编号', ename AS '姓名' , sex AS '性别', salary AS '薪资', hire_date '入职时间', -- AS 可以省略 dept_name '部门名称' FROM emp;
-
查询一共有几个部门,使用去重关键字 distinct
-- 使用distinct 关键字,去掉重复部门信息 SELECT DISTINCT dept_name FROM emp;
-
将所有员工的工资 +1000 元进行显示,运算查询 (查询结果参与运算)
SELECT ename , salary + 1000 FROM emp;
-
-
条件查询:如果查询语句中没有设置条件,就会查询所有的行信息,在实际应用中,一定要指定查询条件,对记录进行过滤
语法格式 select 列名 from 表名 where 条件表达式 先取出表中的每条数据,满足条件的数据就返回,不满足的就过滤掉
-
比较常见运算符
-
比较运算符
运算符 说明 > < <= >= = <> != 大于、小于、大于(小于)等于、不等于 BETWEEN …AND… 显示在某一区间的值,例如: 2000-10000之间: Between 2000 and 10000 IN(集合) 集合表示多个值,使用逗号分隔,例如: name in (悟空,八戒) ,in中的每个数据都会作为一次条件,只要满足条件就会显示 LIKE ‘%张%’ 模糊查询 IS NULL 查询某一列为NULL的值, 注: 不能写 = NULL -
逻辑运算符
运算符 说明 And && 多个条件同时成立 Or 多个条件任一成立 Not 不成立,取反。 -
模糊查询 通配符
-
通配符 | 说明 |
---|---|
% | 表示匹配任意多个字符串, |
_ | 表示匹配 一个字符, |
SQL Server 数据库快照
-
看这个数据库快照功能,官方的解释是:
数据库快照是数据库(称为“源数据库”)的只读静态视图。在创建时,每个数据库快照在事务上都与源数据库一致。在创建数据库快照时,源数据库通常会有打开的事务。在快照可以使用之前,打开的事务会回滚以使数据库快照在事务上取得一致。
-
先创建一个test的数据库,再对制做一个test_shot快照,但是快照是静态的,如果修改test数据库,test_shot快照不会改变,如果以后源数据库损坏了,便可以将源数据库恢复到它在创建快照时的状态
-
使用快照恢复数据库:
use master; GO RESTORE DATABASE test from DATABASE_SNAPSHOT = 'test_shot'; GO use test; select * from dbo.SQLTest; go use test; select * from dbo.SQLTest; drop database test_shot; // 删除快照
-
PS:数据库快照的典型应用场景:
- 维护历史数据以生成报表。
- 使用为了实现可用性目标而维护的镜像数据库来卸载报表。
- 使数据免受管理失误所带来的影响。