目录
- 一、SQL的简介
- 二、SQL的分类(点击跳转相应位置)
1.数据定义语言(DDL):数据库、表、操作对象
2.数据操纵语言(DML):增、删、改
3.数据查询语言(DQL):查询
4.数据控制语言(DCL):权限(grant 、revoke)
正文:
一. SQL的简介
SQL: Structure Query Language, 结构化查询语言, SQL最早是被美国国家标准局(ANSI)确定为关系型数据库语言的美国标准。后来被国际化标准组织(ISO)采纳为关系型数据库的国际标准。
每个数据库管理系统都支持国际标准的SQL。
但是每个数据库管理系统也都在国际标准的基础上,增加了自己的拓展。
SQL其实是一种标准化的语言,允许我们可以对一个数据库进行操作,例如: 增、删、改、查
而这些操作: 创建项目(Create)、查询(Read)、修改(Update)、删除(Delete): 被称为 CRUD 操作
二. SQL的分类
DDL (Data Definition Language), 数据定义语言, 用来定义数据库对象(数据库、表、列)
DML (Data Manipulation Languagsse), 数据操作语言, 用来定义数据库查询操作(增、删、改)
DQL Data Query Language), 数据查询语言, 用来从数据库中查询数据
DCL (Data Control Language), 数据库控制语言, 用于设置访问权限和安全级别
**备注:**在SQL中,SQL语句是不区分大小写的
1.数据查询语言(DQL)
数据库操作
-
创建数据库
create database my_first_database; // 采用默认的字符集创建数据库 create database my_first_database character set gbk; // 采用指定的字符集创建数据库
-
查看数据库
show databases; // 查看所有的数据库 show create database name; // 查看创建指定数据库时候的语句
-
修改数据库
alter database dbname character set gbk; // 将指定数据库的字符集修改
-
删除数据库
drop database dbname;
-
切换当前使用的数据库
use dbname; // 切换当前正在使用的数据库 select database(); // 查询当前正在使用哪一个数据库
表操作
数据在数据库中是以表的形式进行存储的,一个表设有若干个字段,数据按照这些字段进行存储。每一个字段,除了要设置字段的名字以外,还需要设置类型:
int : 整型,存储整数
double : 浮点型, 存储浮点型数据。
: double(4,3), 表示这个double数据最多只能有4位, 其中还需要有3位是小数部分, 9.999
char : 字符串, 需要定义长度, 例如: char(5)
: char(5), 每个数据占用长度固定为5, 例如: 'as' 占用长度 5
varchar : 可变长度字符串
: varchar(5), 其实这里设置的是字符串最大可占用的长度, 例如: 'as' 占用长度 2
text : 字符串类型
blob : 字节类型
date : 日期类型, 格式为 yyyy-MM-dd
time : 时间类型, 格式为 hh:mm:ss
timestamp : 时间戳类型, yyyy-MM-dd hh:mm:ss, 会自动赋值
datetime : 时间类型, yyyy-MM-dd hh:mm:ss
-
建表
create table 表名(字段1 类型, 字段2 类型, 3d
-
查看表
show tables; # 查询数据库中所有的表 show create table 表名; # 查询数据库中指定的表的创建信息 desc 表名; # 查询一个表的字段信息
-
删除表
drop table 表名;
-
修改表信息
# 动态添加一个字段 alter table 表名 add 字段名 类型 # 动态删除一个字段 alter table 表名 drop 字段名 # 动态修改一个字段 # 修改一个字段的类型 alter table 表名 modify 字段名 新的类型 # 修改一个字段的名字 alter table 表名 change 字段名 新的字段名 类型 # 修改一张表的字符集 alter table 表名 character set 新的字符集 # 修改表名 alter table 表名 rename 新的表名
操作对象
1. 数据完整性
在创建表格时候,对某些键进行一些约束,使得这个键对应的值具有一定的完整性。
保证用户存储的数据可以正常的存储到数据库中。
1.1 实体完整性
实体: 表中的一行数据,可以作为一个实体(Entity)
实体完整性: 确保这一行的数据是唯一的,不重复的
约束的类型:
NOT NULL(非空约束)、 PRIMARY KEY(主键约束)、 UNIQUE KEY( 唯一约束)、 DEFAULT(默认约束)、 FOREIGN KEY(外键约束)
(一) 主键约束 primary key
**主键 : **作为一行数据的唯一的标志,主键不允许重复,也不允许为空。
给一个键添加主键约束:
(1). 在创建表的时候就添加约束
-
在键类型后添加primary key约束
create table t_student ( s_id int primary key, s_name varchar(20), s_gender varchar(20), s_age int );
**注意 : **这种方式只适用于一个主键的情况, 不能设置多个主键
-
在所有的键的定义后面,使用primary key进行约束
create table t_student ( s_id int, s_name varchar(20), s_gender varchar(20), s_age int, primary key(s_id, s_name) );
(2) 建表完成后,追加约束
alter table t_student add primary key(s_id, s_name);
(二) 唯一约束 unique
(1)唯一约束可以保证记录的唯一性,即就是同一个表中,相同字段的值不会出现重复。
(2)唯一约束的字段可以为空值(NULL)。
(3)每一张数据表可以存在多个唯一约束字段。
和主键不同: unique可以是NULL, 主键不允许NULL
(三) 自增约束 auto_increment
约束某一个键,如果不对这个键进行赋值的情况下,这个键对应的值会在上一个的基础上自增1
(1) AUTO_INCREMENT可以约束任何一个字段,该字段不一定是PRIMARY KEY字段,也就是说自增的字段并不等于主键字段。
(2) 但是PRIMARY_KEY约束的主键字段,一定是自增字段,即PRIMARY_KEY 要与AUTO_INCREMENT一起作用于同一个字段。
(3) 当插入第一条记录时,自增字段没有给定一个具体值,可以写成DEFAULT/NULL,那么以后插入字段的时候,该自增字段就是从1开始,没插入一条记录,该自增字段的值增加1。当插入第一条记录时,给自增字段一个具体值,那么以后插入的记录在此自增字段上的值,就在第一条记录该自增字段的值的基础上每次增加1。
(4) 也可以在插入记录的时候,不指定自增字段,而是指定其余字段进行插入记录的操作。
1.2 域完整性
对某一个列的数据进行约束
(一) 非空约束 not null
约束这个键对应的值不能是NULL值。
(二) 默认值约束 default
如果在插入数据的时候,不对这个键进行赋值,则他拥有一个默认的值。
1.3 引用完整性
(一)外键约束 foreign key
某一个表中的某一个键,所能够取的值,需要在另外的一张表中存在的。这样两张表之间有一个联系,
例如: 学员和班级: 一个班级中有多个学员,但是一个学员只能存在于一个班级
班级表和学生表,依靠 s_id 这个字段进行联系。
将"多"的一方的 s_id 做成 外键(foreign key)
外键约束: 约束外键列的值,只能在另外的一张关联的表中进行值的设置
设置外键约束的时候需要注意的问题:
注意表的存储引擎, 如果需要让某张表支持外键, 需要将存储引擎设置为 InnoDB
alter table `t_name` engine = 'InnoDB';
-
在建表的时候添加外键约束
# 在创建的时候就设置外键约束 # 注意事项: 需要约束的表得存在 create table t_t( s_id int primary key, s_name varchar(20), c_id int, constraint fk_tt_class_cid foreign key(c_id) references t_class(c_id) );
-
建表完成后追加外键约束
# 追加外键约束 # 让t_student表中的c_id字段参考t_class表中的c_id字段 alter table t_student add constraint fk_class_cid foreign key(c_id) references t_class(c_id);
2. 多表查询
从多张表中查询数据。
4.1. union、union all
将多个查询的结果联合(合并)到一起。
合并查询结果集。
- 需要合并的查询结果集需要保证列的数量是相同的
union 和 union all 的区别
- union 是合并查询结果集,去重
- union all 是合并查询结果集,不去重
- 连接查询
对多张有关联的表之间的数据进行查询。
这多张有关联的表之间, 可以有外键约束, 也可以没有
连接查询会出现的问题: 笛卡尔积
假设有连个集合 A = {a, b} B = {1, 2, 3}
A 和 B 的笛卡尔积: {(a,1), (a,2), (a,3), (b,1), (b,2), (b,3)}
(1 )内连接
查询在两张表中同时出现的数据。
(2)外连接
查询在两张表中都出现的数据,和在其中的一张表中没有出现的数据
① 左外连接
查询两张表中共有的数据,和左表中的其他数据
② 右外连接
查询两张表中共有的数据,和右表中的其他数据
2.数据操纵语言(DML)
1. 新增数据
# 按照表中的每一个键,进行数据的添加
insert into `t_name` values (value1, value2, ...);
# 给表中的某些字段进行添加
insert into `t_name` (colum1, colum2, ...) values (value1, value2, ...);
2. 删除数据
# 删除指定的表中所有的数据
delete from `t_name`;
# 删除表中满足条件的数据
delete from `t_name` where condition;
# 删除表中所有的数据
truncate table `t_name`
delete 和 truncate 有什么区别?
1. delete是删除表中的数据,表结构还在。删除的数据可以恢复。
2. truncate 是直接将这个表drop掉,然后再按照原来表中的结构创建一张新的表。
3. truncate效率比delete高
3. 修改数据
# 修改表中的指定的列的值
update `t_name` set colum1 = value1, colum2 = value2, ...;
# 修改表中指定条件的指定列的值
update `t_name` set colum1 = value1, colum2 = value2, ... where condition;
- 条件字句 where
是一个条件字句,可以确定一个数据筛选的条件。按照这些条件进行数据的过滤,取出满足条件的数据进行操作。
用法: 在where字句后面, 可以有若干个符号, 用来拼接一个条件
= : 相等比较, 相当于Java中的==
!= <> : 不等比较
> >= < <= : 大小比较
and or not : 与、或、非
between...and...: 在指定范围内,[]
in(set) : 在某个集合中包含
not in(set) : 没有在某个集合中包含
is null : 判断为空
is not null : 判断不为空
3.数据查询语言(DQL)
数据查询语言,从指定的表中查询指定的数据。在执行DQL语句的时候,不会对表中的数据造成修改。而是将查询的结果集返回,查询的结果其实是一张虚拟的表。- 基础查询
# 查询指定的表中所有行数据的所有列信息
select * from `t_name`;
# 查询指定的列数据
select 列1, 列2, ... from `t_name`;
# 查询指定行的指定列
select 列1, 列2, ... from `t_name` where condition;
- 模糊查询
# _ : 通配符, 匹配一位的任意内容
# % : 通配符, 匹配任意位的任意内容
# 关键字 like
select 列 from 表 where 字段 like xxxx;
- 字段控制查询
3.1. 去重查询 distinct
select distinct colum from `t_name`;
3.2. 常见的计算
在表中的数据进行运算的时候,NULL值和其他值运算的结果都是NULL
ifnull(字段名, default_value):
如果指定的字段是NULL, 则返回一个默认的值; 如果这个字段不是NULL, 则返回这个字段的值。
3.3. 列别名
对查询结果中的列,起一个别名。
关键字 : as
在给列定义别名的过程中, as 可以省略。
- 查询结果排序
order by
将查询的所有结果按照指定的字段进行排序。
select * from t_student order by score_java;
默认是升序排序:
如果需要降序: 则需要添加控制语句 desc。
如果需要升序: 1. 系统默认升序 2. asc
select * from t_student order by score_java desc; // 按照score_java降序
select * from t_student order by score_java asc; // 按照score_java升序
select * from t_student order by score_java; // 按照score_java升序
如果需要多级排序依据。
select * from t_student order by score_java desc, score_hadoop asc, score_mysql;
- 聚合函数
是用来计算纵向数据(列)的函数
# count() : 统计数量
# max() : 求最大值
# min() : 求最小值
# sum() : 求和
# avg() : 求平均值
- 分组 group by
将查询到的结果集,按照某一个字段进行分类。这个字段作为分组的依据,这个字段对应的值相同的为一组。
关键字 having
类似于where,也可以对数据做一些约束。
having 和 where 的区别:
1. having后面是可以写聚合函数的, where后面不允许。
2. having是对分组后的数据进行过滤, where是对分组前的数据进行过滤。
where: 先将所有的数据,按照where的条件进行过滤,将过滤后的数据按照指定的分组列进行分组
- 分页
limit
第一个参数: 从哪一个数据开始查询
第二个参数: 每一页的数据量
分页可以分为两种: 真分页,假分页
真分页, 物理分页, 从数据中查询数据的时候, 直接将数据分段读取。
假分页, 逻辑分页, 直接从数据库中将所有的数据全部读出, 在程序中进行逻辑处理。
优点: 效率高。
缺点: 如果数据量多大, 会内存溢出。
4.数据控制语言(DCL)
数据控制语句:用于控制不同的数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限权限和安全级别,主要包括关键字grant、revoke等。其主要是DBA用来管理系统中的对象权限时使用,一般开发人员很少使用。1.创建用户
create user 'username'@'lhost' identified by 'password'
– username:你将创建的用户的用户名
– host:指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost, 如果想让该用户可以从任意远程主机登陆,可以使用通配符%
– identified by :确认关键字,后接密码
– password :用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器
# 例如:
create user 'lzh'@'localhost' identified by '123456';
create user 'lzh'@'%' identified by '123456';
create user 'lzh'@'%' identified by ''; 等效于: create user 'lzh'@'%';
2.授权
grant privileges on dbname.tablename to 'username'@'host' identified by 'password' [with grant option]
– privileges:用户的操作权限,如SELECT , INSERT , UPDATE 等(具体详见下表),如果要授予所的权限,则使用all
– dbname:数据库名,tablename:表名,如果是所有表的话,则dbname.*
– with grant option:命令中不带这个,则,该用户username不能将权限授予其他人,反之,则可以
# 例如:
grant selelct on test.* to 'lzh'@'localhost' identified by '123456';
grant all on *.* to 'lzh'@'%' with grant option;
3.设置及更改密码
set password for 'username'@'host' = password('new_password')
– 若是当前登录用户,可简写: set password = password (‘new_password’)
4.撤销用户权限
revoke privilege on dbname.tablename from 'username'@'host'
– privilege:同授权部分
5.删除用户
drop user 'username'@'host'