SQL--SQL详解(DDL,DML,DQL,DCL)

博客说明

文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢!

什么是SQL?

Structured Query Language:结构化查询语言

SQL通用语法

SQL 语句可以单行或多行书写,以分号结尾。

可使用空格和缩进来增强语句的可读性。

MySQL 数据库的 SQL 语句不区分大小写,关键字建议使用大写。

3 种注释

  • 单行注释: -- 注释内容 或 # 注释内容(mysql 特有)

  • 多行注释: /* 注释 */

SQL分类

  1. DDL(Data Definition Language)数据定义语言

    用来定义数据库对象:数据库,表,列等。关键字:create, drop,alter 等
  2. DML(Data Manipulation Language)数据操作语言

    用来对数据库中表的数据进行增删改。关键字:insert, delete, update 等
  3. DQL(Data Query Language)数据查询语言

    用来查询数据库中表的记录(数据)。关键字:select, where 等
  4. DCL(Data Control Language)数据控制语言(了解)

    用来定义数据库的访问权限和安全级别,及创建用户。关键字:GRANT, REVOKE 等

DDL:操作数据库、表

操作数据库:CRUD

C(Create):创建

  • 创建数据库:

    • create database 数据库名称;
  • 创建数据库,判断不存在,再创建:
    • create database if not exists 数据库名称;
  • 创建数据库,并指定字符集
    • create database 数据库名称 character set 字符集名;

R(Retrieve):查询

  • 查询所有数据库的名称:

    • show databases;
  • 查询某个数据库的字符集:查询某个数据库的创建语句
    • show create database 数据库名称;

U(Update):修改

  • 修改数据库的字符集

    • alter database 数据库名称 character set 字符集名称;

D(Delete):删除

  • 删除数据库

    • drop database 数据库名称;
  • 判断数据库存在,存在再删除
    • drop database if exists 数据库名称;

使用数据库

  • 查询当前正在使用的数据库名称

    • select database();
  • 使用数据库
    • use 数据库名称;
操作表: CRUD

C(Create):创建

语法:

create table 表名(
列名1 数据类型1,
列名2 数据类型2,
....
列名n 数据类型n
);
  • 注意:最后一列,不需要加逗号(,)
  • 数据库类型:
    1. int:整数类型

      • age int,
    2. double:小数类型

      • score double(5,2)
    3. date:日期,只包含年月日,yyyy-MM-dd

    4. datetime:日期,包含年月日时分秒 yyyy-MM-dd HH:mm:ss

    5. timestamp:时间错类型 包含年月日时分秒 yyyy-MM-dd HH:mm:ss

      • 如果将来不给这个字段赋值,或赋值为null,则默认使用当前的系统时间,来自动赋值
    6. varchar:字符串

      • name varchar(20):姓名最大20个字符
      • zhangsan 8个字符 张三 2个字符

C(Create):创建表

create table student(
id int,
name varchar(32),
age int ,
score double(4,1),
birthday date,
insert_time timestamp
);

​ 复制表:create table 表名 like 被复制的表名;

R(Retrieve):查询

  • 查询某个数据库中所有的表名称

    • show tables;
  • 查询表结构
    • desc 表名;

U(Update):修改

  1. 修改表名

    alter table 表名 rename to 新的表名;
  2. 修改表的字符集

    alter table 表名 character set 字符集名称;
  3. 添加一列

    alter table 表名 add 列名 数据类型;
  4. 修改列名称 类型

    alter table 表名 change 列名 新列别 新数据类型;

    alter table 表名 modify 列名 新数据类型;
  5. 删除列

    alter table 表名 drop 列名;

D(Delete):删除

  • drop table 表名;
  • drop table if exists 表名 ;

DML:增删改表中数据

添加数据
  • 语法:

    • insert into 表名(列名1,列名2,...列名n) values(值1,值2,...值n);
  • 注意:
    1. 列名和值要一一对应。
    2. 如果表名后,不定义列名,则默认给所有列添加值

      insert into 表名 values(值1,值2,...值n);
    3. 除了数字类型,其他类型需要使用引号(单双都可以)引起来
删除数据
  • 语法:

    • delete from 表名 [where 条件]
  • 注意:
    1. 如果不加条件,则删除表中所有记录。
    2. 如果要删除所有记录
      1. delete from 表名; -- 不推荐使用。有多少条记录就会执行多少次删除操作
      2. TRUNCATE TABLE 表名; -- 推荐使用,效率更高 先删除表,然后再创建一张一样的表。
修改数据
  • 语法:

    • update 表名 set 列名1 = 值1, 列名2 = 值2,... [where 条件];
  • 注意:

    1. 如果不加任何条件,则会将表中所有记录全部修改。

DQL:查询表中的记录

select * from 表名;
语法
select
字段列表
from
表名列表
where
条件列表
group by
分组字段
having
分组之后的条件
order by
排序
limit
分页限定
基础查询
  1. 多个字段的查询

    select 字段名1,字段名2... from 表名;
    • 注意:

      • 如果查询所有字段,则可以使用*来替代字段列表。
  2. 去除重复:

    • distinct
  3. 计算列

    • 一般可以使用四则运算计算一些列的值。(一般只会进行数值型的计算)
    • ifnull(表达式1,表达式2):null参与的运算,计算结果都为null
      • 表达式1:哪个字段需要判断是否为null
      • 如果该字段为null后的替换值。
  4. 起别名:

    • as:as也可以省略
条件查询
  1. where子句后跟条件
  2. 运算符
    • >、< 、<= 、>= 、= 、<>
    • BETWEEN...AND
    • IN( 集合)
    • LIKE:模糊查询
      • 占位符:

        • _:单个任意字符
        • %:多个任意字符
    • IS NULL
    • and 或 &&
    • or 或 ||
    • not 或 !

​ 3. 案例

-- 查询年龄大于20岁

SELECT * FROM student WHERE age > 20;
SELECT * FROM student WHERE age >= 20; -- 查询年龄等于20岁
SELECT * FROM student WHERE age = 20; -- 查询年龄不等于20岁
SELECT * FROM student WHERE age != 20;
SELECT * FROM student WHERE age <> 20; -- 查询年龄大于等于20 小于等于30
SELECT * FROM student WHERE age >= 20 && age <=30;
SELECT * FROM student WHERE age >= 20 AND age <=30;
SELECT * FROM student WHERE age BETWEEN 20 AND 30; -- 查询年龄22岁,18岁,25岁的信息
SELECT * FROM student WHERE age = 22 OR age = 18 OR age = 25
SELECT * FROM student WHERE age IN (22,18,25); -- 查询英语成绩为null
SELECT * FROM student WHERE english = NULL; -- 不对的。null值不能使用 = (!=) 判断
SELECT * FROM student WHERE english IS NULL; -- 查询英语成绩不为null
SELECT * FROM student WHERE english IS NOT NULL; -- 查询姓马的有哪些? like
SELECT * FROM student WHERE NAME LIKE '马%'; -- 查询姓名第二个字是化的人
SELECT * FROM student WHERE NAME LIKE "_化%"; -- 查询姓名是3个字的人
SELECT * FROM student WHERE NAME LIKE '___'; -- 查询姓名中包含德的人
SELECT * FROM student WHERE NAME LIKE '%德%';
排序查询
  • 语法:order by 子句

    • order by 排序字段1 排序方式1 , 排序字段2 排序方式2...
  • 排序方式:

    • ASC:升序,默认的。
    • DESC:降序。
  • 注意:

    • 如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件。
聚合函数

将一列数据作为一个整体,进行纵向的计算。

  1. count:计算个数

    1. 一般选择非空的列:主键
    2. count(*)
  2. max:计算最大值
  3. min:计算最小值
  4. sum:计算和
  5. avg:计算平均值
  • 注意:聚合函数的计算,排除null值。

    解决方案:

    1. 选择不包含非空的列进行计算
    2. IFNULL函数
分组查询
  1. 语法:group by 分组字段;

  2. 注意:

    1. 分组之后查询的字段:分组字段、聚合函数

    2. where 和 having 的区别?

      1. where 在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来
      2. where 后不可以跟聚合函数,having可以进行聚合函数的判断。
    3. 案例

    -- 按照性别分组。分别查询男、女同学的平均分
    SELECT sex , AVG(math) FROM student GROUP BY sex; -- 按照性别分组。分别查询男、女同学的平均分,人数
    SELECT sex , AVG(math),COUNT(id) FROM student GROUP BY sex; -- 按照性别分组。分别查询男、女同学的平均分,人数 要求:分数低于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;
分页查询
  1. 语法:limit 开始的索引,每页查询的条数;

  2. 公式:开始的索引 = (当前的页码 - 1) * 每页显示的条数

    -- 每页显示3条记录

    SELECT * FROM student LIMIT 0,3; -- 第1页
    
    SELECT * FROM student LIMIT 3,3; -- 第2页
    
    SELECT * FROM student LIMIT 6,3; -- 第3页
  3. limit 是一个MySQL"方言"

DCL:管理用户,授权

DBA:数据库管理员

管理用户
  1. 添加用户:

    • 语法:

      CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
  2. 删除用户:

    • 语法:

      DROP USER '用户名'@'主机名';
  3. 修改用户密码:

    UPDATE USER SET PASSWORD = PASSWORD('新密码') WHERE USER = '用户名';
    UPDATE USER SET PASSWORD = PASSWORD('abc') WHERE USER = 'lisi'; SET PASSWORD FOR '用户名'@'主机名' = PASSWORD('新密码');
    SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123');
    • mysql中忘记了root用户的密码?

      1. cmd -- > net stop mysql 停止mysql服务

        • 需要管理员运行该cmd
      2. 使用无验证方式启动mysql服务: mysqld --skip-grant-tables

      3. 打开新的cmd窗口,直接输入mysql命令,敲回车。就可以登录成功

      4. use mysql;

      5. update user set password = password('你的新密码') where user = 'root';

      6. 关闭两个窗口

      7. 打开任务管理器,手动结束mysqld.exe 的进程

      8. 启动mysql服务

      9. 使用新密码登录。

  4. 查询用户:

    -- 1. 切换到mysql数据库
    USE myql;
    -- 2. 查询user表
    SELECT * FROM USER;
    • 通配符: % 表示可以在任意主机使用用户登录数据库
权限管理
  1. 查询权限:

    -- 查询权限
    SHOW GRANTS FOR '用户名'@'主机名';
    SHOW GRANTS FOR 'lisi'@'%';
  2. 授予权限:

    -- 授予权限
    grant 权限列表 on 数据库名.表名 to '用户名'@'主机名';
    -- 给张三用户授予所有权限,在任意数据库任意表上 GRANT ALL ON *.* TO 'zhangsan'@'localhost';
  3. 撤销权限:

    -- 撤销权限:
    revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名';
    REVOKE UPDATE ON db3.`account` FROM 'lisi'@'%';

感谢

黑马程序员

以及勤劳的自己

关注公众号: 归子莫,获取更多的资料,还有更长的学习计划

SQL--SQL详解(DDL,DML,DQL,DCL)的更多相关文章

  1. SQL语言:DDL/DML/DQL/DCL

    SQL (Structure Query Language)语言是数据库的核心语言. SQL 的发展是从1974年开始的,其发展过程如下: 1974年-----由Boyce和Chamberlin提出, ...

  2. 【转】MySQL用户管理及SQL语句详解

    [转]MySQL用户管理及SQL语句详解 1.1 MySQL用户管理 1.1.1 用户的定义 用户名+主机域 mysql> select user,host,password from mysq ...

  3. Hadoop Hive sql语法详解

    Hadoop Hive sql语法详解 Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构 化的数据文件 ...

  4. ORACLE PL/SQL编程详解

    ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...

  5. [推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)

    原文:[推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下) [推荐]ORACLE PL/SQL编程详解之一: PL/SQL 程序设计简介(千里之行,始于足下 ...

  6. ORACLE PL/SQL编程详解(转)

    原帖地址:http://blog.csdn.net/chenjinping123/article/details/8737604 ORACLE PL/SQL编程详解 SQL语言只是访问.操作数据库的语 ...

  7. 【强烈强烈推荐】《ORACLE PL/SQL编程详解》全原创(共八篇)--系列文章导航

    原文:[强烈强烈推荐]<ORACLE PL/SQL编程详解>全原创(共八篇)--系列文章导航 <ORACLE PL/SQL编程详解> 系列文章目录导航 ——通过知识共享树立个人 ...

  8. [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)

    原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [顶]ORACLE PL/SQL编程详解之二: PL/SQL块结构和组成元素(为山九仞,岂一日 ...

  9. Hive笔记--sql语法详解及JavaAPI

    Hive SQL 语法详解:http://blog.csdn.net/hguisu/article/details/7256833Hive SQL 学习笔记(常用):http://blog.sina. ...

  10. [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)

    原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天 ...

随机推荐

  1. Java的泛型详解(一)

    Java的泛型详解 泛型的好处 编写的代码可以被不同类型的对象所重用. 因为上面的一个优点,泛型也可以减少代码的编写. 泛型的使用 简单泛型类 public class Pair<T> { ...

  2. DRF认证组件

    1.DRF认证组件之视图注册用法(自定义简单使用) settings.py配置 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.a ...

  3. 洛谷 p1605 迷宫问题 详解

    题解:dfs搜索 #include <iostream> #include <algorithm> #include <cstring> #include < ...

  4. 汉字统计(hdu2030)

    输入格式:一个整型,再循环带有空格的字符串 思考:用scanf_s()函数输入整型,然后一个大循环,再用gets_s()函数输入带空格的字符串. 注意:scanf_s()函数多加了%c,&d, ...

  5. PSR-0到PSR-4编程规范

    PHP-FIG 在说啥是PSR-[0-4]规范的之前,我觉得我们有必要说下它的发明者和规范者:PHP-FIG,它的网站是:www.php-fig.org.就是这个联盟组织发明和创造了PSR-[0-4] ...

  6. Msql 给结果拼接字符串

    SELECT CONCAT("内容:",info)AS info FROM 表名;

  7. 一、CentOS6.8安装MySQL5.6

    一.官网下载rpm安装包 https://dev.mysql.com/downloads/ 版本选中如图中红色框 二.卸载旧mysql 1.检查是否安装有mysql rpm -qa | grep -i ...

  8. 上传应用至Google Play 后被重新签名,怎么获取最新的签名信息

    基本签名信息在Google Play 上都能查看到. 快速解决Google+登录和facebook登录的办法: 不用改包名重新创建应用,不用重新打包,不要删除自己的keystore文件,不要重新创建k ...

  9. Take advantage of Checkra1n to Jailbreak iDevice for App analysis

    An unpatchable bootrom exploit called "checkm8" works on all iDevices up until the iPhone ...

  10. Linux(十) —— 使用 rz 和 sz 命令上传与下载

    以CentOS 7 系统为例,一般上传下载都是使用的第三方工具,但是在操作上并不方便,每次都要找到对应的目录才可以执行上传.下载操作,比较麻烦. 而CentOS为例的 Linux 系统可以通过安装 插 ...