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;格式化了日期和时间,只显示年月日

  • 相关阅读:
    新东西-intel edison
    MFC AfxMessageBox(_T("Please Load Rawdata First !"));
    libgl1-mesa-glx:i386 : 依赖: libglapi-mesa:i386
    开源硬件_瑞芯微开发板
    手机方案商
    嵌入式Linux应用开发__求职要求
    工作要求
    Proc文件系统接口调试
    Sysfs文件系统接口调试
    Ubuntu Linux 解决 bash ./ 没有那个文件或目录 的方法
  • 原文地址:https://www.cnblogs.com/jacksonlee/p/10244904.html
Copyright © 2011-2022 走看看