SQL基础——DDL、DML、DQL、DCL速览

目录

正文:

一. 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)

数据库操作

  1. 创建数据库

    create database my_first_database;						// 采用默认的字符集创建数据库
    create database my_first_database character set gbk;	// 采用指定的字符集创建数据库
    
  2. 查看数据库

    show databases;				// 查看所有的数据库
    show create database name;	// 查看创建指定数据库时候的语句
    
  3. 修改数据库

    alter database dbname character set gbk;	// 将指定数据库的字符集修改
    
  4. 删除数据库

    drop database dbname;
    
  5. 切换当前使用的数据库

    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
  1. 建表

    create table 表名(字段1 类型, 字段2 类型, 3d
    
  2. 查看表

    show tables;				 # 查询数据库中所有的表
    show create table 表名;		# 查询数据库中指定的表的创建信息
    desc 表名;					# 查询一个表的字段信息
    
  3. 删除表

    drop table 表名;
    
  4. 修改表信息

    # 动态添加一个字段
    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). 在创建表的时候就添加约束

  1. 在键类型后添加primary key约束

    create table t_student (
        s_id int primary key,
    	s_name varchar(20),
        s_gender varchar(20),
        s_age int
    );
    

    **注意 : **这种方式只适用于一个主键的情况, 不能设置多个主键

  2. 在所有的键的定义后面,使用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';
  1. 在建表的时候添加外键约束

    # 在创建的时候就设置外键约束
    # 注意事项: 需要约束的表得存在
    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)
    );
    
  2. 建表完成后追加外键约束

    # 追加外键约束
    # 让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

将多个查询的结果联合(合并)到一起。

合并查询结果集。

  1. 需要合并的查询结果集需要保证列的数量是相同的

union 和 union all 的区别

  • union 是合并查询结果集,去重
  • union all 是合并查询结果集,不去重
  1. 连接查询

对多张有关联的表之间的数据进行查询。

这多张有关联的表之间, 可以有外键约束, 也可以没有

连接查询会出现的问题: 笛卡尔积

假设有连个集合 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;
  1. 条件字句 where

是一个条件字句,可以确定一个数据筛选的条件。按照这些条件进行数据的过滤,取出满足条件的数据进行操作。

用法: 在where字句后面, 可以有若干个符号, 用来拼接一个条件

=				: 相等比较, 相当于Java中的==
!=		<>		: 不等比较
>  >=  <  <=	: 大小比较
and   or   not	: 与、或、非
between...and...: 在指定范围内,[]
in(set)			: 在某个集合中包含
not in(set)		: 没有在某个集合中包含
is null			: 判断为空
is not null		: 判断不为空

3.数据查询语言(DQL)

数据查询语言,从指定的表中查询指定的数据。在执行DQL语句的时候,不会对表中的数据造成修改。而是将查询的结果集返回,查询的结果其实是一张虚拟的表。
  1. 基础查询
# 查询指定的表中所有行数据的所有列信息
select * from `t_name`;
# 查询指定的列数据
select 列1, 列2, ... from `t_name`;
# 查询指定行的指定列
select 列1, 列2, ... from `t_name` where condition;
  1. 模糊查询
# _		: 通配符, 匹配一位的任意内容
# %		: 通配符, 匹配任意位的任意内容
# 关键字 like
select 列 from 表 where 字段 like xxxx;
  1. 字段控制查询

3.1. 去重查询 distinct

select distinct colum from `t_name`;

3.2. 常见的计算

在表中的数据进行运算的时候,NULL值和其他值运算的结果都是NULL

ifnull(字段名, default_value):
如果指定的字段是NULL, 则返回一个默认的值; 如果这个字段不是NULL, 则返回这个字段的值。

3.3. 列别名

对查询结果中的列,起一个别名。

关键字 : as

在给列定义别名的过程中, as 可以省略。

  1. 查询结果排序

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;
  1. 聚合函数

是用来计算纵向数据(列)的函数

# count()		: 统计数量
# max()			: 求最大值
# min()			: 求最小值
# sum()			: 求和
# avg()			: 求平均值
  1. 分组 group by

将查询到的结果集,按照某一个字段进行分类。这个字段作为分组的依据,这个字段对应的值相同的为一组。

关键字 having

类似于where,也可以对数据做一些约束。

having 和 where 的区别:

1. having后面是可以写聚合函数的, where后面不允许。
2. having是对分组后的数据进行过滤, where是对分组前的数据进行过滤。
 where: 先将所有的数据,按照where的条件进行过滤,将过滤后的数据按照指定的分组列进行分组
  1. 分页

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'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值