SQL之基础

一、SQL基本操作

1.1、 数据类型

  • 字符型: varchar2 (最常用的 长度可变的字符串)char(定长) nchar nvarchar2(unicode字符集变长字符型数据) long(使用比较少)

  • 数字型:

    • number(p,s)p表示精度,s表示保留小数最大精度38位
    • float 二进制计算精度,最大126转化成十进制的时候需要乘0.30103
  • 日期 datetimestampdata的区别就是date精确到秒,但是timestamp精确到小数秒,还能显示上午和下午

  • 其他的数据类型:

    • blob最多4G(二进制)
    • clob最多4G(字符数据)
    • bfile 大小和操作系统有关系 二进制数据放在数据库意外的操作系统文件中

1.2、数据定义语言

  • create 创建表

    CREATE TABLE table_name {
       column_name datatype [null|not null],--设置是否可以为空
       column_name datatype [null|not null],
       ...
       [constraint]-- 设置约束,详细的见约束条件章节
    }
    
  • Alter 修改表字段

        ALTER TABLE table_name ADD column_name | MODIY column_name | DROP column
        
        --`DROP column`  删除列,在处理这部分的时候,常常要加上`CASCASDE CONSTRAINTS `删除与该列有关系的约束条件
    

    DROP column 删除列,在处理这部分的时候,常常要加上CASCASDE CONSTRAINTS删除与该列有关系的约束条件

  • Drop 删除表

    DROP TABLE table_name;
    

1.3、约束条件的使用

  1. 主键约束

    • 创建表格的时候使用primary key
        CREATE TABLE usertable {
            name_id varchar2,
            name varchar2 ,
            value varchar2,
            primary key <name_id>
        }
      
    • 使用ALTER TABLE
        ALTER TABLE table_name ADD CONSTRAINTS constraint_name PRIMARY KEY (column_name);
      
        ALTER TABLE usertable ADD CONSTRAINTS pk_nameid     PRIMARY KEY (name_id);
        --这里的pk_nameid是主键的名称,用来删除的
      
    • 删除主键
      ALTER TABLE table_name DROP CONSTRAINT pk_nameid ;
      
  2. 外键约束

    • 创建表的时候添加

      CONSTRAINT constraint_name FOREIGN KEY (column_name) REFERENCE table_name (column_name) 
      ON DELETE CASCADE
      
      • constraint_name:外键约束的名字
      • ON DELETE CASCADE设置级联删除,当主键字段被删除的时候,外键对应的字段也同时被删除
    • 修改数据库表的时候添加外键约束

      ADD CONSTRAINT constraint_name FOREIGN KEY (column_name) REFERENCE table_name (column_name)
      ON DELETE CASCADE;
      
    • 删除外键

          ALTER TABLE table_name DROP CONSTRAINT constraint_name
      
  3. CHECK约束
    检查约束,能够规定每一个列能够输入的值,以保证数据的正确性

    • 创建表的时候添加
          CONSTRAINT constraint_name CHECK(condition);
          
          CREATE TABLE usertable {
              name_id varchar2,
              name varchar2 ,
              age number(2),
              
          }
      
          CONSTRAINT chk_age CHECK(age>=18 and age<66) ;
      
    • 修改表的时候添加check约束
          ADD CONSTRAINT constraint_name CHECK (condition);
      
    • 删除CHECK约束
          ALTER TABLE usertable DROP CONSTRAINT chk_age;
      
  4. UNIQUE 唯一约束

    • 创建表的时候添加,和上边一样
          CONSTRAINT constraint_name UNIQUE(column_name);
          
          CREATE TABLE usertable {
              name_id varchar2,
              name varchar2 ,
              age number(2),
              
          }
      
          CONSTRAINT unq_naemid UNIQUE(name_id) ;
      
    • 修改表的时候添加check约束
          ADD CONSTRAINT constraint_name UNIQUE (column_name);
      
    • 删除UNIQUE约束
          ALTER TABLE usertable DROP CONSTRAINT chk_age;
      
  5. NOT NULL约束

    • ALTER TABLE table_name MODIFY column NOT NULL;

1.4、 数据操纵语言DML和数据查询语言DQL

  • 添加数据用INSERT

    • 基本的添加数据的方法
      INSERT INTO     table_name(column_name1,column_name2...) VALUES(data1,data2...)
      
    • 其他表里添加数据的方法
      INSERT INTO table_name1 (column_name1,column_name2,column_name3..)
      SELECT column_name1,column_name2,column_name3 ... FROM table_name2
      
  • UPDATE
    UPDATE table_name SET column_name1 = data1,column_name2 = data2 ... [WHERE condition]

  • DELETE
    DELETE FROM table_name [where condition]

  • SELECT
    select column_name1,column_name2 ... from table_name WHERE [CONDITION];

  • 其他的语句

    • TRUNCATE语句: 和delete一样都是用来删除表中数据的,但是TRUNCATE是没有条件的,直接删除 TRUNCATE TABLE table_name
    • MERGE:和update语句的功能比较类似,使用MERGE的同事能够进行添加和修改
          MERGE [INTO] table_name1 USING table_name2 ON (condition) WHERE  MATCHED THEN merge_update_clause WHERE NOT MATCHED THEN merge_insert_caluse;
      
      • table_name1 要修改或者是添加的表
      • table_name2 参考的更新表
      • condition 表关联关系
      • merge_update_clause:如果和表2的条件匹配就执行更新操作的sql语句
      • merge_insert_caluse: 如果条件不匹配,就执行增加操作的sql
      -- 加入有两张表user /userInfo
      select * from user;
      -- name age id
      -- AA   12  3
      -- BB   12  2
      -- CC   12  1
      select * from userInfo;
      -- name  id
      -- baipu   3
      
      --MERGE修改
      MERGE INTO user u USING userInfo i ON u.id = i.id  WHERE MATCHED  THEN UPDATE user set u.name = i.id;
      --查询结果
      select * from user ;
      -- name age id
      -- baipu 12  3
      -- BB   12  2
      -- CC   12  1
      

二、SELECT

2.1 基本语句

  1. 语法

        SELECT [DISTINCT|ALL] select_list FROM table_list 
        [WHERE where_clause]
        [group by group_by_caluse]
        [HAVING coding]
        [ORDER BY  order_by_calcuse] 
    
    • [DISTINCT|ALL]:全部显示还是去重
    • where_clause 查询where条件部分
    • group_by_caluse: GROUP BY 子句部分
    • HAVING coding HAVING子句部分
    • order_by_clause排序
  2. 查询指定的字段
    select id,user,name from user_table

  3. 查询所有的字段
    select * from user_table;

  4. 使用别名替代表中的字段,查出来的字段显示的是汉字
    select id AS 用户编号,user AS 用户 ,name AS 用户姓名 from user_table

  5. 使用表达式操作查询的字段
    查出来的字段根据表达式来展示
    select id ,name,age,address,price || '*'||1.23||'='||price*1.23 as new_price from user_table

    • || 是连接操作符
    • *表示乘号,算最后的结果
  6. 函数操作查询字段
    select SUBSTR(name,1,5) as 截取后的名字 FROM user_table;

  7. 去重复
    SELECT distinct(name) from production

2.2 查询结果排序

  • 语法
    ORDER BY {expr | position | c_alias}[ASC|DESC][NULLS FIRST| NULLS LAST]
    
    [,{expr | position | c_alias}[ASC|DESC][NULLS FIRST| NULLS LAST]]
    
    • expr表达式
    • position:表中列的位置
    • c_alias别名
    • ASC升序、DESC降序
      -[NULLS FIRST| NULLS LAST]对空字符串的处理
  • 字段的位置作为排序字段
    select price ,name,quantity from producInfo ORDER BY 3 desc表示按照quantity排序
  • c_alias别名排序
    select price 价格 ,name,quantity from producInfo ORDER BY 价格 desc
    表示按照price排序
  • 表达式
    select price ,name,quantity from producInfo ORDER BY quantity*price desc
    表示按照pricequantity的乘积排序
  • 多个字段
    select price ,name,quantity from producInfo ORDER BY quantity,price desc
    优先按照quantity排序,如果一样就按照price排序

2.3 WHERE部分处理

可以使用关系操作符和比较操作符
关系类的:<,>,<=,>=,=,!=,<>
比较类的:IS NULL ,LIKE BETWEEN...AND IN
逻辑类的: AND OR NOT

SELECT * FROM PRODUCT WHERE 
-- != 和<>用法一样
(
   category <> '010030002'
--使用函数
   AND 
   substr(name,1,3)!= '数据库'
)
-- %表示多个字符 _表示单个字符 NOT表示对结果取反
OR
(
   productName NOT LIKE '%数据库_'
   AND 
   price IN ('1','2','3')
   AND
   qualitity IS NULL
)

2.4 GROUP BY HAVING子句

  • group by
    • 基本语法:
          GROUP BY 
          {
              expr|{ROLLUP|CUBE}({expr[,expr]...})
          }
      
      • expr列名
      • ROLLUP|CUBE子句扩展
    • group by 不允许出现在where子句中,但是允许出现在where子句后面
    • gourp by 出现的时候,查询字段智能存在分组函数或者是gourp by 子句中的字段
  • having
    一把来说需要和group by 的子句一起使用
    select * from priduct group by category having avg(productprice) >2000;
    

2.5 子查询

  • 子查询返回一行的时候
        select * from productinfo where category =
        (
            select categroyid from categoryinfo where categoryname = "U盘"
        );
    
  • 子查询返回多行的时候
    -- IN
     select * from productinfo where category IN
        (
            select categroyid from categoryinfo where categoryname = "U盘" or categoryname = "电脑"
        );
    -- ANY
     select * from productinfo where price <
         any (
            select productionPrice from categoryinfo where categoryname = "U盘" or categoryname = "电脑"
        );
    --SOME  some和any的用法差不多,一般来说any都是用在非=的时候上边的例子中用的就是> some用在=的时候选出多种数据来
    select * from productinfo where price =
         some (
            select productionPrice from categoryinfo where categoryname = "U盘" or categoryname = "电脑"
        );
    -- ALL必须小于所有的情况下
    select * from productinfo where price <
         ALL(
            select productionPrice from categoryinfo where categoryname = "U盘" or categoryname = "电脑"
        );
    

2.6 连接查询

  • 最简单的查询 select * from a,b查询结果为a表和b表的笛卡尔乘积,没卵用
  • 内连接
    把两个表或者是多个表进行连接,只能查出匹配的记录,不匹配的记录无法查出来
    sql select * from productinfo p,categoryinfo c where p.category = c.categoryid; -- INNER JOIN select * from productinfo p INNER JOIN categoryinfo c ON p.category = c.categoryid;
  • 自连接
    把自身的一个引用作为另一个表达式来处理
        select * from productioninfo p,prductioninfo pr 
        where p.id != pr.id
        and p.quantity = pr.quantity
        and p.rowid < pr.rowid
        
        --为了避免重复,直接调用p.rowid 和pr.rowid比较,取比较小的那条 
    
  • 外连接
    • left join左外连接
      select * from productinfo p left join categoryinfo c on p.category = c.categoryid;
      -- 上边的sql将会勒出productinfo表的所有记录,然后和categoryinfo中的数据进行匹配
      
    • right join右连接
      select * from productinfo p 
      right join categorinfo c on c.category = p.categoryid;
      -- 将会展示categoryinfo中所有的数据
      
    • FULL JOIN全外连接
       select * from productinfo p 
      FULL join categorinfo c on c.category = p.categoryid;
      -- 将会展示categoryinfo和productinfo中所有的数据
      
    • (+)的使用
      简化版本的左连接和右连接
      select * from productinfo p,categorinfo c where c.category(+) =  p.categoryid;
      
         -- +在非主表的一方
      
      • 只能在where语句中,不能同outer join一起使用
      • 不能用于全外连接
      • 如果有多个条件,每个条件都要使用
      • 不建议使用
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容

  • MYSQL 基础知识 1 MySQL数据库概要 2 简单MySQL环境 3 数据的存储和获取 4 MySQL基本操...
    Kingtester阅读 7,797评论 5 116
  • SQL基础知识整理 0. 查看当前数据库的配置 mysql> \s -------------- mysql Ve...
    DreamLi0812阅读 343评论 0 1
  • 转载,觉得这篇写 SQLAlchemy Core,写得非常不错。不过后续他没写SQLAlchemy ORM... ...
    非梦nj阅读 5,394评论 1 14
  • [TOC] 排序 ORDER BAY 合并 GROUP BY oracle分页 插入 更新 删除 查询 通配符 ...
    宋志宗阅读 387评论 0 0
  • 每个人都有自己的生活状态,有自己想要过的生活,但很多时候又处于一个焦虑状态!焦虑的问题无非有三个: 一、总觉得当下...
    禅意清柔阅读 289评论 0 1