zoukankan      html  css  js  c++  java
  • SQL查漏补缺学习笔记(二)高级部分

    ps:本篇随笔以Oracle为前提!

    1.返回前5行数据:

    SQL server/MS Access:

    select top 5 name from table;

    MySQL:

    select name from table limit 5;

    Oracle:

    select name from table where rownum<=5;

    2.使用like进行模糊匹配时,如果想要返回不包括匹配字符的记录,直接在like前面加上not即可。

    3.通配符补充:

    %替代0或多个字符;
    _替代一个字符;
    [charlist]字符列中的任意一个字符
    [^charlist]后者[!charlist]不在字符列中任意字符

    使用[charlist]时,MySQL中用regexp或者not regexp来表示正则表达式。

    eg.选取 name 以 "G"、"F" 或 "s" 开始的所有网站:

    select * from websites where name regexp '^[GFs]';

    选取 name 不以 A 到 H 字母开头的网站:

    select * from websites where name regexp '^[^A-H]';

    4.注意使用in操作符时,后面的值都放在括号里并且用逗号隔开。

    select * from websites where name in ('Google','百度');

    5.BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。

    eg.选取age介于12-26之间的记录:

    select * from table where age between 12 and 26;

    选取name不在字母G到N之间的:

    select * from table where name not between 'G' and 'N';

    选取birthday在1998-01-01到1998-12-31之间的:

    select * from table where birthday between '1998-01-01' and '1998-12-31';

    6.SQL别名:涉及多张表时可以为表取别名,涉及列的改变时可以给列取别名。

    eg.把三个列(name、age 和 sex)结合在一起,并创建一个名为 "stu_info" 的别名:

    select concat(name,',',age,',',sex) as stu_info from table;

    查找student表中学生的name,sex和course表中的cname,teacher:

    select s.name,s.sex,c.cname,c.teacher from student s, course c where s.sid=c.sid;

    7.SQL的JOIN:用on连接。

    inner join 两张表中都匹配时才显示,有时也叫join;

    left join 左表中的所有行都要显示,有时也叫left outer join;

    right join 右表中的所有行都要显示,有时也叫rigth outer join;

    full outer join 只要有一个表中有匹配就显示。

    范围从小到大依次为:inner join < left join || right join < full outer join。

    eg.返回所有学生的姓名,年龄和课程,如果学生没有课程则不显示该学生,没有学生选的课程也不显示。

    select s.name,s.age,c.cname from student s inner join course c on s.sid=c.sid;

     8.SQL UNION 操作符合并两个或多个 SELECT 语句的结果,即取结果的并集。

    使用 UNION ALL 从 "Websites" 和 "apps" 表中选取所有的中国(CN)的数据(也有重复的值):

    SELECT country, name FROM Websites
    WHERE country='CN'
    UNION ALL
    SELECT country, app_name FROM apps
    WHERE country='CN'
    ORDER BY country;

    注意:union 与union all的区别在于,union会去重,union all不会,所有的结果(包括重复结果)都会显示出来。

    9.复制表select into from与insert into select的区别:

     select into from 要求目标表不存在,因为在插入时会自动创建;insert into select from 要求目标表存在。

    复制多个表中的数据插入到新表中:

    SELECT Websites.name, access_log.count, access_log.date
    INTO WebsitesBackup2016
    FROM Websites
    LEFT JOIN access_log
    ON Websites.id=access_log.site_id;

    只复制id为1的 APP 到 "Websites" 中:

    INSERT INTO Websites (name, country)
    SELECT app_name, country FROM apps
    WHERE id=1;

    10.创建表create table,注意为小括号,字段先写字段名再写数据类型,里面的字段用逗号隔开,最后一个字段不用加逗号,括号外面加上分号。

    CREATE TABLE Persons
    (
    PersonID int,
    LastName varchar(255),
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255)
    );

    11.SQL约束:

    • NOT NULL - 指示某列不能存储 NULL 值。
    • UNIQUE - 保证某列的每行必须有唯一的值。
    • PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
    • FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
    • CHECK - 保证列中的值符合指定的条件。
    • DEFAULT - 规定没有给列赋值时的默认值。

    not null非空约束:

    在创建表时添加非空约束:

    create table person
    (
    sid
    int not null, sname varchar(32) );

    给已创建的表中某个字段添加非空约束:

    alter table person
    modify sname varchar(32) not null;

    给已创建的表中某个字段删除非空约束:

    alter table person
    modify sname varchar(32) null;

    unique唯一约束:

    添加unique约束有两种,一种直接在字段后面加unique,一种定义CONSTRAINT uname UNIQUE(sid,sname)(适用于多个字段的约束)

    create tavle student
    (
    sid int not null unique,
    sname varchar(32)
    );
    create table student
    (
    sid int not null,
    sname varchar(32),
    constraint uc_stuId unique(sid,sname)
    );

    给已经创建的表添加unique约束:

    alter table student
    add unique(sid);
    alter table student
    add constraint uc_stuId(sid,sname);

    如需撤销 UNIQUE 约束:

    alter table student
    drop constraint uc_stuId;

    primary key与unique类似。

    foreign key外键约束:要在foreign key后面加上references 父表(主键字段)

    CREATE TABLE Orders
    (
    O_Id int NOT NULL,
    OrderNo int NOT NULL,
    P_Id int,
    PRIMARY KEY (O_Id),
    CONSTRAINT fk_PerOrders FOREIGN KEY (P_Id)
    REFERENCES Persons(P_Id)
    )

    check约束:在check后面的括号里加入约束条件即可

    CREATE TABLE Persons
    (
    P_Id int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255),
    CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes')
    )

    12.创建索引create index:

    CREATE INDEX PIndex
    ON Persons (LastName)

    删除索引:

    DROP INDEX PIndex

    13.ALTER TABLE 语句用于在已有的表中添加、删除或修改列。

    如需在表中添加列,请使用下面的语法:

    ALTER TABLE table_name
    ADD column_name datatype

    如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):

    ALTER TABLE table_name
    DROP COLUMN column_name

    要改变表中列的数据类型,请使用下面的语法:

    ALTER TABLE table_name
    MODIFY COLUMN column_name datatype

    14.auto-increment自增长:

    您必须通过 sequence 对象(该对象生成数字序列)创建 auto-increment 字段。

    请使用下面的 CREATE SEQUENCE 语法:

    CREATE SEQUENCE seq_person
    MINVALUE 1
    START WITH 1
    INCREMENT BY 1
    CACHE 10

    上面的代码创建一个名为 seq_person 的 sequence 对象,它以 1 起始且以 1 递增。该对象缓存 10 个值以提高性能。cache 选项规定了为了提高访问速度要存储多少个序列值。

    要在 "Persons" 表中插入新记录,我们必须使用 nextval 函数(该函数从 seq_person 序列中取回下一个值):

    INSERT INTO Persons (ID,FirstName,LastName)
    VALUES (seq_person.nextval,'Lars','Monsen')

    上面的 SQL 语句会在 "Persons" 表中插入一条新记录。"ID" 列会被赋值为来自 seq_person 序列的下一个数字。"FirstName"列 会被设置为 "Lars","LastName" 列会被设置为 "Monsen"。

    15.SQL视图:

    创建视图:

    CREATE VIEW [Current Product List] AS
    SELECT ProductID,ProductName
    FROM Products
    WHERE Discontinued=No

    我们可以像这样查询上面这个视图:

    SELECT * FROM [Current Product List]

    16.SQL的null值处理:

    SELECT LastName,FirstName,Address FROM Persons
    WHERE Address IS NULL

    如果 "UnitsOnOrder" 是 NULL,则不会影响计算,因为如果值是 NULL 则 ISNULL() 返回 0:

    Oracle 没有 ISNULL() 函数。不过,我们可以使用 NVL() 函数达到相同的结果:

    SELECT ProductName,UnitPrice*(UnitsInStock+NVL(UnitsOnOrder,0))
    FROM Products
  • 相关阅读:
    7/31 CSU-ACM2018暑期训练7-贪心
    树状数组
    洛谷 P2947 [USACO09MAR]向右看齐Look Up【单调栈】
    如何求先序排列和后序排列——hihocoder1049+洛谷1030+HDU1710+POJ2255+UVA548【二叉树递归搜索】
    HDU 1611 敌兵布阵【线段树模板】
    Poj 2112 Optimal Milking (多重匹配+传递闭包+二分)
    Hdu 5361 In Touch (dijkatrs+优先队列)
    Codeforces Round #Pi (Div. 2)
    Hdu 5358 First One (尺取法+枚举)
    Poj 3189 Steady Cow Assignment (多重匹配)
  • 原文地址:https://www.cnblogs.com/iceywu/p/12968482.html
Copyright © 2011-2022 走看看