sql语句_自连接_外连接_左连接_子查询_排序_分组

数据库
sql语句
分为DDL,DCL,DLL
1),DDL,data define language: 新建一个数据库
ceate创建 alter修改 drop删
这三条语句,在下面几个组件中,都可以用得到
数据库分为下面几个组件
a,数据库,database
#如果之前已经存在,删除它
drop DATABASE if exists 数据库名;
创建一个数据库
create database 数据库名字;
#进入数据库
use 数据库名;

        b,表   table
                    create table 表名(
                        设置变量,和约束
                        一般变量分的类型分为
                            int     数字
                            varchar 字符串类型 必须是一个介于 1 和 8,000 之间的数值
                            char    指定字符的长度 char(8),你输入的字符小于8时,
                                它会再后面补空值。当你输入   的字符大于指定的数时,
                                它会截取超出的字符
                            datetime 日期加时间
                            date    日期
                            TEXT    text存储可变长度的非Unicode数据
                            tinyint
                    六大约束    
                        主键约束  primamy key
                                一个表只有一个主键,且不能空值
                        唯一约束   unique
                            表示,一行数据中不能有相同的列值,一个表可以定义多个unique的约束
                        检查约束    check   
                            输入一列或多列的值的范围,通过逻辑表达式来判断数据的有效性
                        外键约束   foreign key (ID) references 表名(ID)
                            连接主表与从表,主表中的一个列,与另一个表中的数据相连接,
                            主
                        非空约束 not null
                        默认约束   default 
                    #字符编码的更改
                    )DEFAULT CHARSET=utf8 
        c,视图 view
                    是一个是虚表,只能是本用户自身可以使用,基于sql的查询建立
                    建立view:
        create view lishi as 
                select sname from student,(select ...from) sd WHERE sname like "lishi";
        d,存储过程,(procedure)
                一般用于供外部程序调用,相当于一个把数据封装的概念,能够起到对数据的保护安全的作用
                    能提交处理效率
                    自定义:
                没有返回值,out代表结果输出,out可以有多个也就是说在参数
                in代表
                create procedure pro ([参数[in|out] 数据类型])
                    create procedure sp_search(in p_name varchar(10)
                    begin
                    set @varibale1 = concat('%',p_name,'%');
                    if p_name is null  or p_name='' then
                        select * from t_user;------------------------查找所有
                        else
                    select *from t_user where user_name like @varibale1;-----按条件查找
                        end if;
                    end;    
        调用方法:   call sp_search('李'); 可以接收整个结果,也可以在参数中接收


            e,触发器 

            f,索引 index使用索引的前提是数据量庞大的表
                创建索引的优点是,可以提高查询效率,
                当更新基本表时,自己自动修改索引
                缺点是:当基本表,不断地在更新,删除,增加数据时,会提高维护索引的时间
                创建新的索引:
                        create index 索引名 on 表名()

            g,函数
                主要是用于对数据字段的处理,要有返回值,这是跟存储过程的区别
                        调用方法是,直接select已经写好的函数
                create view lsview AS 
                    select sid,CONCAT(sname,'xxx') sname,sage+10 from student where sname like 'lishi';
                concat(a,b)字符串的连接       sage+10 +10也是一个简单函数
                avg     平均值
                sum     求和
                max     最大
                min     最小
                自定义函数:CREATE function funadd(age int,stand int)

                    returns VARCHAR(20)
                    BEGIN

                    if age >= stand then--------------------这里写各种T-SQL语句
                    return 'old';
                end;
                []代表可以有可无 可以不带前提条件
        调用方法    select 函数名 from..表名

        Transcat-Sql语句  
            变量的声明  控制语句 分支 循环
                case  when可以直接在select语句
        %百分号,放两边%100%  结果表示模糊包含
                放左边%100    结果表示以100开头
                放右边100%   结果表示以100结束
        _下划线,有几个下划线,表示结果后面可以跟几个字符       


2),DML,data manage language: 对数据本身的操作语句
            增insert 删delete 改updata  查select 

            insert into 表名(列名) values('要加入的值');
            insert into classes (cname) values('数学');

            delete from 表名 条件 id为7的;
            delete from zsy where id=7;
            删除可以是没有条件的,不用where,可以直接删除整个表

            update 表名 set 要改的列名里面的外语  where 表里面名字为 英语,
            update classes set cname='外语' where cname='英语';#

            select [distinct] 字段1 as 别名, 函数(),字段1+字段2 ...
            from 表 (基本表,子查询,视图)  表别名  ( left |inner join ) 表2 on 表1.字段 = 表2.字段2...
            where  字段 ( 关系 (any | all) | between ..and | like | in | )  
            and | or  条件2 
            order by 列1,列2 (asc | desc)
            group by 列1,列2
            having 分组以后条件


            select 查表-----------------------
                单表查询----
                    select * from 表名;
                        查表里面所有数据
                    select name,id from student where id=12;
                        查表里面所有id为12的数据,结果要显示名字和id;
                    select * from student where sname like '%lishi%';
                        模糊查询,student里面sname带有lishi的全都显示到结果
                    select sum(sage) from student;#求总数  
                    select avg(sage) from student;#平均值

                    select *from student order by sdate asc;
                        #按sdate查询出整个表的结果,然后进行升序  默认结果为升序排列
                    select *from student order by sdate desc;#
                        #按sdate查询出整个表的结果,然后进行降序 

                    select scid,avg(sage) avg from student group by scid;
                    #先按scid分组,再进行取其年龄平均数,把scid和sage显示到结果里面
                    select sid,sname from student 
                        where (sname like '李四%' and sid=2) or sid=9 order by sdate desc;    

                    从student 查询 id和name  条件是  名字里面有包含  李四的和id为2的,
                        或者id为9的,以date的形式降序排列

-----------------多表查询--------------------
                外连接------------
                    select cname,sname from student,classes;
                        查询两个表,两个表之间用逗号隔开
                    select scid,sname,cname from student,classes where scid=cid;    
                        查询两个表,条件是第一个表的id=第二个表的id;
                还有取别名,如果取了别名的话,一定要使用别名  

                左连接 left join用来查询左侧表的全部记录及右测表的连接字段完全相同于左侧表的记录
                    select cname,count(scid) sum from classes 
                                left join student on student.scid=classes.cid group by cname;
                    查询calsses 和student里面的名字和所有id的,如果是左id=右id的话,把左边名字都列出来,
                    右边如果条件吻合的话也列出来,排序cname分几个小组

        Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”。
                    它的作用是通过一定的规则将一个数据集划分成若干个小的区域


--------------------自连接  树形结构,存到二维表中 自己先复制一份,
                    select sname,cname from category c1,category c2 where c1.pid=c2.cid;

    -----------------------子查询--------------
                    概念就是把查询出来的结果,做为一张表来用,所以有时候select查询语句会写的很长

                any跟all的区别
                    any: 大于的话,就是比最小值要大,大于的话,就是比最小值要小
                    all:  取出最大值 跟前者比较

猜你喜欢

转载自blog.csdn.net/zoeou/article/details/61202048