暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SQL语言基础知识(一)

oracleace 2023-04-27
751

关于号主,姚远:

  • Oracle ACE(Oracle和MySQL数据库方向)。

  • Oracle MAA 大师。

  • 华为云MVP。

  • 《MySQL 8.0运维与优化》的作者。

  • 拥有 Oracle 10g和12c OCM等20+数据库认证。

  • 曾任IBM公司数据库部门经理。

  • 20+年DBA经验,服务2万+客户。



01

课程说明


这是从零开始系统学习SQL语言的课程,课程中的所有SQL语句同时兼容MySQL、Oracle、SQL Server和PostgreSQL等4种最流行的数据库。
从SQL简介和创建表开始,涵盖了全部常用的SQL知识,学完这个课程马上就可以做数据分析了。


02

实验脚本

使用下面的脚本创建学习环境

    drop table if exists dept;
    create table dept(
    deptno int primary key,
    dname varchar(12) not null,
    loc char(10)
    );
    insert into dept values(1,'Development','NEW YORK');
    insert into dept(deptno,dname,loc) values(2,'Testing','CHICAGO');
    insert into dept(deptno,dname) values(3,'Marketing');
    drop table if exists emp;
    create table emp(
    empno int primary key ,
    ename char(10) not null,
    deptno int,
    hiredate date,
    sal numeric(8, 2),
    comm numeric(8, 2)
    );
    insert into emp values(1,'Grace',1,'2000-12-02',12000.00,0);
    insert into emp values(2,'Joe',1,'2013-01-03',9100.00,0);
    insert into emp values(3,'John',2,'2021-02-10',8900.00,null);
    insert into emp values(4,'Lisa',2,'2022-12-1',11000.00,null);
    insert into emp values(5,'Ben',3,'2004-09-11',8000.00,9000.00);
    commit;
    复制

    03

    实验环境


    课程中使用的4种数据库的客户端都是最流行的,也是数据库软件自带的客户端,无需单独安装。
    大家要看SQL语句前面的提示符就知道是哪种数据库里,这里我带大家熟悉一下4种数据库的客户端。
    MySQL数据库的客户端mysql
    Oracle数据库的客户端SQLPlus
    SQL Server数据库的客户端SSMS,这也是4个数据库客户端中唯一一个图形界面的客户端。
    PostgreSQL数据库的客户端psql



    课程中会随机的在这4种数据库上面进行实验,同一个实验只会在一种数据库上面做一次,但是所有的SQL语句都是同时兼容这4种数据库的,大家花一份时间会得到4份的收获。
    Oracle数据库的语言设置
      $ export NLS_LANG=american_america.AL32UTF8
      $ export LANG=zh_CN.UTF-8
      alter session set nls_date_format ='yyyy-mm-dd';
      复制

      MySQL

      使用MySQL自带的字符客户端mysql。


      Oracle

      使用Oracle自带的字符客户端sqlplus。


      SQL Server

      使微软提供的的SSMS(SQL Server Management Studio)。


      PostgreSQL

      使用PostgreSQL自带的字符客户端psql。



      04

      SQL简介


      1. 数据库

      数据存放在数据库(database)中,数据库是数据的集合,它以一定的格式存放,可以方便地被访问。管理数据库的软件称之为数据库管理系统(database management system,简写成DBMS)。

      用户向数据库管理系统(DBMS)发出查询或修改数据库的执行,DBMS在数据库上执行用户的指令并返回结果。

      1. SQL语言

      数据库管理系统(DBMS)分为两类,一类是关系型数据库(retional),另一个是非关系数据库(non-relational也称为NoSQL)。

      在关系数据库中,数据存放在表中,每个表存放特定类型对象的数据,例如:员工、经理、部门等。表与表之间通过关系进行联结,因此把这类数据库称之为关系数据库。SQL用于管理关系数据库中的数据。关系数据库包括MySQL、Oracle、SQL Server和PostgreSQL等。

      在非关系数据库中,没有表和关系,这类数据库不使用SQL管理数据,它们有自己的数据库管理语言,这类数据库不属于这个课程的范畴。

      SQL是用于访问和处理关系数据库的标准的计算机语言,SQL 是 Structured Query Language 的缩写,是指结构化查询语言。SQL发音有两种,一种是Squel,另一种是SQL。都是正确的。

      SQL语言的特点:

      • 简单易学。

      • 功能强大。

      • 只说明要做什么,不说明如何做。

      • 标准化,几乎所有的关系数据库都通用。

      • 不区分大小写

      本课程中的所有SQL语句均可不加修改地运行在MySQL、Oracle、SQL Server和PostgreSQL等4种数据库,实际上也可以不加修改地运行在几乎所有的数据库上。

      05

      创建表


      Oracle中默认的日期格式可能不兼容,使用下面的命令修改:


        SQL> alter session set nls_date_format ='yyyy-mm-dd';
        复制

        或者在Linux上设置环境变量:

          $ export NLS_DATE_FORMAT="yyyy-mm-dd"
          复制

          创建部门表

          下面的SQL语句创建部门表:


            -- CREATE TABLE
            create table dept(
            deptno int primary key,
            dname varchar(12) not null,
            loc char(10)
            );


            复制

            在创建表之前加一个drop表的语句,是因为在整个课程的练习中会使用对数据进行修改,需要执行这些脚本将数据恢复到初始状态。


            创建员工表

            下面的SQL语句创建员工表:

              create table emp(
              empno int primary key ,
              ename char(10) not null,
              deptno int,
              hiredate date,
              sal numeric(8, 2) ,
              comm numeric(8, 2)
              );


              复制

              删除表使用

                drop table emp;
                复制

                  drop table if exists dept;
                  复制

                  常用数据类型

                  常用数据类型见下表:


                  数据类型<br>说明<br>
                  int<br>整数类型<br>
                  char(n)<br>字符/字符串,固定长度n<br>
                  varchar(n)<br>字符/字符串,可变长度,最大长度 n。<br>
                  numeric(a,b)<br>精确数值,总位数a,小数点后位数b。<br>
                  date<br>存储年、月、日的值

                  06

                  INSERT插入记录


                  insert语句用于向表中插入新记录,它有两种写法:
                  第一种写法:为表中的所有字段添加值时不需要字段名称,但要确保值的顺序和个数与表中的字段顺序和个数一致,前面我们创建样本数据都是这种写法。语法如下:
                  insert into 表名 values (字段1的值,字段2的值,字段3的值, ....);
                  第二种写法:为指定的字段插入数据时,要把字段名和字段值都列出,并一一对应,语法如下:
                  insert into 表名(字段1,字段2,字段3, ...) values (字段1的值,字段2的值,字段3的值, ....);
                  为了后续的实验方便,我们造一些数据,使用insert向表中新增记录


                    -- the INSERT statement
                    desc dept
                    insert into dept values(1,'Development','NEW YORK');
                    insert into dept(deptno,dname,loc) values(2,'Testing','CHICAGO');
                    insert into dept(deptno,dname) values(3,'Marketing');


                    复制

                    使用INSERT向表中增加记录的第一种写法是把每个字段值都写出来。

                      mysql> desc employees;
                      +----------+--------------+------+-----+---------+-------+
                      | Field | Type | Null | Key | Default | Extra |
                      +----------+--------------+------+-----+---------+-------+
                      | empno | int | NO | PRI | NULL | |
                      | name | char(10) | NO | | NULL | |
                      | deptno | int | YES | | NULL | |
                      | email | varchar(20) | YES | | NULL | |
                      | hire_date | date | YES | | NULL | |
                      | salary | decimal(8,2) | YES | | 8000.00 | |
                      +----------+--------------+------+-----+---------+-------+
                      6 rows in set (0.01 sec)
                      -- 也可以用describe employees命令


                      mysql> insert into employees values(12,'刘国强',1,'liuguoqiang@qq.com','2010-04-12',11000.00);
                      Query OK, 1 row affected (0.00 sec)


                      复制

                      这个表有6个字段,这里列出了6个字段的值。如果字段数量或者类型不匹配,insert语句会失败,例如少了一个salary字段,或者字段类型错误。

                      为了后续的实验方便,我们造一些数据,使用insert向表中新增记录


                        -- 向员工表中插入记录
                        insert into emp values(1,'Grace',1,'2000-12-02',12000.00,0);
                        insert into emp values(2,'Joe',1,'2013-01-03',9100.00,0);
                        insert into emp values(3,'John',2,'2021-02-10',8900.00,null);
                        insert into emp values(4,'Lisa',2,'2022-12-1',11000.00,null);
                        insert into emp values(5,'Ben',3,'2004-09-11',8000.00,9000.00);


                        复制

                        我们把前面的脚本汇总起来在4中数据库上建立一个学习环境:

                        可以看到没有输入的字段都是NULL(空值),但工资是默认值,也可以用default关键字代替默认值。

                        插入多行(Oracle不支持)

                          insert into employees(empno,name) values(15,'曾国强'),(16,'aaa');d
                          复制

                          批量插入

                            insert into job_history select * from job_history;
                            select * from job_history;


                            复制

                            (未完,请查看SQL语言(二))





                            欢迎加我的微信,拉你进数据库微信群👇

                            推荐文章👇

                            试看《MySQL 8.0运维与优化》(清华大学出版社)

                            Oracle和MySQL课程录像

                            托业890分的Oracle ACE为您翻译国际大佬的雄文(合集)


                            文章转载自oracleace,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                            评论