zoukankan      html  css  js  c++  java
  • SQL学习笔记

    ·SQL语法
    SQL语句在数据库中执行的大部分工作,如select * from abc;
    sql语句对大小写不敏感,语句后面的分号一定要有
    SELECT - 从数据库中提取数据
    UPDATE - 更新数据库中的数据
    DELETE - 从数据库中删除数据
    INSERT INTO - 向数据库中插入新数据
    CREATE DATABASE - 创建新数据库
    ALTER DATABASE - 修改数据库
    CREATE TABLE - 创建新表
    ALTER TABLE - 变更(改变)数据库表
    DROP TABLE - 删除表
    CREATE INDEX - 创建索引(搜索键)
    DROP INDEX - 删除索引
    返回唯一不同的值,即不搜索重复的值:SQL select distinct
    select distinct column_name from abc;

    过滤记录:SQL where
    select * from abc where column_name='中国';
    文本字段使用单引号,数值字段不需要引号

    运算符:= <>(不等于) > < >= <= between like(搜索某种模式) in(指定针对某个列的多个可能值)
    逻辑运算 and or not
    特殊条件 is null, between and, in,
    Select * from emp where sal in (5000,3000,1500);查询 EMP 表 SAL 列中等于 5000,3000,1500 的值。

    Select * from emp where ename like 'M%';
    查询 EMP 表中 Ename 列中有 M 的值,M 为要查询内容中的模糊信息。
    % 表示多个字值,_ 下划线表示一个字符;
    M% : 为能配符,正则表达式,表示的意思为模糊查询信息为 M 开头的。
    %M% : 表示查询包含M的所有内容。
    %M_ : 表示查询以M在倒数第二位的所有内容。

    对结果集排序 order by 默认会按照升序进行排序ASC,若按照降序使用DESC
    select * from abc order by column_name_number DESC;
    order by 多列,这个也好理解:select * from abc order by country,column_name_number


    插入新纪录 SQL insert into
    第一种只需提供插入的值,第二中提供插入的值和对应的列名
    插入新行
    INSERT INTO Websites (name, url, alexa, country)
    VALUES ('百度','https://www.baidu.com/','4','CN');
    id 列是自动更新的,表中的每条记录都有一个唯一的数字
    在指定的列插入数据
    INSERT INTO Websites (name, url, country)VALUES ('stackoverflow', 'http://stackoverflow.com/', 'IND');
    没有指定的列按照默认值

    更新表中的记录SQL update
    UPDATE Websites SET alexa='5000', country='USA' WHERE name='菜鸟教程';
    如果不设置where则代表每行都进行更新,没有where的更新语句慎用
    在 MySQL 中可以通过设置 sql_safe_updates 这个自带的参数来解决

    删除表中记录SQL delete
    delete from abc where column_name='百度';
    三个删除的语句区别:delete,drop,truncate
    drop删除表,并释放表空间。删的一干二净
    truncate删除表里的内容并释放表空间,但是表的结构仍在,数据不可回滚恢复
    delete删除表里的内容,不释放表空间,表结构仍在,数据可以回滚恢复

    delete 语句是 dml, 这个操作会放到 rollback segement 中, 事务提交之后才生效; 如果有相应的 trigger, 执行的时候将被触发。 truncate, drop 是 ddl, 操作立即生效, 原数据不放到 rollback segment 中, 不能回滚。 操作不触发 trigger。
    速度:drop>truncate>delete
    安全性:没有备份时小心使用drop和truncate

    返回的记录的数目:SQL select top, limit(Mysql),rownum(Oracle)
    SELECT * FROM Persons LIMIT 5;mysql中
    select * from persons where rownum <=5;oracle中
    select Top 50 percent * from websites;Sql server中

    模糊查询Sql like
    选取name以字母G开始的所有客户 select * from websites where name like 'G%';
    select * from websites where name like 'G_'两位且开头字母是G

    通配符 % - [] [^] [!]
    规定操作符 IN 可以规定多个值,而=只能规定一个,转换的话可以通过or拆开 select * from websites where name IN ('Google','草鸟继承');

    区间查询 between and,可以配合IN使用
    SELECT * FROM Websites WHERE (alexa BETWEEN 1 AND 20) AND country NOT IN ('USA', 'IND');

    别名:让列名称的可读性更强 通过as进行别名指定 select column_name as Cname from abc;
    SELECT w.name, w.url, a.count, a.date FROM Websites AS w, access_log AS a
    WHERE a.site_id=w.id and w.name="菜鸟教程";

    多表连接(join)
    SQL join基于这些表之间的共同字段,常见的SQL inner join
    SELECT Websites.id, Websites.name, access_log.count, access_log.date
    FROM Websites INNER JOIN access_log ON Websites.id=access_log.site_id;
    不同的join
    INNER JOIN:如果表中有至少一个匹配,则返回行,如果在匹配的那个表中没有这个表的佩佩,则不显示在最后join的那个表
    LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行(右边的表没匹配左边的表所有字段也要添加到join中)
    RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行,与left join相反,右边的字段都加入join中
    FULL JOIN:只要其中一个表中存在匹配,则返回行

    Union操作符:合并两个或多个select语句的结果,每个select语句必须有相同数量的列,。列也必须有相似的数据类型,同时,每个 SELECT 语句中的列的顺序必须相同。
    SELECT country FROM Websites UNION SELECT country FROM apps
    ORDER BY country;
    这里不包含重复的值

    SELECT country FROM Websites
    UNION ALL SELECT country FROM apps
    ORDER BY country;
    这里包含重复的值

    复制一个表的信息到另一个表(新表)
    select into(部分数据库支持这样的写法)
    SELECT Websites.name, access_log.count, access_log.date
    INTO WebsitesBackup2016
    FROM Websites
    LEFT JOIN access_log
    ON Websites.id=access_log.site_id;

    insert into select 是复制一个表的数据插入到一个已经存在的表中,与上面的不同
    INSERT INTO Websites (name, country)
    SELECT app_name, country FROM apps;

    创建数据库CREATE DATABASE my_db;
    创建表:
    CREATE TABLE Persons
    (
    PersonID int,
    LastName varchar(255),
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255)
    );

    约束:规定表中的数据规则,创建表示可以规定,表创建之后也可以规定
    create table+constraint,包括not null, unique,primary key,check,default
    UNIQUE (P_Id),
    ALTER TABLE Persons
    ADD CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)表也存在
    定义多个列的primary key的约束
    CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
    撤销约束:Alter table persons drop constraint uc_personId

    foreign key约束
    只能说一个表(persons)的列是另一个(orders)的外键,预防破坏表之间连接的行为。
    CREATE TABLE Orders
    (
    O_Id int NOT NULL PRIMARY KEY,
    OrderNo int NOT NULL,
    P_Id int FOREIGN KEY REFERENCES Persons(P_Id)
    )
    cascade在删除表的时候很有用
    ALTER TABLE 表名
    ADD CONSTRAINT 外键约束名
    FOREIGN KEY (column1, column2,...column_n)
    REFERENCES 外键所依赖的表 (column1,column2,...column_n)
    ON DELETE CASCADE;--级联删除

    限制列中的值得范围:check
    P_id int not null check(P_id>0);
    撤销check约束 alter table persons drop check chk_person

    默认值:default
    撤销default约束 alter table persons alter column city drop default

    创建索引:create index 加快查询,尽在需要搜索的列上创建索引
    删除索引,表,数据库,仅仅删除数据使用truncate

    添加修改删除列
    add drop alter
    改变字段的数据类型,alter persons alter date year,将date字段的数据类型改为了year

    AUTO_INCREMENT 关键字来执行自动递增主键字段的值,id得值就是这样的,每个数据写法不同,不一一列出了


    创建视图create view
    CREATE VIEW [Category Sales For 1997] AS
    SELECT DISTINCT CategoryName,Sum(ProductSales) AS CategorySales
    FROM [Product Sales for 1997]
    GROUP BY CategoryName

    在视图中添加某列
    CREATE VIEW [Current Product List] AS
    SELECT ProductID,ProductName,Category
    FROM Products
    WHERE Discontinued=No
    撤销视图:drop view view_name;


    通用数据类型:Date 存储年月日
    time存储小时分秒
    timestamp 存储年月日时分秒
    interval 存储整数字段,代表时间取决于区间的类型
    xml存储xml数据
    http://www.runoob.com/sql/sql-datatypes-general.html

    sql內建函数
    Aggregate函数从列中取得值,返回一个单一的值
    如AVG();Count();Max()
    Scalar函数基于输入值,返回一个单一的值
    Ucase(转化为大写)Lcase(转换为小写)Len(返回字段长度)
    SELECT AVG(count) AS CountAverage FROM access_log;
    SELECT COUNT(count) AS nums FROM access_log
    WHERE site_id=3;
    SELECT name AS FirstSite FROM Websites LIMIT 1;选择第一个记录的值
    SELECT name FROM Websites ORDER BY id DESC LIMIT 1;选择最后一个记录的值,通过 order by 字段 desc

    结合聚合函数,根据一个或多个列对结果集进行分组
    Group by
    统计 access_log 各个 site_id 的访问量:
    SELECT site_id, SUM(access_log.count) AS nums
    FROM access_log GROUP BY site_id;
    统计所有网站的访问的记录数:这个是关联两个表将网站名加进来
    SELECT Websites.name,COUNT(access_log.aid) AS nums FROM access_log
    LEFT JOIN Websites
    ON access_log.site_id=Websites.id
    GROUP BY Websites.name;

    筛选分组后的各组数据,使用的是Having,where关键字无法和聚合函数一起使用
    这个是筛选的条件,之前得使用Group by进行分组,他俩同时出现
    SELECT Websites.name, SUM(access_log.count) AS nums FROM Websites
    INNER JOIN access_log
    ON Websites.id=access_log.site_id
    WHERE Websites.alexa < 200
    GROUP BY Websites.name
    HAVING SUM(access_log.count) > 200;

    从文本字段中提取字符
    Mid();
    select MID(name,1,4)as shortTitle from websites;
    name 和start起始位置必须有,返回字符数可以选择或者不选
    oracle中没有这个,代替的是substr();

    返回当前系统给的日期和时间
    now();
    SELECT name, url, Now() AS date
    FROM Websites;

    对字段的显示进行格式化
    format();
    SELECT name, url, DATE_FORMAT(Now(),'%Y-%m-%d') AS date
    FROM Websites;格式化了日期和时间,只显示年月日

  • 相关阅读:
    无限维
    黎曼流形
    why we need virtual key word
    TOJ 4119 Split Equally
    TOJ 4003 Next Permutation
    TOJ 4002 Palindrome Generator
    TOJ 2749 Absent Substrings
    TOJ 2641 Gene
    TOJ 2861 Octal Fractions
    TOJ 4394 Rebuild Road
  • 原文地址:https://www.cnblogs.com/jacksonlee/p/10244904.html
Copyright © 2011-2022 走看看