SQL基本语句

[TOC]

一、数据库

什么是数据库?什么是数据库管理系统?什么是SQL?他们之间的关系是什么?

1
2
3
4
5
6
7
8
9
数据库:
英文单词DataBase,简称DB。按照一定格式存储数据的一些文件的组合。
顾名思义:存储数据的仓库,实际上就是一堆文件。这些文件中存储了具有特定格式的数据。
数据库管理系统:
DataBaseManagement,简称DBMS。
数据库管理系统是专门用来管理数据库中数据的,数据库管理系统可以对数据库当中的数据进行增删改查。
常见的数据库管理系统:
MySQL、Oracle、MS SqlServer、DB2、sybase等....

简要来说就是程序猿通过sql语句–>操控DBMS—->操作数据库

二、SQL

  1. 三者之间的简要关系
1
2
3
4
5
6
7
8
9
10
程序员需要学习SQL语句,程序员通过编写SQL语句,然后DBMS负责执行SQL语句,最终来完成数据库中数据的增删改查操作。
SQL是一套标准,程序员主要学习的就是SQL语句,这个SQL在mysql中可以使用,
同时在Oracle中也可以使用,在DB2中也可以使用。

三者之间的关系?
DBMS--执行--> SQL --操作--> DB

先安装数据库管理系统MySQL,然后学习SQL语句怎么写,编写SQL语句之后,DBMS
对SQL语句进行执行,最终来完成数据库的数据管理。

  1. SQL语句的分类

    1. DQL:
      数据查询语言(凡是带有select关键字的都是查询语句)
      select…
    2. DML:
      数据操作语言(凡是对表当中的数据进行增删改的都是DML)
      insert delete update
      insert 增
      delete 删
      update 改
      这个主要是操作表中的数据data。
    3. DDL:
      数据定义语言
      凡是带有create、drop、alter的都是DDL。
      DDL主要操作的是表的结构。不是表中的数据。
      create:新建,等同于增
      drop:删除
      alter:修改
      这个增删改和DML不同,这个主要是对表结构进行操作。
    4. TCL:
      是事务控制语言
      包括:
      事务提交:commit;
      事务回滚:rollback;
    5. DCL:
      是数据控制语言。
      例如:授权grant、撤销权限revoke….
  2. MySQL常用命令

    1. 查看当前的mysql数据库版本

      1. select version();
    2. 登入账号

      1. mysql -u root -p
    3. 查看mysql中有哪些数据库 : show databases;

      1. #注意:以分号结尾,分号是英文的分号。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      mysql> show databases
      -> ;
      +--------------------+
      | Database |
      +--------------------+
      | information_schema |
      | mysql |
      | performance_schema |
      | sys |
      +--------------------+
      4 rows in set (0.01 sec)
    4. 选择使用某个数据库:。

      1. mysql> use mysql;
        1. Database changed 表示正在使用一个名字叫做test的数据库。
    5. 创建数据库

      1. create databases xxxxx
      2. show databases
    6. 查看某个数据库下有哪些表

      1. show tables
      2. *必须选择了某个数据库后才能使用
    7. 查看当前选择的数据库

      1. select database();
    8. 查看表的结构

      1. ```mysql
        mysql> desc servers;
        +————-+———–+——+—–+———+——-+
        | Field | Type | Null | Key | Default | Extra |
        +————-+———–+——+—–+———+——-+
        | Server_name | char(64) | NO | PRI | | |
        | Host | char(255) | NO | | | |
        | Db | char(64) | NO | | | |
        | Username | char(64) | NO | | | |
        | Password | char(64) | NO | | | |
        | Port | int | NO | | 0 | |
        | Socket | char(64) | NO | | | |
        | Wrapper | char(64) | NO | | | |
        | Owner | char(64) | NO | | | |
        +————-+———–+——+—–+———+——-+
        9 rows in set (0.02 sec)
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28

        9. 导入.sql文件

        1. 需要创建一个数据库 create database xxxx;

        2. 选中该数据库 use xxxx;

        3. source + 路径 ==不需要;==



        10. 终止上一条语句

        1. \c
        2. Ctrl +cz

        11. 退出mysql

        1. exit

        12. 备份与恢复

        ```sql
        备份--> dos下执行
        mysqldump -u 用户名 -p -B 数据库1 数据库2 > 路径/文件名

        恢复数据库
        Source 文件名.sql

    13.删除数据库

    1
    drop

三、数据库表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
数据库当中最基本的单元是表:table

什么是表table?为什么用表来存储数据呢?

姓名 性别 年龄(列:字段)
---------------------------
张三 男 20 ------->行(记录)
李四 女 21 ------->行(记录)
王五 男 22 ------->行(记录)

数据库当中是以表格的形式表示数据的。因为表比较直观。

任何一张表都有行和列:
行(row):被称为数据/记录。
列(column):被称为字段。

姓名字段、性别字段、年龄字段。

了解一下:
每一个字段都有:字段名、数据类型、约束等属性。字段名可以理解,是一个普通的名字,见名知意就行。
数据类型:字符串,数字,日期等,后期讲。
约束:约束也有很多,其中一个叫做唯一性约束,这种约束添加之后,该字段中的数据不能重复。
  1. 简单查询

    1. select 字段名 from 表名;

      1. # 其中要注意:select和from都是关键字。

      2. #字段名和表名都是标识符。

      3. 强调:对于SQL语句来说,是通用的,所有的SQL语句以“;”结尾。 SQL语句不区分大小写.

      4. select * from 表名 表示查询所有数据

      5. ```mysql
        mysql> select DNAME from dept;
        +————+
        | DNAME |
        +————+
        | ACCOUNTING |
        | RESEARCH |
        | SALES |
        | OPERATIONS |
        +————+
        4 rows in set (0.00 sec)

    2. 查询多个字段,使用逗号隔开所要查询的字段,

      1. ````mysql
        mysql> select DNAME,LOC from dept;
        +————+———-+
        | DNAME | LOC |
        +————+———-+
        | ACCOUNTING | NEW YORK |
        | RESEARCH | DALLAS |
        | SALES | CHICAGO |
        | OPERATIONS | BOSTON |
        +————+———-+
        4 rows in set (0.00 sec)
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        36
        37
        38
        39
        40
        41
        42
        43
        44
        45
        46
        47
        48
        49
        50
        51
        52
        53
        54


        3. 查询所有
        1. 把所有字段都写上
        2. 使用*
        1. select * from 表名 表示查询所有数据
        2. 缺点:
        1. 效率低
        2. 可读性差
        3. 在实际开发中不建议.

        ------



        2. 给查询列起别名

        > 记住:select语句是永远都不会进行修改操作的。(因为只负责查询)

        1. 给查询的列起别名:使用as关键字起别名。

        1. ```mysql
        mysql> select deptno,dname as deptname from dept;
        +--------+------------+
        | deptno | deptname |
        +--------+------------+
        | 10 | ACCOUNTING |
        | 20 | RESEARCH |
        | 30 | SALES |
        | 40 | OPERATIONS |
        +--------+------------+

        2. 只是将显示结果列明显示为deptname,原表列名还是叫dname.

        3. as可以省略,使用空格代替

        4. 假设起名的时候,别名有空格怎么办

        1. 使用单\双 引号括起来

        2. 注意
        1. 在所有的数据库中,字符串统一使用单引号括起来,==单引号==是标准,双引号在Oracle数据库中使用不了。但是在mysql中可以是使用

        3. ```sql
        mysql> select DNAME as 'test name' from dept;
        +------------+
        | test name |
        +------------+
        | ACCOUNTING |
        | RESEARCH |
        | SALES |
        | OPERATIONS |
        +------------+
        4 rows in set (0.00 sec)
  2. 列表计算

    1. +-*/  ---> 字段\*1212
    
    2. ```mysql
    

    mysql> select ename,sal*12 as yearsal from emp;
    +——–+———-+
    | ename | yearsal |
    +——–+———-+
    | SMITH | 9600.00 |
    | ALLEN | 19200.00 |
    | WARD | 15000.00 |
    | JONES | 35700.00 |
    | MARTIN | 15000.00 |
    | BLAKE | 34200.00 |
    | CLARK | 29400.00 |
    | SCOTT | 36000.00 |
    | KING | 60000.00 |
    | TURNER | 18000.00 |
    | ADAMS | 13200.00 |
    | JAMES | 11400.00 |
    | FORD | 36000.00 |
    | MILLER | 15600.00 |
    +——–+———-+
    14 rows in set (0.00 sec)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    ---
    5. 条件查询

    1. 不是将表中所有数据都查出来。是查询出来符合条件的。

    2. 查询语法格式

    1. ```mysql
    查询语法格式:
    select
    字段1,字段2,字段3....
    from
    表名
    where
    条件;
    3. 条件符号
    
    1. 插叙相等 =

      1. ```sql
        字符
        mysql> select empno,ename,sal from emp where ename = ‘smith’;
        +——-+——-+——–+
        | empno | ename | sal |
        +——-+——-+——–+
        | 7369 | SMITH | 800.00 |
        +——-+——-+——–+
        1 row in set (0.00 sec)
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        36
        37
        38
        39
        40
        41
        42
        43
        44
        45
        46
        47

        2.

        2. 不等于<>(sql中特殊的) / !=

        3. < 小于 <=小于等于 >大于, >=大于等于

        4. 取区间

        1. between ...... and............两个值中间

        1. 必须遵循``左小右大``,否则什么都查不到
        2. between两端都是==闭区间==

        2. 以上等同------==> ==>= .....<=....==

        3. ```sql
        mysql> select empno,ename,sal from emp where sal between 800 and 2000;
        +-------+--------+---------+
        | empno | ename | sal |
        +-------+--------+---------+
        | 7369 | SMITH | 800.00 |
        | 7499 | ALLEN | 1600.00 |
        | 7521 | WARD | 1250.00 |
        | 7654 | MARTIN | 1250.00 |
        | 7844 | TURNER | 1500.00 |
        | 7876 | ADAMS | 1100.00 |
        | 7900 | JAMES | 950.00 |
        | 7934 | MILLER | 1300.00 |
        +-------+--------+---------+
        8 rows in set (0.00 sec)

        mysql> select empno,ename,sal from emp where sal >=800 and sal <=2000;
        +-------+--------+---------+
        | empno | ename | sal |
        +-------+--------+---------+
        | 7369 | SMITH | 800.00 |
        | 7499 | ALLEN | 1600.00 |
        | 7521 | WARD | 1250.00 |
        | 7654 | MARTIN | 1250.00 |
        | 7844 | TURNER | 1500.00 |
        | 7876 | ADAMS | 1100.00 |
        | 7900 | JAMES | 950.00 |
        | 7934 | MILLER | 1300.00 |
        +-------+--------+---------+
        8 rows in set (0.00 sec)


  1. ==查询空值==

    1. 注意:在数据库中 null 不能使用等号进行衡量,需要使用 is null 来进行判断.因为数据库中的 null 代表什么也没有,它并不是一个值,所以不能使用等号衡量。

    2. 即这种写法是错误的

      1. select ename,empno,comm from emp where comm = null;
    3. ```sql
      mysql> select ename,empno,comm from emp where comm is null;
      +——–+——-+——+
      | ename | empno | comm |
      +——–+——-+——+
      | SMITH | 7369 | NULL |
      | JONES | 7566 | NULL |
      | BLAKE | 7698 | NULL |
      | CLARK | 7782 | NULL |
      | SCOTT | 7788 | NULL |
      | KING | 7839 | NULL |
      | ADAMS | 7876 | NULL |
      | JAMES | 7900 | NULL |
      | FORD | 7902 | NULL |
      | MILLER | 7934 | NULL |
      +——–+——-+——+
      10 rows in set (0.00 sec)

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14

      7. ==查询非空值==

      1. ```sql
      mysql> select ename,empno,comm from emp where comm is not null;
      +--------+-------+---------+
      | ename | empno | comm |
      +--------+-------+---------+
      | ALLEN | 7499 | 300.00 |
      | WARD | 7521 | 500.00 |
      | MARTIN | 7654 | 1400.00 |
      | TURNER | 7844 | 0.00 |
      +--------+-------+---------+
      4 rows in set (0.00 sec)
1. 并且 and
2. 或 or
  1. 一些问题

    1. 如果and 和or 同时出现,有优先级问题吗

      1. 查询工资大于2500,并且部门编号为10/20的员工

        1. ```sql
          数据:
          试验:
          mysql> select ename,sal,deptno from emp where sal>2500 and deptno=20 or deptno=10;
          +——–+———+——–+
          | ename | sal | deptno |
          +——–+———+——–+
          | JONES | 2975.00 | 20 |
          | CLARK | 2450.00 | 10 |
          | SCOTT | 3000.00 | 20 |
          | KING | 5000.00 | 10 |
          | FORD | 3000.00 | 20 |
          | MILLER | 1300.00 | 10 |
          +——–+———+——–+
          6 rows in set (0.00 sec)
        × 
        sql 会先执行and,即sal>2500,deptno=20,然后最后或deptn=10的,所以这里出现了sal小于2500的,但deptn=10的数据;
        正确写法:
        添加小括号
        mysql> select ename,sal,deptno from emp where sal>2500 and (deptno=20 or deptno=10);
        +-------+---------+--------+
        | ename | sal     | deptno |
        +-------+---------+--------+
        | JONES | 2975.00 |     20 |
        | SCOTT | 3000.00 |     20 |
        | KING  | 5000.00 |     10 |
        | FORD  | 3000.00 |     20 |
        +-------+---------+--------+
        4 rows in set (0.00 sec)
        
        1
        2
        3
        4
        5

        2. 有!!!需要添加小括号

        1. ```sql
        mysql> select ename,sal,deptno from emp where sal>2500 and (deptno=20 or deptno=10);
        1. and和or同时出现,and优先级较高。如果想让or先执行,需要加小括号。
  2. in 包含

  3. in不是一个区间,in后面跟的是一个具体的值的合集。

  4. mysql> select * from emp where deptno in(10,20);

  5. 不包含 not in

  6. ==模糊查询like==

    1. 模糊查询,支持%或_进行查询

      1. %代表任意多个字符(n个__)
      2. _代表任意一个字符
  7. 案例

    1. 找出名字中含有T的

      1. mysql> select * from emp where ename like '%T%';
        +-------+--------+----------+------+------------+---------+---------+--------+
        | EMPNO | ENAME  | JOB      | MGR  | HIREDATE   | SAL     | COMM    | DEPTNO |
        +-------+--------+----------+------+------------+---------+---------+--------+
        |  7369 | SMITH  | CLERK    | 7902 | 1980-12-17 |  800.00 |    NULL |     20 |
        |  7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
        |  7788 | SCOTT  | ANALYST  | 7566 | 1987-04-19 | 3000.00 |    NULL |     20 |
        |  7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |
        +-------+--------+----------+------+------------+---------+---------+--------+
        4 rows in set (0.00 sec)
        
        
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11

        2. 以T结尾的

        1. ```sql
        mysql> select ename,job from emp where ename like '%T';
        +-------+---------+
        | ename | job |
        +-------+---------+
        | SCOTT | ANALYST |
        +-------+---------+
        1 row in set (0.00 sec)
      2. 找出名字第三个为O的

        1. ```sql
          mysql> select ename,job from emp where ename like ‘__O%’;
          +——-+———+
          | ename | job |
          +——-+———+
          | SCOTT | ANALYST |
          +——-+———+
          1 row in set (0.00 sec)
          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          15
          16
          17
          18
          19

          4. 找到名字中含有_的

          1. 使用转义字符将_的本义去除
          1. select name from student where like '%\_%'

          15. 排序 order by

          1. 语法格式

          1. ```sql
          select
          ename,sal
          from
          emp
          order by
          sal desc;
          desc:降序
          asc:升序(默认)
    2. 多字段排序

      1. ```sql
        以两个字段排序吗?或者说按照多个字段排序?
        查询员工名字和薪资,要求按照薪资升序,如果薪资一样的话,再按照名字升序排列。
        select
        ename,sal
        from
        emp
        order by
        sal asc, ename asc; // sal在前,起主导,只有sal相等的时候,才会考虑启用ename排序。
        1
        2
        3
        4
        5
        6

        3. ~~按字段位置排序(不推荐)~~

        1. ```sql
        select ename,sal from emp order by 2;
        按照表中第二个位置的字段进行排序,默认为升序
  8. 综合案例

    1. 从emp中查询ename和sal字段,并筛选出sal大于1000的字段,并降序处理

      1. select
        --
        from
        --
        where
        --
        order by
        --
        mysql> select ename,sal from emp where sal>1000 order by sal desc;
        +--------+---------+
        | ename  | sal     |
        +--------+---------+
        | KING   | 5000.00 |
        | SCOTT  | 3000.00 |
        | FORD   | 3000.00 |
        | JONES  | 2975.00 |
        | BLAKE  | 2850.00 |
        | CLARK  | 2450.00 |
        | ALLEN  | 1600.00 |
        | TURNER | 1500.00 |
        | MILLER | 1300.00 |
        | WARD   | 1250.00 |
        | MARTIN | 1250.00 |
        | ADAMS  | 1100.00 |
        +--------+---------+
        12 rows in set (0.00 sec)
        
  9. $$