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
  • 相关阅读:
    JS LeetCode 1423. 可获得的最大点数简单题解
    SpringBoot 学集 (第六章) Docker
    Linux 学记 (第三章)
    Linux 学记 (第二章)
    Linux 学记 (第一章)
    SpringBoot 学集 (第五章) Web开发续
    SpringBoot 学集 (第四章)Web开发
    SpringBoot 学集 (第三章) 日志框架
    SpringBoot 学集 (第二章) 配置文件
    SpringBoot 学集 (第一章)
  • 原文地址:https://www.cnblogs.com/iceywu/p/12968482.html
Copyright © 2011-2022 走看看