200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > SQL基础——DDL DML DQL DCL速览

SQL基础——DDL DML DQL DCL速览

时间:2020-12-02 04:33:26

相关推荐

SQL基础——DDL DML DQL DCL速览

目录

一、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.999char: 字符串, 需要定义长度, 例如: char(5): char(5), 每个数据占用长度固定为5, 例如: 'as' 占用长度 5varchar: 可变长度字符串: varchar(5), 其实这里设置的是字符串最大可占用的长度, 例如: 'as' 占用长度 2text: 字符串类型blob: 字节类型date: 日期类型, 格式为 yyyy-MM-ddtime: 时间类型, 格式为 hh:mm:sstimestamp: 时间戳类型, 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;

模糊查询

# _: 通配符, 匹配一位的任意内容# %: 通配符, 匹配任意位的任意内容# 关键字 likeselect 列 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'

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。