SQL Sever 命令
基础注意事项
- 关键字和函数名称通常不区分大小写,但保持一致的编码风格有助于提高代码的可读性和跨系统兼容性
- 字段名通常不需要引号。如果字段名包含空格、特殊字符,或者是 SQL 保留字,需要用反引或双引号包围
选择数据库
- 在进行表操作之前,确保已经切换到了正确的数据库。
- 例如,切换到
educ
数据库:USE educ;
- 例如,切换到
分割
- 字段之间使用逗号
,
分隔。 - 多条 SQL 语句之间使用分号
;
分隔。
注释
/* 多行注释 */
-- 单行注释
创建数据库
create database 数据库名
创建数据库之前需要在相应盘符建立文件夹
创建educ数据库
create database educ --创建数据库使用create
--on 定义数据文件
--primary 指定主文件,若没有关键字 则命令中第一个文件将成为主文件
on primary
(name=educ,size=5mb,maxsize=100mb,filegrowth=2mb,filename='d:\教学管理\educ.mdf')
log on --定义日志文件
(name=educ_log,size=2mb,maxsize=500mb,filegrowth=2mb,filename='d:\教学管理\educ_log.ldf')
逻辑名称,大小,最大容量,每次增长,存储位置及物理名称
on 定义数据文件
primary 指定主文件,若没有关键字 则命令中第一个文件将成为主文件
创建test数据库
filegroup的上一行末尾需要加 “,”
create database test
on primary
(name=test,size=5mb,maxsize=unlimited,filegrowth=10%,filename='d:\教学管理\test.mdf'),
filegroup fg --指定改文件所属地文件组
(name=test2,size=2mb,maxsize=200mb,filegrowth=2mb,filename='d:\教学管理\test2.ndf')
log on
(name=test_log,size=2mb,maxsize=200mb,filegrowth=1mb,filename='d:\教学管理\test_log.ldf')
修改数据库
alter database 数据库名
新增文件
add file 文件名
如若新增的数据文件需要添加到fg组中,则需先创建fg组
alter database educ
add file --增加数据文件
(name=educ2,size=5mb,maxsize=500mb,filegrowth=10%,filename='d:\教学管理\educ2.ndf') to filegroup fg
移除文件/文件组
remove 文件/组名
,移除组之前要清空组中的所有文件
alter database educ
remove file educ2 --移除文件
alter database educ
remove filegroup fg --移除组
修改文件
modify 文件名
,只可小改大,不可大改小
alter database educ
modify file
(name=educ,size=6mb,maxsize=unlimited,filegrowth=10%,filename='d:\教学管理\educ.mdf')
修改数据库名
sp_renamedb '旧名','新名'
可能出现的报错
“无法用排他锁锁定数据库”
重命名数据库时提示 “无法用排他锁锁定数据库”
右键想要重命名的数据库–属性–选项–限制访问选择–单用户模式
数据类型
类型 | 用途 |
---|---|
int | 整型 |
bigint | 整形 |
float | 浮点型 |
double | 浮点型 |
decimal | 浮点型 可指定总的数字位数(精度)和小数点后的位数(标度) |
datetime | 日期类型(data是日期 time是时间) |
timestamp | 日期类型(可存储时间戳) |
char | 定长字符(存储不满则补空格) |
varchar | 不定长字符 |
text | 大文本,存储长的字符内容 |
blob | 字节数据类型,存储图片、音频等文件 |
一个汉字占两个字符,即char(2)
创建表
在标准的 SQL 语句中,如果字段名在所有涉及的表中都是唯一的,那么可以不用指定表名。
但如果存在同名字段或为了提高可读性,最佳做法是指定字段所属的表名。
create table 表名 (
字段名 类型 约束(主键,非空,唯一,默认值) 属性(自增, 描述),
字段名 类型 约束(主键,非空,唯一,默认值) 属性(自增, 描述),
)编码,存储引擎
约束和属性都是可选的
存在则不创建create table if not exists 表名
约束
- PRIMARY KEY:主键约束。用于唯一标识表中的每一行。一个表只能有一个主键,主键字段的值必须是唯一的,且不能为NULL。
- FOREIGN KEY:外键约束。用于建立两个表之间的关系。外键字段的值必须是另一个表的主键字段的值,或者是NULL。
- UNIQUE:唯一性约束。保证某一列的每行都必须有唯一的值。与主键不同,唯一约束允许有NULL值。
- NOT NULL:非空约束。确保某一列不能有NULL值。
- CHECK:检查约束。用于确保某一列中的值满足特定条件。例如,可以用CHECK约束来确保年龄字段的值不小于18。
- DEFAULT:默认值约束。用于在未指定值的情况下为列提供默认值。
属性
- AUTO_INCREMENT: 用于在插入新记录时自动递增字段的值,用于自动生成唯一的标识符
- COMMENT: 用于为字段或表添加描述性文本,不影响字段的功能或数据库的操作
编码(字符集)
DEFAULT CHARSET=utf8
CHARACTER SET utf8
编码或字符集决定了表中存储的字符串数据如何被表示和存储。常见的字符集包括:
- UTF-8:这是最常用的字符集,支持多种语言,包括英语、中文、日文等。它对于国际化的应用是一个很好的选择。
- Latin1:这是MySQL的默认字符集,也称为ISO-8859-1,主要用于西欧语言。
存储引擎
ENGINE=InnoDB
存储引擎决定了MySQL如何存储和处理表中的数据。不同的存储引擎提供不同的功能,如事务处理、全文索引等。常见的存储引擎包括:
- InnoDB:这是MySQL的默认存储引擎,支持事务处理、外键等。适合大多数应用场景。
- MyISAM:这是早期的默认存储引擎,不支持事务处理,读取速度较快,但在并发写入时性能较差。
创建stu表
create table stu (
sid char(6) not null primary key, --创建字段
sname char(6) not null,--创建字段
xb char(2),--创建字段
csrq date
) --创建字段
创建cj表
create table cj (
sid char(6) not null,
cid char(6)not null,
fs decimal(4,1)
)
创建websites表
drop teble if exist 'websites';
create table 'websites' (
id int(11) not null auto_increment,
name char(20) not null default '' comment '站点名称',
url varchar(255) not null default '0' comment 'alexa 排名',
sal double comment '广告收入',
country char(10) not null default '' comment '国家',
primary key (id)
) engine=InnoDB default charset=utf8;
可能出现的错误
创建表后在最左侧对象资源管理器中看不到
点击有修改更新的数据库后,点击刷新,再展开就可以看到了
无法保存更改后的表设计视图
工具菜单 – 选项 – Designers(设计器) – 阻止保存要求重新创建表的更改 – 取消勾选
更改编辑前n行数据
工具菜单 – 选项 – SQL Server对象资源管理器 – 命令 – “表和视图选项” – 选择前’行命令的值
增加不了约束,发生冲突
可能因为表中对应字段有数据
把相关数据表的数据删除掉,再执行添加约束语句
https://blog.csdn.net/weixin_46218781/article/details/105934703
增
字段数量和值数量要保持一致,不写字段默认即全部字段
insert into 表名(字段, 字段) values(值, 值)
insert into 表明 values(值, 值),(值, 值),(值, 值)
向stu表中添加数据
insert into stu(SID,sname)--指定字段
values(123,'haha'); --字段内容
向websites表中添加数据
insert into websites(name, url, alexa, sal, country)
value('腾讯', 'http://www.qq.com',18,1000,'CN');
添加数据练习
假定有一个cj表格
使用insert向其中指定字段添加内容
再使用insert select将cj中查找到的制定内容插入到新建的bk表中
向 cj 表中添加内容
insert into cj (sid,cid,score) values(961109,'G102',88)
insert into cj (sid,cid) values(961109,'G102')
insert into cj values(96110,'G102',89)
创建 bk 表格
create table bk
(sid char(6) not null,
cid char(20) not null,
score int)
insert…select 查询查找
不用括号
insert into bk
select sid,cid,score
from cj
where score<60
--把cj中查找到所有score<60的数据插入到bk中
删
删除表
drop table 表名
以防表格不存在
drop table if exist 表名
删除表格中数据
delete from 表名 where 条件
删除test表中一条数据
delete from test where sid='123'
清空表格所有数据
delete from test
改
update
命令
用于修改表中的现有数据。
- 基本用法:
update 表名 set 列1=值1, 列2=值2 where 条件;
- 示例:
update stu set specialty='计算机科学与技术' where name = '张三'; update stu set specialty='母猪养殖', sex='男' where name = '王小二';
alter table
命令
用于修改表的结构,包括列操作和约束操作。
列操作
- 删除列:
alter table 表名 drop column 列名;
- 添加列:
alter table 表名 add column 列名 数据类型;
- 修改列类型:
alter table 表名 modify column 列名 新数据类型;
约束操作
- 添加主键:
alter table 表名 add constraint 约束名 primary key (列名);
- 添加唯一约束:
alter table 表名 add constraint 约束名 unique (列名);
- 添加默认值:
alter table 表名 add constraint 约束名 default 默认值 for 列名;
- 添加检查约束:
alter table 表名 add constraint 约束名 check (条件);
- 删除约束:
alter table 表名 drop constraint 约束名;
通配符
*
:用于代替任意数量的字符,主要用于LIKE
子句中。?
:在某些数据库系统中,用于代替单个字符,但在标准SQL中使用_
来匹配单个字符。
查找添加
table的数据来源可以是select的子查询
有两个结构相同的表stu、jaj
stu有数据,而jaj无数据
jaj表结构
create table jaj (
sid char(6) not null,
sname char(8) not null,
sex char(2),
brithday date,
specialty char(20)
)
拷贝数据到 jaj 表中
insert jaj
select sid,sname,sex,birthday,specialty
from student
where specialty='计算机'
查
SELECT
查询基本操作
- 投影查询(SELECT子句):选择特定的列。
- 列函数:
COUNT
,SUM
,AVG
,MAX
,MIN
- 列函数:
- 保存查询(INTO子句):将查询结果保存到新表。
- 连接查询(FROM子句):结合多个表的数据。
- 选择查询(WHERE子句):基于条件筛选数据。
- 分组查询(GROUP BY子句):根据指定列对数据进行分组。
- 限定查询(HAVING子句):对分组后的结果进行条件过滤。
- 排序查询(ORDER BY子句):根据一个或多个列对结果排序。
SQL运算符
- 关系运算符:
=
,<>
,>
,<
,>=
,<=
用于条件比较。 - 逻辑运算符:
NOT
,AND
,OR
用于组合条件。 - 范围运算符:
BETWEEN ... AND
用于指定值的范围。 - 模式匹配运算符:
LIKE
用于字符串模式匹配。 - 列表运算符:
IN
用于比较一组值。 - 空值判断符:
IS NULL
用于检查空值。 - 非空判断:
IS NOT NULL
注意事项
- 表和字段的引用:使用
表名.字段名
来引用特定表的字段,字段之间用逗号,
分隔。 - 零值与空值:在SQL中,
0
不是空值(NULL
)。 - 函数中的字段引用:在函数中使用字段时,通常不需要指定表名,除非在JOIN操作中引用多个表的同名字段。
select练习
查询全部字段
select * from 表名
实际开发中尽量少使用
select *
这样的操作
查询单一字段
从student中查询sex字段
select sex from student;
去除重复项
从student中查询sex,去除重复项
select distinct sex from student
显示前n条数据
-- sql server
select top n * from 表名;
-- mysql
select * from 表名 limit n; -- 从第0条(下标从0开始)开始,查看n条
select * from 表名 limit n, x; -- 从第n条(下标从0开始)开始,查看x条数据
更改查询结果字段名
使用AS关键字或直接空格来为查询结果的字段指定别名:
SELECT 字段名 AS 别名 FROM 表名;
SELECT 字段名 别名 FROM 表名;
通过学分计算出学时,并生成单独的字段并命名为学时
select top 5 cid,cname,cerdit '学分' --要显示的字段
STR(cerdit*18,3,0) as '学时 '--新字段转为str类型,宽度为3,小数位为0
from course --数据来自course
连接查询
两张及以上不同的表进行查询时,需要连接。连接可以使用WHERE或FROM子句实现。
使用where进行连接
select student.sid,sname,specialty,course.cname,cj.score
from student,course,cj
where student.sid=cj.sid and course.cid=cj.cid and course.cname='计算机基础' and score>60
使用from进行连接
select student.sid,sname,specialty,course.cname,cj.score
from student inner join (course inner join cj on course.CID=cj.CID) on student.SID=cj.SID
where course.cname='计算机基础' and score>60
where 过滤
where子句用于过滤记录,支持逻辑表达式
查询性别为女,专业为计算机的学生
select * from 学生情况
where 性别='女' and 专业='计算机'
group by 分组
当SELECT中包含多个字段和聚合函数时,且需要使用GROUP BY时,除聚合函数外的所有字段都应放在GROUP BY子句中。
按姓名分组统计人数
SELECT 性别, COUNT(学号) AS 人数, AVG(年龄) AS 平均年龄
FROM 学生情况
GROUP BY 性别;
order by 排序
order 列名 asc/dese
- asc 升序 默认
- dese 降序
order必须放在group by后面
select student.sid,sname,SUM(score) as 总分
from student,cj
where student.SID = cj.SID
group by student.sid,sname
order by SUM(score) desc
可以多依据排序,先根据总分降序再根据学号升序
select student.sid,sname,score
from student,cj
where student.SID = cj.SID
order by score desc, student.sid asc
having 过滤
用于在分组查询中设置条件
- 应用时机不同:
WHERE
子句在数据分组之前应用,即它过滤的是原始数据。而HAVING
子句在数据分组和聚合之后应用,即它过滤的是分组后的聚合结果 - 用途不同:
WHERE
子句用于过滤原始数据集中的行,而HAVING
子句用于过滤基于聚合函数(如SUM
,AVG
,COUNT
等)的结果
select cj.SID, student.sname, sum(cj.score) as 总分
--select student.sid,sname,SUM(score) as 总分
from student inner join cj on student.SID=cj.SID
group by cj.SID, student.sname --除了聚合函数的都放在group by
having sum(cj.score) >150
--having SUM(score) >= 150
into 生成
使用查询结果生成新表
select student.sid,sname,SUM(score) as 总分
into luqu
from student,cj
where student.SID = cj.SID
group by student.sid,sname
having SUM(score) >= 150
order by SUM(score) desc--不做设置默认为asc
运算符
between…and
用于选择介于两个值之间的数据范围(包括边界值)
select student.SID,sname, course.Cname, cj.score
from student inner join (course inner join cj on course.CID=cj.CID) on student.SID=cj.SID
where score between 60 and 90
like
select student.SID,sname,course.Cname,cj.score
from student inner join (course inner join cj on course.CID=cj.CID) on student.SID=cj.SID
where sname like '张%'
in
在 WHERE 子句中指定一个值列表,然后选择列表中任何一个值匹配的行
SELECT student.SID, student.sname
FROM student
INNER JOIN cj ON student.SID = cj.SID
WHERE cj.CID IN ('101', '102', '103');
等价于
WHERE cj.CID = '101' OR cj.CID = '102' OR cj.CID = '103';
is null
在进行空判断或者非空判断的时候要注意,任何和null比较的值返回的都是false,所以使用 is
和 not
而不用 =
或 !=
select student.SID,sname,birthday,specialty,cj.CID,score
FROM student inner join cj on student.SID=cj.SID
where score is null
聚合字段
计数、最大、最小、求和、平均
总人数、最高分、最低分、总分、平均分
select count(*) as 总人数,
max(分数字段) as 最高分,
min(分数字段) as 最低分.
sum(分数字段) as 总分,
str(avg(分数字段),5,1) as 平均分
from 来源表
count()
用于统计行数或非 NULL 值的数量
- 当用
count(某一字段)
时,它只计算该字段中非 NULL 的行数。 - 使用
count(*)
时,它会计算表中的所有行数,无论字段值是否为 NULL。
按专业分组,统计不同专业人数
select specialty,count(sid) as 人数 from student group by specialty
如果
sid
是主键或者不包含 NULL 值,那么count(sid)
和count(*)
的结果将相同
统计性别为男的总人数
select count (*) as 人数 from student where sex='男'
avg()
计算每个专业的平均总分
select 专业,STR(AVG(总分),5,1) as 平均分
from 学生情况
group by 专业
计算每个学生的平均分数
select cj.SID,student.sname,AVG(score) as 平均分
from student,cj
where cj.sid=student.SID
group by cj.SID,student.sname
year()
通过出生日期字段,查询出年龄字段
select *,2021-YEAR(birthday) as 年龄
from student
where 2021-YEAR(birthday)>=21
-- access中计算出生日期的写法
Year(Date())-Year([出生日期]) as 年龄
sum()
统计不同人的总分
select student.sid,sname,SUM(score) as 总分
from student,cj
where student.SID = cj.SID
group by student.sid,sname
其中from与where做的连接
可以替换为只用from做连接,不写where
from student inner join cj on student.SID=cj.SID
索引
类型
- 唯一索引:确保索引列的每行数据都是唯一的。主键自动成为唯一索引。
- 聚集索引:物理改变表中数据的存储顺序,以索引的顺序存储。一个表只能有一个聚集索引。
- 非聚集索引:逻辑改变数据的存储顺序,创建一个单独的数据结构来存储索引信息。
建立索引
- 创建非聚集索引:
CREATE INDEX 索引名 ON 表名 (列名);
- 示例
假设有一个stu表,并想加快基于student_id列的搜索速度,可以创建如下索引:CREATE INDEX idx_student_id ON students (student_id);
- 建立一个不唯一非聚集的索引
cerate nonclustered index 索引名 no book(索引建 ASC)
删除索引
- 删除索引:
DROP INDEX 索引名 ON 表名;
注意事项
- 主键和唯一索引:主键自动创建唯一索引,但唯一索引不一定是主键。
- 索引选择:选择合适的列进行索引,一般是经常用于查询条件的列。
- 性能和存储:索引虽然提高查询效率,但会增加存储空间需求并可能降低写操作的性能。
常量
char
常量:字符型常量需要使用单引号括起来,例如:‘abc’,‘123’,‘2*6’。`decimal
常量:decimal(整数位, 小数位)
是小数型常量,例如:decimal(5,2)
表示999.99。`bit
常量:bit
表示布尔型或逻辑型常量,只能是0或1。
定义变量
@
开头: 局部变量或函数的参数@
开头: 全局变量#
开头: 临时表或是个存储过程##
开头: 全局的临时数据库对象
变量创建
定义单个变量:set @变量名
同时定义多个:declare @变量名1 数据类型,@变量名2 数据类型
set
声明变量可以赋初始值
declare
声明变量不可赋值,可以同时定义多个,没有赋值时默认为Null
access中使用dim 定义变量,默认值是0
变量赋值
select
可以对多个变量赋值,可以对来源于数据表的数据进行赋值
use libray
declare @var1 varchar(8) --声明变长字符型局部变量
select @var1=rname from reader where rid='30
3216008'--将子查询的结果赋值给局部变量
select @var1 AS ’读者姓名‘ --显示局部变量结果
use educ
declare @xm char(8)
select @xm-sname from student where SID='1961101'
select @xm as 姓名
输出
使用select输出是表格形式
使用print输出只输出数据
use educ
declare @xm char(8)
select @xm-sname from student where SID='1961101'
print @xm
getDATE 当前日期
declare @d date
set @d=getDATE()
--print @d
select @d ad 当前日期
DATENAME 显示日期格式
declare @d date
set @d=getDATE()
select DATENAME(YY,@d),DATENAME(dy,@d),DATENAME(wk,@d),DATENAME(dw,@d)
--输出为 2021 341 50 星期二
DATADD相加 DATEIFF相减
declare @d date
set @d=getDATE()
select DATADD(DD,12,GETDATE())
--十二天之后的日期
select DATADD(hh,3,GETDATE())
--三个小时之后的时间
select DATEIFF(DD,'2022-1-1',GETDATE())
--从今天到2022-1-1的日期,这里写反了,会输出负数
--是第二个减去第一个,左右换个位置即可
获取出生日期
declare @bd date
set @d=birthday from student where sname='张三'
select DATEIFF(YY,@bd,GETDATE())
直接显示ASIIC码对应的值
select char(48)
--输出0
查看某一个人的分数
declare @s nvarchar(255)
declare @n char(6)
select @s=score from cj where SID='961101'
select @n=Sname from student where SID='961101'
print @s
print @n
declare @s nvarchar(255),@n char(6)
select @s=score,@n=sname from student inner join cj on student.SID=cj.SID where sname='梁艾琳'
select @n as 姓名,@s as 分数
一整句的select可以改成两句
select @n=sname from where sname=‘梁艾琳’
select @s=score from student inner join cj on student.SID=cj.SID where=‘梁艾琳’
一个declare可以直接定义多个变量
declare @s nvarchar(255)
declare @n char(6)
select student.Sname,cj.score
from student inner join cj on student.SID=cj.SID
where sname = '梁艾琳'
declare @c char(8)
select @c=score from student inner join cj on student.SID=cj.SID
if @c<=60
update cj set jl='不及格' from student inner join cj on student.SID=cj.SID where sname='梁艾琳'
else
update cj set jl='及格' from student inner join cj on student.SID=cj.SID where sname='梁艾琳'
alter table cj
add jl char(8)
alter table cj
drop column jl
数据库的一些概念
数据的四个基本概念
数据
数据库中存储的基本对象
数据库(DB)
长期储存在计算机内有组织、可共享的大量数据集合
数据库管理员(DBA)
管理操作数据库人员
数据库管理系统(DBMS)
是管理和维护数据库的软件,如MySQL、MariaDB、PostgreSQL、Oracle、SQL Server 等
数据库系统(DBS)
实现有组织的、动态地存储大量关联数据、方便多用户访问的计算机软件、硬件和数据资源组成的系统,由数据库DB、数据库管理系统DBMS、计算机系统(硬件、软件平台、人DBA)
原文链接:https://blog.csdn.net/a1097304791/article/details/115006567
DBMS的选择
目前还分不清为什么Mysql体量那么大,目前用的是MariaDB
下载
MariaDB官网下载
版本选最新,有三种选项
- MariaDB Server: 数据库服务器的完整安装包。
- MariaDB Server Repositories: 指向各种Linux发行版的软件仓库
- Connectors: MariaDB的连接器,用于从不同的编程语言和环境连接到现有的MariaDB数据库。
安装
无脑下一步
设置编码格式为UTF-8,管理员密码可以是root或123456
其他
null和任何值比较都为false
好的,下面是删除数据库、查看已有数据库以及导入数据库的命令,以及每个命令执行后的预期结果。
Linux 下的有关数据库操作
删除数据库
删除数据库
-
登录到 MySQL:
mysql -u root -p
-
删除数据库:
DROP DATABASE your_database;
预期结果:如果命令成功执行,会看到以下结果:
Query OK, 0 rows affected (0.00 sec)
查看已有数据库
查看所有数据库
-
登录到 MySQL:
mysql -u root -p
-
显示所有数据库:
SHOW DATABASES;
预期结果:列出所有数据库,例如:
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| your_database |
+--------------------+
4 rows in set (0.00 sec)
导入数据库
导入数据库
-
确保数据库已经创建(如果尚未创建,可以先创建数据库):
CREATE DATABASE your_database;
预期结果:如果命令成功执行,会看到以下结果:
Query OK, 1 row affected (0.00 sec)
-
退出 MySQL 命令行:
exit;
-
在命令行中导入数据库:
mysql -u root -p your_database < /path/to/your/dumpfile.sql
预期结果:成功导入后,提示符返回到命令行,并没有错误信息。
结合这些命令的完整操作流程
-
登录到 MySQL:
mysql -u root -p
-
查看已有数据库:
SHOW DATABASES;
-
删除现有数据库(如果需要):
DROP DATABASE your_database;
-
创建新的空数据库:
CREATE DATABASE your_database;
-
退出 MySQL 命令行:
exit;
-
在命令行中导入数据库:
mysql -u root -p your_database < /path/to/your/dumpfile.sql
通过这些步骤,你应该能够成功删除旧的数据库、查看已有的数据库,并导入新的数据库。如果在执行这些命令时遇到任何问题,请提供具体的错误信息,以便进一步分析和解决。