目录
数据定义语言DDL(Data Definition Language)
一.对数据库的操作
二.对数据表的操作
数据操作语言DML(Data Manipulation Language)
一.添加 insert into
二.删除 delete
三.修改 update
数据查询语言DQL(Data Query Language)
一.查询 select
二.关键字
1.between ... and ...(在....之间)
2.in, exists
3.check
4.primary key(主键)
5.foreign key(外键)
6.null ,not null
7.distinct
8.having
9.as
10.alter命令
11.unique 唯一键(索引一种)
三.排序查询 order by
四.分组查询 group by
五.聚合函数
六.模糊查询 like
七.分页查询 limit
创作不易,如果本篇博客对您有一定的帮助,大家记得留言+点赞哦。
通过很长一段时间的学习,今天特此总结一下SQL语句,重点是对要用SQL语句实现的句子提供多种不同的语句,以及SQL语句中的一些语法规则,希望对你有帮助!!
--1.1创建数据库 create database MyDatabase; --1.2判断数据库是否已经存在,若存在则不创建,不存在创建,语句更为严谨 create database if not exists MyDatabase ; --2.查看所有创建的数据库 show databases; --3.查看指定数据库的定义信息 show create database MyDatabase; --4删除数据库 drop database MyDatabase;
由于在创建表时,会用到数据类型,恰当的使用数据类型,可以节省内存,加快运行速度。最大程度利用内存空间。
而在SQL中,也定义了许多数据类型。下面是我整理的经常会用到的数据类型,供大家参考。
数据类型 | 数据内容 | 范围 | 占用字节 | 适用场景 |
int | 精确数值型 | -2^31-- 2^31-1 | 4 | 略 |
tinyint | 精确数值型 | 0-255 | 1 | 略 |
date | 日期时间型 | 1000/1/1~ 9999/12/31 | 3 | 适用于只显示日期,不显示时间的需求。如出生时期等显然date更适合。 |
datetime | 日期时间型 | 1753/1/1~9999/12/31 | 8 | 可以精确到秒,与下面的smalldatetime的范围比较,显然datetime更适合用 |
smalldatetime | 日期时间型 | 1900/1/1~2079/6/6 | 4 | 可以精确到秒 |
char | 字符型 | 1-8000个字符 | 定长。1个字符占1个字节 | 如定长的数字或英文如学号,身份证号 |
varchar | 字符型 | 1-8000个字符 | 不定长。1个字节占1个字符 | 如不定长的数字或英文数据 |
nchar | Unicode字符型 | 1-4000个字符 | 定长。1个字符占2个字节 | 如汉字长短一样的性别只有男和女 |
nvarchar | Unicode字符型 | 1-4000个字符 | 不定长。1个字符占2个字节 | 如汉字长短不一的姓名,专业等 |
--1.创建数据表 create table Student( SNO char(10) not null primary key, --[primary key] 为设置主键 [Name] nvarchar(20) not null, -- [not null] 为属性列的值不能为空 Sex int, --年龄 gender nchar(1) check(gender = '男' or gender = '女'),--[check] 起限制,约束作用,例如性 --or gender char(2) --别男和女,分数0到100分 birthday date, --出生年月日 Major nvarchar(20), --专业 Dept nvarchar(20), --院系 Number char(10)) --电话 --2.查看表的结构 desc 表名; desc Student; --例子 --3.修改表名 alter table 表名 rename to 新的表名; alter table Student rename to S; --例子 --4.添加一列 alter table 表名 add 列名 数据的类型; --(注意,此处所添加的列属性是默认可以为空值的null) alter table Student add address nvarchar(50); --例子 添加住址 --5.添加多列 alter table 表名 add 列名 数据的类型, 列名 数据的类型, 列名 数据的类型; --6.删除一列 alter table 表名 drop 列名; alter table Student drop Dpet; --例子 --7.删除多列 alter table 表名 drop 列名, 列名, 列名, 列名; ----8.删除表 drop table 表名; drop table Student; --例子 --9.判断表是否已经存在,若存在才删除,语句更为严谨 drop table if exists 表名; drop table if exists Student; --例子
--例子 insert into(SNO,Name,Sex,gender,birthday,Major,Dept,Number) values('2020041235','张璇',20,'男','2000-1-20','自动化','电信院','7777445222'), ('2020041236','田慧',21,'女','2001-32-10','计算机科学与技术','计科院','7777445223'), ('2020041237','田琪',20,'男','2002-5-10','通信工程','电信院','7777445224'); --1.规范书写 insert into 表名(列名1,列名2,...) values(值1,值2,,...); --2.省略列名时,默认所有列都添加,下面两个句子表达意思相同 insert into 表名 values(值1,值2,,...,值n);--省略列名 insert into 表名(列名1,列名2,...,列名n) values(值1,值2,,...,值n);--此为写全了所有列名 --3.插入部分数据时 insert into 表名(列名2,列名3,,列明5) values(值2,值3,值5); --4.插入多行数据时 两种写法 注意标点符号 明显第二种较为简单 insert into 表名()values(); values(); values(); insert into 表名()values(), (), (), ();
--1.规范书写 --delete 作用仅是删除表中的数据,对表体,列属性名无任何影响 delete from 表名 where 列名 = 值; delete from Student where SNO = '2020041599'; --删除一行或多行数据 --2.删除表中所有数据 这里表体仍存在,是空表,表仍能查询到 delete from 表名 ; --如果不是想删除所有数据,切记加where,不然表中数据全删除完了,小编就吃过亏,慎用 --3.先删除表,再创建一张一样的表 truncate table 表名;
--规范书写 update 表名 set 列名 = 值 where 列名 = 值; --代码中第一个【列名 = 值】 为想要修改的所在列的值 --代码中第二个【列名 = 值】 的列名为具有标识的作用如主键,其值唯一。非主键也行,看具体修改的目的 --例子 update Student set Major = '软件工程' where SNO = '2020041158'; --即更改学号为2020041158的学生的专业名称。
--查询表中所有数据 (行列无限制,全部输出) select * from 表名; select * from Student; --例子 --查询表中某几列数据(行全部输出) select 列名1,列名3 from 表名; select SNO,Name,Major from Student; --例子 --查询特定列名的几行数据 (列全部输出) select * from 表名 where 列名 = 值; select * from Student where SNO = '2020041599'; --即查询学号为2020041599的学生的全部信息 --查询特定列名的几行数据 (行列都有限制) select 列名2,列名4 from 表名 where 列名 = 值;
between 值 and 值:寻找在…之间的值。
not between 值and值:寻找不再…之间的值。这些值可以是数值、文本或者日期。
--查询年龄大于等于18,小于等于20的学生(三种写法,结果一样) SELECT * FROM student WHERE Age>=20 AND Age<=30; SELECT * FROM student WHERE Age<=20 && Age<=30; SELECT * FROM student WHERE BETWEEN 20 AND 30; --查询年龄不在18到20的学生(三种写法) SELECT * FROM student WHERE Age<20 AND Age>30; SELECT * FROM student WHERE Age<20 && Age>30; SELECT * FROM student WHERE NOT BETWEEN 20 AND 30;
1.in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,
然后按照条件进行筛选。in(集合)。
2.exists在查询的时候,首先会执行外循环,外循环返回的结果每一行都会拿着去内层循环执行(此时注意,内层也是循环查询的)。
-查询选修了课程的学生全部信息 S(学生表) SC(学生选课表) SELECT * FROM S WHERE SNO IN(SELECT SNO FROM SC) SELECT * FROM S WHERE EXISTS(SELECT SNO FROM SC WHERE S.SNO = SC.SNO) --查询没有选修任何课程的学生全部信息 S(学生表) SC(学生选课表) SELECT * FROM S WHERE SNO NOT IN(SELECT SNO FROM SC WHERE S.SNO = SC.SNO) SELECT * FROM S WHERE NOT EXISTS(SELECT SNO FROM SC WHERE S.SNO = SC.SNO) -- 查询年龄40岁,35岁,44岁的信息 SELECT * FROM Student WHERE age = 40 OR age = 35 OR age = 44 SELECT * FROM Student WHERE age IN (40,35,44);
CHECK 约束:用于限制列中的值的范围。
在一些情况下,我们需要字段在指定范围的输入,
例如:性别只能输入 '男'或者'女',余额只能大于0,分数在0到100分之间。
这时候就可以用 CHECK 约束 来规范数据。
接下来我们来看看它都可以在哪用。
1.创建表的时候
2.表已经存在的时候,还想修改时。
primary key(主键),
用于唯一标识表中的每一条数据。
不能重复, 不能为空。
一个表只能有一个主键。
接下来我们来看看它都可以在哪用。
1.创建表的时候
第一种
第二种
2.表已经存在且无主键,想要添加主键时
3.表已经存在且有主键,想要删除主键时
上面代码中的约束名在这里,右键点击复制即可
外键: 外面的键, 一张表的一个字段(非主键)指向另外一个表的主键, 那么该字段就称之为外键.
外键所在的表称之为子表(附表); 外键所指向的主键所在的表称之为父表(主表)。
1.创建表的时候
2.表已经存在,想要添加外键时
注意:主从表的字段要具备 相同的数据类型,字符长度和约束 哦!!!
3.表已经存在,想要删除外键时
删除外键和前面的删除主键是一样的
null 和 not null 可以称为数据类型的属性,可以修饰限制列属性,null值也不等同于空值,空值是不占用存储空间的,null占用存储空间。
is null 和 is not null 是运算符,(注意不能写成 =null 或 !=null)查询某字段为空时用 is null,
不为空时用 is not null。
接下来我们来看看它都可以在哪用。
1.创建表时修饰限制列属性。
create table Student( SNO char(10) not null primary key, [Name] nvarchar(20) not null, Sex int null, gender nchar(1) check(gender = '男' or gender = '女'), birthday date null, Major nvarchar(20) null, Dept nvarchar(20) null, Number char(10) null)
2.查询某字段为不为空时。
-- 查询高数成绩不为null SELECT * FROM Student WHERE Math IS NOT NULL; --查询没有选高数课的学生信息 SELECT * FROM Student WHERE Math IS NULL;
distinct 去重,distinct关键字的主要作用就是对数据库表中一个或者多个字段重复的数据进行过滤,只返回其中的一条数据给用户,distinct只可以在select中使用。
举例说明。当查询全校同学的姓名时。
--不加 select Name from Student; --加distinct select distinct Name from Student;
查询结果。
having的作用是过滤数据,where也是过滤数据。那么他们有什么区别呢?
1.having与 where的区别。
(1).执行时机不同。where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
(2).判断条件不同。where不能对聚合函数进行判断,而having可以。
即where并不参与分组后的过滤数据。而是在分组前执行,且必须在分组前执行。
2.使用要求
(1) 如果过滤条件中使用了聚合函数,则必须使用having来替换where,否则会报错。
(2) having必须使用在group by的后面。
(3) having不能单独使用,要和group by一起使用。
3.执行顺序
where > 聚合函数 > having
分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
作用:起别名。
select 字段 as 别名 from 表名 select SNO as 学号 from Student
当需要修改数据表名或者数据表字段时,就需要用到ALTER命令。
--1. 删除列 alter table 表名 drop 列名; --2.增加列 alter table 表名 add 列名 + 列名数据类型 + 约束; --3.修改列的类型信息 alter table 表名 change 列名 + 新列名(这里可以用和原来列同名即可) + 列名数据类型 + 约束; --4.重命名列 alter table 表名 change 列名 新列名 + 列名数据类型 + 约束; --5.重命名表 alter table 表名 rename 表新名; --6.删除表中主键 alter table 表名 drop primary key; --7.添加主键 alter table sj_resource_charges ADD CONSTRAINT PK_SJ_RESOURCE_CHARGES PRIMARY KEY (resid,resfromid) --8.添加索引 alter table sj_resource_charges add index INDEX_NAME (name); --9.添加唯一限制条件索引 alter table sj_resource_charges add unique emp_name2(cardnumber); --10.删除索引 alter table tablename drop index emp_name;
唯一键:unique key,是用来保证对应的字段中的数据是唯一的。
虽然主键也可以用来保证字段数据唯一性,但是一张表只有一个主键。
1、 唯一键在一张表中可以有多个。
2、 唯一键允许字段数据为NULL,NULL可以有多个(NULL不参与比较)
创建唯一键的几种方式
1、 直接在表字段之后增加唯一键标识符:unique
2、 在所有的字段之后使用unique key(字段列表);
3、 在创建完表之后也可以增加唯一键
alter table 表名 add unique key(字段列表);
这里不再做过多演示,可以去上机敲一下。
order by 用于排序,默认是按照升序排序。
注意: 如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件。
order by 列名 desc --[desc] 表示降序 order by 列名 asc --[asc] 表示升序 order by 列名1 asc 列名2 desc --查找所有学生的全部信息,按年龄降序排列 select * from S order by Age desc
用法:用于分组,一般用于与聚合函数进行分组聚合(求和、统计等)。
--按照年龄分组并计算每个年龄段的平均成绩 SELECT Age, AVG(Score) FROM students GROUP BY Age; --按照性别和年龄分组并计算每个年龄段不同性别的平均成绩 SELECT Gender, Age, AVG(Score) FROM students GROUP BY Gender, Age; --按照性别分组。分别查询男、女同学的平均分,人数 要求:分数低于70分的人,不参与分组 SELECT sex , AVG(math),COUNT(id) FROM student WHERE math > 70 GROUP BY sex; --按照性别分组。分别查询男、女同学的平均分,人数 要求:分数低于70分的人,不参与分组,分组之后。人数要大于2个人 SELECT sex , AVG(math),COUNT(id) FROM student WHERE math > 70 GROUP BY sex HAVING COUNT(id) > 2; SELECT sex , AVG(math),COUNT(id) 人数 FROM student WHERE math > 70 GROUP BY sex HAVING 人数 > 2;
将一列数据作为一个整体进行计算,通常和分组查询函数group by组合使用。
1.count() 计算列数
2.max() 计算列最大值
3.min() 计算列最小值
4.sum() 对列进行求和
5.avg() 对列计算平均数
like模糊查询,使用 % 和下划线 _ 匹配,
%可表示多个字符;
下划线_:一个下划线表示一个字符。
示例:
--1、查询名字中含有思的学生信息 select * from student where sname like ‘%思%’; --2、查询名字以刘开头的学生信息 select * from student where sname like ‘刘%’; --3、查询名字以玮结尾的学生信息 select * from student where sname like ‘%玮’; --4、查询名字中第二个字为雨的学生信息 select * from student where sname like ‘_雨%’; --5、查询名字中第三个字为思的学生信息 select * from student where sname like ‘__思%’;
1. 语法:SELECT * FROM 表名 LIMIT 起始索引,查询记录数;
2. 注意:起始索引从0开始,起始索引=(查询页码-1)*每页显示记录数。
分页查询是数据库的方言,不通风的数据库有不同的实现,Mysql中是limit。
如果查询的是第一页数据,起始索引可以省略,直接简写为limit 10。
--规范书写 SELECT * FROM 表名 LIMIT 起始索引,查询记录数; -- 每页显示3条记录 SELECT * FROM student LIMIT 0,3; -- 第1页 SELECT * FROM student LIMIT 3,3; -- 第2页 SELECT * FROM student LIMIT 6,3; -- 第3页