SQL的分类使用(增删改查)

1.SQL的分类使用(*代表重点的程度)
    DDL ** (Data Definition Language)数据库定义语言
        用来定义数据库对象: 库 表 列 等
    DCL (Data Contorl Language)数据控制语言
        用来定义访问权限 和 安全级别
    DML ** (Data Manipulation Language)数据操作语言
        用来定义数据库记录(数据):增 删 改
    DQL *****(Data Query Language)数据查询语言
        用来查询记录(数据): 查询

   SQL的语法:
    1.sql语句 以 英文 ; 号 作为一条语句的结束 所有符号必须都是英文
    2.sql大小写区分问题 (表名 列表)
        windows 不区分大小写
        unix/linux 区分大小写

    1.1 DDL 用来定义数据库对象: 库 表 列
        关键字 create / alter / drop
    
        对数据库的操作:
            cmd ---> 进入数据库 mysql -u root -p -->输入密码 出现welcome...证明登录成功
        1.1.1 查询
            查看当前数据库服务器中 有几个库
            show databases;
            查看前面创建的数据库定义信息
            show create database 数据库名;
        1.1.2 创建
            create database 数据库名;
            create database 数据库名 character set utf8; 创建数据库 并设置字符集
        1.1.3 修改
            修改数据库编码集
            alter database 数据库名 character set gbk;
        1.1.4 删除
            drop database 数据库名;
        1.1.5 其他
            查看当前正在使用的数据库
            select database();
            切换数据库
            use 数据库名;
            查看当前库下所有的表
            show tables;
        对表的操作:
        1.1.6 创建
            create table 表名(
                字段名1 字段类型 约束条件,
                字段名2 字段类型 约束条件,
                字段名3 字段类型 约束条件,
                .....
                字段名N 字段类型 约束条件
            )
            字段名 -->表头
            字段类型 ---> 规定列可以存储的数据类型是什么
            约束条件 ---> 可省略不写

            MySQL中的常用数据类型:
                int 整型
                float 浮点型 double 浮点型
                float(5,2) 表示最多可5位 其中 必须有2位是小数
                        999.99
                decimal 用来存储工资 从MySQL 5.1之后才有
                char 固定长度的字符串类型 char(10) 'aaa       '占10位
                varchar 可变长度字符串类型 varchar(10) 'aaa' 占3位
                text 字符串类型 超长
                blob 字节类型
                date 日期类型 格式为 yyyy-MM-dd
                time 时间类型 格式为 HH:mm:ss
                timestamp 时间戳类型 yyyy-MM-dd HH:mm:ss 会自动赋值 会自动赋值当前时间
                datetime 时期类型yyyy-MM-dd HH:mm:ss
        1.1.7 修改
            alter 修改表的字符集
                alter table 表名 character set 字符集;
            change 修改列名 用来给字段重命名 不能修改字段的类型 和 约束
                alter table 表名 change 旧字段名 新的字段名 数据类型
            modify 修改列属性 只能修改类型和约束条件
                alter table 表名 modify 字段名 字段类型

            修改表名
                alter table 原表名 rename 新表名
                rename table 原表名 to 新表名
        1.1.8 删除
            drop table 表名
        1.1.9 查看
            查看数据库中的表结构
            desc 表名;
            查看创建表的语句
            show create table 表名
            查看数据库中所有的表
            show tables;
        
        对字段的操作:
            新增字段
                alter table 表名 add 新增的字段名 字段类型
            删除字段
                alter table 表名 drop 字段名

    1.2 DCL (Data Contorl Language)数据控制语言
        用来定义访问权限 和 安全级别
        主要包括 创建用户 / 给用户授权 / 对用户撤销授权 / 删除用户
        需要使用root 登录 才可以

        1.2.1 创建用户
            create user 用户名@xxx identified by '密码';

            xxx 表示创建的用户 使用ip地址
                可以设置为 localhost 代表本机
                       或者 % 代表允许所有ip地址登录
        1.2.2 给用户分配权限
            grant 权限1,权限2....权限n on 数据库.* to 用户名@xxx;
            如果想要将数据库所有操作权限全都授予用户
                all
            grant all on 数据库.* to 用户名@xxx;
        1.2.3 撤销授权
            revoke 权限1,权限2....权限n on 数据库名.* from 用户名@xxx;
        1.2.4 查看用户的权限
            show grants for 用户名@xxx;
        1.2.5 删除用户
            drop user 用户名@xxx;
            
    1.3 DML
        不要与 DDL 混淆 增删改对表中的数据进行操作
        insert 增加
        update 修改
        delete 删除//delect删除不了约束,就是auto——increament的默认的值
        注意:
            在mysql中 字符串类型 和 日期类型 都要使用引号 引起来 '' ""
            用来操作数据
        1.3.1 insert 增加 插入
            insert into 表名(列名1,列名2....列名n) values(值1,值2...值n)
        
            注意:
                1. 列名 可省略 但是在插入数据的时候和表结构完全一致
                2. 列名 和 值 的类型/个数/顺序 必须一致
                3. 如果插入 空值 请使用 null
                4. 日期类型 可以使用- , . 分割 或者不分割 "2018-3-12"
                5. 同时可以插入多条数据(值1,值2...值n),(值1,值2...值n),(值1,值2...值n)....
        1.3.2 update 修改
            update 表名 set 列名1=值1,列名2=值2.... where 列名=值
            
            注意:
                1.where子句 可省略
                    写 就是修改符合条件的那个
                    如果不写 就是修改当前表中的所有记录
        1.3.3 delete 删除
            delete from 表名 where 列名=值
            
            注意:
                1.where子句 可省略
                    写 就是删除符合条件的那个
                    如果不写 就是删除表中所有的记录
            
            删除表中所有记录
                delete from 表名
                    删除表中的数据 表结构还在 删除后 数据可找回
                truncate table 表名//truncate后面不能有条件能删除约束


                    删除是直接把表drop掉
                    然后创建一个同样的新表
                    删除后 数据不能找回 执行速度比delete快
    1.4 DQL 数据查询语言 非常重要
        select
            select 列名 from 表名 where --> group by --> having --> order by --> limit

            where --> group by --> having --> order by --> limit 可不写
            数据库执行DQL语句 不会对数据进行改变
            而是让数据库发送结果集 返回给客户端
            查询返回的结果 是一张虚拟表

            * 是查询所有列 实际开发中尽量少用
            只要获取想要的列就可以了

            select 列名 /*要查询的结果 列*/
            from 表名 /*要查询的表名称 (多张表联合查询)*/
            where 行条件
            group by 对结果进行分组
            having 分组后的行条件
            order by 对结果的排序
            limit 从x开始,取N个 结果限定
        基础查询
            1.查询所有列 select * from 表名
            2.查询指定列 select 列名1,列名2... from 表名
        条件查询
            条件车讯 是在查询时 给出where 子句
            在where子句中 可以给出一些关键字来用作条件匹配
            将符合条件的数据查询出来
        
        符号
            > < != <> = >= <=
            between...and.. 两者之间 >= <= 包含边界

            in 在xxx范围内
            is null 是空的
            and 和
            or 或者
            not 非

            SELECT * FROM stu WHERE age BETWEEN 20 AND 75;
            SELECT * FROM stu WHERE age >=20 AND age<=75;
            /*性别是女的 并且 年龄 小于30*/
            SELECT * FROM stu WHERE gender='female' AND age<30;
            /*查询 sid是 S_1002 或者 性别为男的*/
            SELECT * FROM stu WHERE sid='S_1002' OR gender='male';
            /*查询性别是null的记录*/
            SELECT * FROM stu WHERE gender IS NULL;
            /*查询性别 非男的*/
            SELECT * FROM stu WHERE gender !='male';
            SELECT * FROM stu WHERE gender <>'male';
            SELECT * FROM stu WHERE NOT gender ='male';
        /*模糊查询*/
            like
            通配符
                % 任意0-n个字母
                _ 任意一个字母

            /*查询学生名字 有五个字母组成的记录 结尾是 i组成*/
            SELECT * FROM stu WHERE sname LIKE "____i";
            SELECT * FROM stu WHERE sname LIKE "__";
            /*查询名字 以w开头*/
            SELECT * FROM stu WHERE sname LIKE "w%";
            /*查询名字中 包含a的*/
            SELECT * FROM stu WHERE sname LIKE "%a%";
        /*字段控制查询*/
            1.去除重复记录
            distinct
            /*去除重复*/
            SELECT DISTINCT sname FROM stu;
            2.判断列的值是否是空
                IFNULL(列名,值) 用指定值 替换 null
            /*查看 员工 薪资 和 奖金的和*/
            SELECT *,sal+IFNULL(comm,0) AS total FROM emp;

            3.AS 起别名
              可以给 列 / 表 起别名
              AS关键字可不写
              原名 as 别名
        /*排序 order by*/ 根据xx来进行排序 默认是升序的

            asc 升序
            desc 降序
            /*根据学生年龄 升序 / 降序*/
            SELECT * FROM stu ORDER BY age DESC;
            /*获取员工信息 先按照工资升序 然后按照奖金 降序*/
            SELECT * FROM emp ORDER BY sal ASC,comm DESC;

升序和降序可在一起使用(先紧着第一个,相同看后一个)一般在日期中使用


        /*聚合函数*/
            sum avg max min count
            用来做纵向运算的函数
            count() 统计指定列 不为null 的行数
            max()/min() 最大最小值
            sum() 求和
            avg() 平均数

            聚合函数 不能放在where子句里
            聚合函数 是针对结果集进行的

            where条件并不是在查询出结果之后才运行的
            所以放在where语句中 会报错
        sql语句的执行过程
            from-->where-->group by-->having-->select-->order by-->limit

            count()
            /*查询表中记录数*/
            SELECT COUNT(*) FROM emp;
            /*查询emp表中 有奖金的人数*/
            SELECT COUNT(comm) FROM emp;
            /*查询 月薪 与 奖金之和 大于>2500的人数*/
            SELECT COUNT(*) FROM emp WHERE sal + IFNULL(comm,0)>2500;
        /*分组查询*/
            group by 当需要分组查询的时候 就是用 group by 子句
            理解为 "根据(by)一定的规则进行分组(group)"
        /*having*/
            where 是先过滤 后分组
            having 先分组 再过滤
        
        having 和 where 的区别
            1.having 是在分组后 对数据进行过滤
              where 是在分组前 对数据进行过滤
            2.having后面可以使用聚合函数
              where后面不可以

              where是对分组前 记录的条件 如果某行记录 没有满足where条件 将不会参与分组
              having是对分组后的数据进行筛选

            /*查询 工资总和 大于9000 的部门编号 以及 工资和*/
            SELECT deptno,SUM(sal) FROM emp GROUP BY deptno HAVING SUM(sal)>9000;
            /*错误写法 查询 工资总和 大于9000 的部门编号 以及 工资和*/
            SELECT deptno,SUM(sal) FROM emp WHERE SUM(sal)>9000 GROUP BY deptno;
         /*limit*/ 用来限定查询结果的起始行 以及总行数
            从哪儿开始 取几个
            /*查询五行记录 从第几行开始 起始行是0 0代表第一行 */
            SELECT * FROM emp LIMIT 5,5;
  
        分页查询
            35条记录需要分页显示
            1.需要获取 总行数 count() = 35
            2.确定每一页要显示的数量 pageSize = 10
            3.确定一共分多少页
                page = count%pageSize==0?count/pageSize:count/pageSize + 1
            4.
              第一页 起始行 0 一共查询10
                select * from xx limit 0,10
              第二页 起始行 10~19
                select * from xx limit 10,10
              第三页 起始行 20~19
                select * from xx limit 20,10
               ...

              每页的起始行 = (页码-1)*pageSize

   =============条件语句运算符===============

==============条件语句运算符优先级====================


**************************
查询语句书写顺序:
    select -- from -- where -- group by -- having -- order by -- limit
查询语句执行顺序:
    from -- where -- group by -- having -- select -- order by -- limit

猜你喜欢

转载自www.cnblogs.com/wanghuaying/p/9483705.html