SQL

什么是SQL:结构化查询语言(Structured Query Language)。
SQL标准(例如SQL99,即1999年制定的标准):
    由国际标准化组织(ISO)制定的,对DBMS的统一操作方式(例如相同的语句可以操作:mysql、oracle等)。
SQL方言
    某种DBMS不只会支持SQL标准,而且还会有一些自己独有的语法,这就称之为方言!例如limit语句只在MySQL中可以使用

SQL语法

    1. SQL语句可以在单行或多行书写,以分号结尾,在数据库中所有的字符串类型,必须使用单引,不能使用双引!日期类型也要使用单引!
    2. 可使用空格和缩进来增强语句的可读性
    3. MySQL不区别大小写,建议使用大写

SQL语句分类

  DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等;
      > 创建、删除、修改:库、表结构!!!
  DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据);
      > 增、删、改:表记录
  DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别;
  DQL(Data Query Language):数据查询语言,用来查询记录(数据)。

DDL

  1. 数据库
      查看所有数据库:SHOW DATABASES
      切换(选择要操作的)数据库:USE 数据库名
      创建数据库:CREATE DATABASE [IF NOT EXISTS] mydb1 [CHARSET=utf8]
      删除数据库:DROP DATABASE [IF EXISTS] mydb1
      修改数据库编码:ALTER DATABASE mydb1 CHARACTER SET utf8

  2. 数据类型(列类型)

      int:整型
      double:浮点型,例如double(5,2)表示最多5位,其中必须有2位小数,即最大值为999.99;
      decimal:浮点型,在表单钱方面使用该类型,因为不会出现精度缺失问题;
      char:固定长度字符串类型; char(255),数据的长度不足指定长度,补足到指定长度!
      varchar:可变长度字符串类型; varchar(65535), zhangSan
      text(clob):字符串类型(有很小,小,中,大四种);
      blob:字节类型(有很小,小,中,大四种);
      date:日期类型,格式为:yyyy-MM-dd;
      time:时间类型,格式为:hh:mm:ss
      timestamp:时间戳类型;

  3. 表

      创建表:CREATE TABLE [IF NOT EXISTS] 表名(列名 列类型, 列名 列类型, ... 列名 列类型);
        查看当前数据库中所有表名称:SHOW TABLES;
      查看指定表的创建语句:SHOW CREATE TABLE 表名;
      查看表结构:DESC 表名;
      删除表:DROP TABLE 表名;
      修改表:前缀:ALTER TABLE 表名
            > 修改之添加列:
                ALTER TABLE 表名 ADD (
                  列名 列类型,
                  列名 列类型,
                  ...
                );
            > 修改之修改列类型(如果被修改的列已存在数据,那么新的类型可能会影响到已存在数据):ALTER TABLE 表名 MODIFY 列名 列类型;
            > 修改之修改列名:ALTER TABLE 表名 CHANGE 原列名 新列名 列类型;
            > 修改之删除列:ALTER TABLE 表名 DROP 列名;
            > 修改表名称:ALTER TABLE 原表名 RENAME TO 新表名;

DML

  1. 插入数据
    INTERT INTO 表名(列名1,列名2, ...) VALUES(列值1, 列值2, ...);
      > 在表名后给出要插入的列名,其他没有指定的列等同与插入null值。所以插入记录总是插入一行,不可能是半行。
      > 在VALUES后给出列值,值的顺序和个数必须与前面指定的列对应
    INTERT INTO 表名 VALUES(列值1, 列值2)
      > 没有给出要插入的列,那么表示插入所有列。
      > 值的个数必须是该表列的个数。
      > 值的顺序,必须与表创建时给出的列的顺序相同。

  2. 修改数据
    UPDATE 表名 SET 列名1=列值1, 列名2=列值2, ... [WHERE 条件]
      条件(条件可选的):
        > 条件必须是一个boolean类型的值或表达式:UPDATE t_person SET gender='男', age=age+1 WHERE sid='1';
        > 运算符:=、!=、<>、>、<、>=、<=、BETWEEN...AND、IN(...)、IS NULL、NOT、OR、AND

      例句: WHERE age >= 18 AND age <= 80
          WHERE age BETWEEN 18 AND 80

          WHERE name='zhangSan' OR name='liSi'
          WHERE name IN ('zhangSan', 'liSi')
          WHERE age IS NULL, 不能使用等号
          WHERE age IS NOT NULL

  3. 删除数据
    DELETE FROM 表名 [WHERE 条件];
    TRUNCATE TABLE 表名:TRUNCATE是DDL语句,它是先删除drop该表,再create该表。而且无法回滚!!!

DCL(理解即可)

  惯例:一个项目创建一个用户!一个项目对应的数据库只有一个!这个用户只能对这个数据库有权限,其他数据库就操作不了了!

  1. 创建用户
    CREATE USER 用户名@IP地址 IDENTIFIED BY '密码';
      > 用户只能在指定的IP地址上登录
    CREATE USER 用户名@'%' IDENTIFIED BY '密码';
      > 用户可以在任意IP地址上登录

  2. 给用户授权
    GRANT 权限1, … , 权限n ON 数据库.* TO 用户名@IP地址
      > 给用户分派在指定的数据库上的指定的权限
      > 例如;GRANT CREATE,ALTER,DROP,INSERT,UPDATE,DELETE,SELECT ON mydb1.* TO user1@localhost;
            给user1用户分派在mydb1数据库上的create、alter、drop、insert、update、delete、select权限
          GRANT ALL ON 数据库.* TO 用户名@IP地址;
            给用户分派指定数据库上的所有权限

  3. 撤销授权
    REVOKE 权限1, … , 权限n ON 数据库.* FROM 用户名@IP地址;
      > 撤消指定用户在指定数据库上的指定权限
      > 例如;REVOKE CREATE,ALTER,DROP ON mydb1.* FROM user1@localhost;
            撤消user1用户在mydb1数据库上的create、alter、drop权限

  4. 查看权限
    SHOW GRANTS FOR 用户名@IP地址
      > 查看指定用户的权限

  5. 删除用户
    DROP USER 用户名@IP地址

DQL(数据查询语言,这个最重要★
  查询不会修改数据库表记录!

  一、 基本查询

    1. 字段(列)控制
      1) 查询所有列
        SELECT * FROM 表名;
        SELECT * FROM emp;
        --> 其中“*”表示查询所有列

      2) 查询指定列
        SELECT 列1 [, 列2, ... 列N] FROM 表名;
        SELECT empno, ename, sal, comm FROM 表名;

      3) 完全重复的记录只一次
        当查询结果中的多行记录一模一样时,只显示一行。一般查询所有列时很少会有这种情况,但只查询一列(或几列)时,这总可能就大了!
        SELECT DISTINCT * | 列1 [, 列2, ... 列N] FROM 表名;
        SELECT DISTINCT sal FROM emp;
        --> 查询员工表的工资,如果存在相同的工资只显示一次!

      4) 列运算
        I 数量类型的列可以做加、减、乘、除运算
          SELECT sal*1.5 FROM emp;
          SELECT sal+comm FROM emp;

        II 字符串类型可以做连续运算
          SELECT CONCAT('$', sal) FROM emp;

        III 转换NULL值
          有时需要把NULL转换成其它值,例如com+1000时,如果com列存在NULL值,那么NULL+1000还是NULL,而我们这时希望把NULL当前0来运算。
          SELECT IFNULL(comm, 0)+1000 FROM emp;
          --> IFNULL(comm, 0):如果comm中存在NULL值,那么当成0来运算。

        IV 给列起别名
          当使用列运算后,查询出的结果集中的列名称很不好看,这时我们需要给列名起个别名,这样在结果集中列名就显示别名了
          SELECT IFNULL(comm, 0)+1000 AS 奖金 FROM emp;
          --> 其中AS可以省略

    2. 条件控制
      1) 条件查询
        与前面介绍的UPDATE和DELETE语句一样,SELECT语句也可以使用WHERE子句来控制记录。
          SELECT empno,ename,sal,comm FROM emp WHERE sal > 10000 AND comm IS NOT NULL;
          SELECT empno,ename,sal FROM emp WHERE sal BETWEEN 20000 AND 30000;
          SELECT empno,ename,job FROM emp WHERE job IN ('经理', '董事长');
      2) 模糊查询
        当你想查询姓张,并且姓名一共两个字的员工时,这时就可以使用模糊查询
          SELECT * FROM emp WHERE ename LIKE '张_';
          --> 模糊查询需要使用运算符:LIKE,其中_匹配一个任意字符,注意,只匹配一个字符而不是多个。
          --> 上面语句查询的是姓张,名字由两个字组成的员工。
          SELECT * FROM emp WHERE ename LIKE '___'; /*姓名由3个字组成的员工*/

        如果我们想查询姓张,名字几个字可以的员工时就要使用“%”了。
          SELECT * FROM emp WHERE ename LIKE '张%';
          --> 其中%匹配0~N个任意字符,所以上面语句查询的是姓张的所有员工。
          SELECT * FROM emp WHERE ename LIKE '%阿%';
          --> 千万不要认为上面语句是在查询姓名中间带有阿字的员工,因为%匹配0~N个字符,所以姓名以阿开头和结尾的员工也都会查询到。
          SELECT * FROM emp WHERE ename LIKE '%';
          --> 这个条件等同与不存在,但如果姓名为NULL的查询不出来!

  二、排序
    1) 升序
      SELECT * FROM emp ORDER BY sal ASC;
      --> 按sal排序,升序!
      --> 其中ASC是可以省略的
    2) 降序
      SELECT * FROM emp ORDER BY comm DESC;
      --> 按comm排序,降序!
      --> 其中DESC不能省略
    3) 使用多列作为排序条件
      SELECT * FROM emp ORDER BY sal ASC, comm DESC;
      --> 使用sal升序排,如果sal相同时,使用comm的降序排

  三、聚合函数
    聚合函数用来做某列的纵向运算。
    1) COUNT
      SELECT COUNT(*) FROM emp;
      --> 计算emp表中所有列都不为NULL的记录的行数
      SELECT COUNT(comm) FROM emp;
      --> 计算emp表中comm列不为NULL的记录的行数
    2) MAX
      SELECT MAX(sal) FROM emp;
      --> 查询最高工资
    3) MIN
      SELECT MIN(sal) FROM emp;
      --> 查询最低工资
    4) SUM
      SELECT SUM(sal) FROM emp;
      --> 查询工资和
    5) AVG
      SELECT AVG(sal) FROM emp;
      --> 查询平均工资

  四、分组查询
    分组查询是把记录使用某一列进行分组,然后查询组信息。
    例如:查看所有部门的记录数。
       SELECT deptno, COUNT(*) FROM emp GROUP BY deptno;
         --> 使用deptno分组,查询部门编号和每个部门的记录数
       SELECT job, MAX(SAL) FROM emp GROUP BY job;
       --> 使用job分组,查询每种工作的最高工资

    组条件
    以部门分组,查询每组记录数。条件为记录数大于3
      SELECT deptno, COUNT(*) FROM emp GROUP BY deptno HAVING COUNT(*) > 3;

  五、limit子句(MySQL方言)
    LIMIT用来限定查询结果的起始行,以及总行数。
    例如:查询起始行为第5行,一共查询3行记录
        SELECT * FROM emp LIMIT 4, 3;
        --> 其中4表示从第5行开始,其中3表示一共查询3行。即第5、6、7行记录。

小结:

  关键字顺序:select,from,where,group by,having,order by

SQL详解(上)的更多相关文章

  1. Oracle中动态SQL详解(EXECUTE IMMEDIATE)

    Oracle中动态SQL详解(EXECUTE IMMEDIATE) 2017年05月02日 18:35:48 悠悠倾我心 阅读数:744 标签: oracle动态sqloracle 更多 个人分类:  ...

  2. MyBatis的动态SQL详解

    MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑,本文详解mybatis的动态sql,需要的朋友可以参考下 MyBatis 的一个强大的特性之一通常是它 ...

  3. AgileEAS.NET SOA中间件平台/敏捷软件开发平台 and SQL详解

    AgileEAS.NET SOA中间件平台/敏捷软件开发平台 http://www.smarteas.net/ SQL详解: http://www.w3school.com.cn/sql/func_d ...

  4. IE8“开发人员工具”使用详解上(各级菜单详解)

    来源: http://www.cnblogs.com/JustinYoung/archive/2009/03/24/kaifarenyuangongju.html IE8“开发人员工具”使用详解上(各 ...

  5. C++框架_之Qt的窗口部件系统的详解-上

    C++框架_之Qt的窗口部件系统的详解-上 第一部分概述 第一次建立helloworld程序时,曾看到Qt Creator提供的默认基类只有QMainWindow.QWidget和QDialog三种. ...

  6. [js高手之路]深入浅出webpack教程系列2-配置文件webpack.config.js详解(上)

    [js高手之路]深入浅出webpack教程系列索引目录: [js高手之路]深入浅出webpack教程系列1-安装与基本打包用法和命令参数 [js高手之路]深入浅出webpack教程系列2-配置文件we ...

  7. SSL/TLS协议详解(上):密码套件,哈希,加密,密钥交换算法

    本文转载自SSL/TLS协议详解(上):密码套件,哈希,加密,密钥交换算法 导语 作为一名安全爱好者,我一向很喜欢SSL(目前是TLS)的运作原理.理解这个复杂协议的基本原理花了我好几天的时间,但只要 ...

  8. Linux常用命令详解上

    Linux常用命令详解上 目录 一.shell 二.Linux命令 2.1.内部命令与外部命令的区别 2.2.Linux命令行的格式 2.3.编辑Linux命令行的辅助操作 2.4.获得命令帮助的方法 ...

  9. Mybatis全面详解——上(学习总结)

    原文地址:https://blog.csdn.net/ITITII/article/details/79969447 一.什么是Mybatis 这里借用官网的一句话介绍什么是mybatis:MyBat ...

  10. Linux主要shell命令详解(上)

    [摘自网络] kill -9 -1即实现用kill命令退出系统 Linux主要shell命令详解 [上篇] shell是用户和Linux操作系统之间的接口.Linux中有多种shell,其中缺省使用的 ...

随机推荐

  1. ACM/ICPC 之 Bellman Ford练习题(ZOJ1791(POJ1613))

    这道题稍复杂一些,需要掌握字符串输入的处理+限制了可以行走的时间. ZOJ1791(POJ1613)-Cave Raider //限制行走时间的最短路 //POJ1613-ZOJ1791 //Time ...

  2. DataStage

    parallel job shell调用:dsjob ./dsjob -run -mode NORMAL -paramfile xxx.param <PROJECT> <JOB> ...

  3. Maven 安装

    简单记录maven的安装步骤: 在安装maven之前,先确保已经安装JDK1.6及以上版本,并且配置好环境变量. 下载maven3,最新版本是Maven3.2.3 ,下载地址:http://maven ...

  4. ORACLE 远程导入导出数据库

      Oracle数据导入导出imp/exp就相当于oracle数据还原与备份.exp命令可以把数据从远程数据库服务器导出到本地的dmp文件,imp命令可以把dmp文件从本地导入到远处的数据库服务器中. ...

  5. asp.net mvc htmlHelper

    ASP.NET MVC 3.0 HTML辅助方法   HTML辅助方法(html helper)是用来帮助生成HTML的方法. 1.HTML辅助方法应用实例 ◊ 生成form元素 @using (Ht ...

  6. 【网络】VPN

    VPN: 来自百度百科 虚拟专用网络的功能是:在公用网络上建立专用网络,进行加密通讯.在企业网络中有广泛应用.VPN网关通过对数据包的加密和数据包目标地址的转换实现远程访问.VPN有多种分类方式,主要 ...

  7. php策略模式的研究

    <?php abstract class Moshi{     private $num;     public $price;     const Ted=1;     const Sed=2 ...

  8. Java抽象类接口、内部类题库

    一.    选择题 1. Person类和Test类的代码如下所示,则代码中的错误语句是(  C  ).(选择一项)   public class Person { public String nam ...

  9. September 12th 2016 Week 38th Monday

    After all, tomorrow is another day. 不管怎样,明天又是全新的一天. Another day? Maybe.  Remember when you reach for ...

  10. grep(Global Regular Expression Print)

    .grep -iwr --color 'hellp' /home/weblogic/demo 或者 grep -iw --color 'hellp' /home/weblogic/demo/* (-i ...