DBMS: database manager system

检索数据
select 检索表中的一个或多个列

子句:SQL语句由子句构成,有些是必须的,有些可选.比如select语句的from就是子句

    order by子句  排序检索子句
        位置:保证是select语句的最后一条子句
        可以通过非选择列排序

        按多个列排序如 order by name,price 先排名字,如果名字相同在排价格
        按列位置排序如 order by 2,3        先排select清单的第二列如果相同再排第三列(select排序用的是
                                            非select清单的列就不能使用)
        指定排序方向  升序(A-Z) 默认asc
                        降序(Z-A) order by price desc

    where子句 过滤数据
        位置:再from子句之后
            where子句操作符
            =                   等于
            <>                  不等于
            !=                  不等于
            <                   小于
            <=                  小于等于
            !<                  不小于
            >                   大于
            >=                  大于等于
            !>                  不大于
            between             在指定值之间(包括两端)
            is null             为null值
        单引号的使用:限定字符串(串类型的数据用)   非串类型不用
            如   where name = 'wy'   where price = 100;
        检查单个值   <  >
        不匹配检查   <> !=什么的
        范围值检查   where price between 10 and 100;
        空值检查    where price is null;

    高级数据过滤
        组合where子句:SQL允许使用多个where子句.这些子句用and子句或or子句的方式使用

        操作符:用来联结或改变where子句中的子句的关键字.(也叫逻辑操作符)

        and操作符  where price = 100 and where name = 'wy';
        or操作符   where price = 100 or where name = 'wy';

        计算次序    where可以包含任意的and和or操作符结合以进行更复杂的过滤操作
            无圆括号优先处理and 由括号处理括号

        in操作符   指定条件范围,范围中每个条件都可以进行匹配,值用','分开且在括号内(XXX,XXX,XXX);
                    where name in ('wy','zyx');
        not操作符  否定后面的条件(mysql只支持not exists)

    通配符过滤
        like操作符:搜索子句使用通配符时,必须用like操作符
            %通配符:任何字符出现任意次数 fish%   fish开头的字符串
                                            %fish%  包含fish的字符串
            _通配符:匹配单个字符         fish_   fishX   X为一个字符
            []通配符:

    创建计算字段

        计算字段

        拼接字段:||(推荐)或 + 将字段联结起来
            (mysql不支持||+,但是使用concat()函数 count(name, '(' ,id , ')' );  结果wy(001)  );
                                    CONCAT(vend_name,'---', vend_country);     网易--中国

            使用别名: as关键字: as XXX

        执行算数计算  可以将字段运算结果作为字段输出(+-*/)
            select price*quantity as price from order;


数据处理函数(不同的数据库可能不同)
    常见函数
        获取串         sunstring()
        数据类型转换  convert()
        获取当前日期  getdate()

    使用
        1.处理文本串(删除或填充值,转换大小写)
        2.算数操作(返回绝对值,代数运算)
        3.处理日期和时间值(日期只差,日期有效性)
        4.返回特殊信息(用户登录信息)

    文本处理函数
        left()                  返回串左边的字符        select left('cat and dog',5);   结果  cat a
        length()                返回串的长度
        lower()                 转小写
        ltrim()                 去掉串左边的空格
        right()                 返回串右边的字符
        rtrim()                 去掉串右边的空格
        soundex()               返回串的soundex值(匹配发音类似的东东)
        upper()                 转大写

    日期于时间处理函数       日期格式    'xxxx-xx-xx'    '1002-12-22 01:20:21'   不是很严格(容错强)
        select year(日期);    获取年
        select mouth(日期);   月
        select hour(日期);    小时  
        ........

数据汇总
    聚集函数:运行在行组上返回单个值
        1.确定符合条件的行数
        2.获得表中行组的和
        3.找出特定列极值,平均
        avg()       求平均             忽略值为null的列
        count()     某列的行数           count(*)包括null的列    count(XXX)忽略值为null的列
        max()       某列的max          忽略值为null的列      最大值最大时间最大文本的列的值     
        min()               
        snm()       求和              忽略值为null的列  sum(quantity*item_price) 求总价钱

    聚集不同值
        默认指定参数all(不需指定)
        distinct参数去重复   select avg(distinct price) from orders;
            //distinct 只能用于count(XXX) 不能用于count(*)  

    分组数据
        分组是在select语句的group by子句中建立的
        1.group by 可以包含任意数目的列
        2.如果group by 内嵌套了分组,数据将在最后的分组上进行汇总
        3.group by子句列出的每个列都必须是检索列或有效的表达式(不能是聚集函数).
        4.
        5.select语句的每个列都必须在group by 中给出(否则没意义)
        6.如果分组中由null则作为一个分组返回.如果有多个null,他们将分为一个组.
        7.group by 子句出现在where之后,order by 之前

    过滤分组:因为where过滤的是列而不是组,所以用having子句对组过滤
        where子句可以用的语法having也可以用(通配符,多个操作符什么的)

        区别:
            where:在分组前过滤
            having:分组后过滤

    分组与排序

使用子查询
    子查询:嵌套在其他查询中的查询

    利用子查询进行过滤
        只能是单列:作为子查询的select只能是查询单个列
    作为计算字段使用子查询

联结表
    创建联结表
        select id,name from t1,t2 where 条件;
        where语句过滤(如果不规律最大输出t1*t2条记录)
    内部联结
        select id,name from t1 inner join t2 on 条件;
        与上条语句一样
    完全限定列名(防止歧义)    表名.字段



创建高级联结

    使用表别名
        1.缩短SQL语句
        2.允许在单条select语句中多次使用相同的表
        表名 as 表别名

    自联结

插入数据
数据插入(要保证由足够权限)
insert into t1 values(值1,值2…);
插入部分行 (省略的列必须允许null,有默认值)
insert into t1(字段1,字段2…) values(值1,值2…);
插入检索出的数据
insert into t1 (字段…) select 字段… from t2;
复制oracle的 select into语句
select 字段1, 字段2…into tCopy from t;
select * into tCopy from t;

mysql的
    create table tCopy as select * from t;

更新和删除数据update,delete(小心使用)
更新
1.更改特定行
2.更改所有行
update 表名 set 字段名=XXX where XXXX;(不写where过滤就麻烦了,全改)
删除
1.删除特定行
2.删除所有行
delete from 表名 where XXX;(不写where过滤就麻烦了,全删内容表还在)
truncate炸掉表(表都木有)

创建和操纵表
创建
create table 表名 (字段1,字段2….);
create table 表名 (字段1 not null,字段2,字段3….);
使用null值
见上条语句(就一个字段不写not null)
指定默认值
create table 表名 (字段1 default 1,字段2,字段3….);
一般默认的是时间值(mysql用curren_date());
create table stu2 (
id int,
name varchar(100) default ‘xiaoming’,
sdate timestamp default current_timestamp //时间默认为当前时间
);

更新表alter table
    加字段     alter table 表名 add 字段;
    删字段     alter table 表名 drop 字段;
    修改列类型   ALTER TABLE 表名 MODIFY job varchar(60);
    修改列名    ALTER TABLE user CHANGE name username varchar(100);
删除表drop
    drop table 表名;
重命名rename
    RENAME TABLE employee TO user;

未完待续~~