zoukankan      html  css  js  c++  java
  • MySQL: 2、SQL语言 ①概念、分类

    一、SQL的简介:

      1.SQL的概念:

        SQL就是结构化查询语言,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统

      2.SQL的作用:

          - 是所有关系型数据库的统一查询规范,不同的关系型数据库都支SQL

          - 不同数据库之间的SQL也有一些区别,这个称为 方言

      3.SQL的注释方式:

        -- 空格    单行注释

        /* */      多行注释

        #         MySql特有的单行注释

    二、SQL的分类

      分类      说明

        数据定义语言  简称DDL(Data Definition Language),用来定义数据库对象:数据库,表,列等。
      数据操作语言  简称DML(Data Manipulation Language),用来对数据库中表的记录进行更新。
      数据查询语言  简称DQL(Data Query Language),用来查询数据库中表的记录。
      数据控制语言  简称DCL(Date Control Language),用来定义数据库的访问权限和安全级别,及创建用户
      

     三、DDL数据定义语言:操作数据库、表

       DDL操作数据库

      1、创建数据库

        create database 数据库名;            -- 创建指定名称的数据库

        create database 数据库名 character set 字符集;  -- 创建指定名称的数据库并指定字符集

        ps: 如果没设置字符集,那么数据库默认使用的是Latin1字符集,也就是ISO-8859-1。

           该数据库下的表也会使用该字符集

      2、查看、选择数据库

        use 数据库;      -- 切换数据库

        select database();    -- 查看当前正在使用的数据库

        show databases;    -- 查看MySQL中都有哪些数据库

        show create database 数据库名;  -- 查看一个数据库的定义信息

      3、修改数据库字符集
        alter database 数据库名 character set 字符集;  -- 修改数据库字符集
      4、删除数据库
        drop database 数据库名;  -- 从mysql中永久删除某个数据库
     
     DDL操作数据表
      0、首先要知道MySQL常见的数据类型:
         1)常用的数据类型:
          int     整形
          double   浮点型
          varchar  字符串型,再定义时必须指定长度,否则会报错
          char    字符串型
          date          日期类型,yyyy-MM-dd , 只有年月日,没有时分秒
            datetime 日期类型,显示为 yyyy-MM-dd HH:mm:ss
         
         ps: 需要注意的是MySQL中的 char 类型 与 varchar类型都对应了 Java中的字符串类型,它们的区别在于:
            -- char 类型是固定长度的,根据定义的字符串长度分配足够的空间
            -- varchar 类型是可变长度的,只使用字符串长度所需的空间
           
            比如: 用x和y分别来保存字符串 "abc"
              x char(10) 占用10个字节
              y varchar(10)占用3个字节
            适用场景:
              char适用存储固定长度的字符串,比如密码等
              varchar适用存储在一定范围内,有长度变化的字符串
        
        2)MySQL数据类型
           

       2、创建表

        create table 表名(

          字段名1   字段类型(长度),

          字段名2  字段类型      -- 注意最后一列不需要加逗号  

        )ENGINE=InnoDB DEFAULT CHARSET = utf8;

        

       3、查看表

        show tables; -- 查看当前数据库中所有的表名

        desc 表名;    -- 查看数据库表的结构

        show create table  表名;  -- 查看表的字符集

       4、删除表

        drop table 表名;  -- 从数据库中删除表

        drop table if exists 表名;-- 判断表是否存在,存在就删除,不存在就不删除

       5、修改表

        rename table 旧表名 to 新表名;          -- 修改表名

        alter table 表名 character set 字符集;          -- 修改表的字符集

        alter table 表名  add 字段名 字段类型;        -- 向表中添加字段

        alter table 表名 modify 字段名 字段类型;       -- 修改表中字段的数据类型或者长度

        alter table 表名 change 旧字段名 新字段名 类型(长度);   -- 修改字段名

        alter table 表名 drop 字段名;              -- 删除字段名

     四、DML数据操作语言:操作表中数据

      1、往表中插入数据

        方式1:插入全部字段,并将所有字段名都写出来
          insert into 表名 (字段名1,字段名2...) values(字段值1,字段值2...);
      
        方式2:插入全部字段,但是不写字段名
          insert into 表名 values(字段值1,字段值2...);
        
        方式3:指定插入字段的值
          insert into 表名 (字段名1) values(字段值1)

       ps: 1. varchar char date 类型的值必须使用单引或者双引号
          2. 如果插入空值,可以忽略不写或者插入null

      2、更改表中数据的值   

       方式1: 不带条件的修改,也就是修改全部字段的数据
          update 表名 set 列名 = 值;
        
       方式2:带条件的修改   update 表名 set 列名 = where 条件表达式:字段名 = 值;   update 表名 set 列名 = 值,列名 = where 条件表达式:字段名 = 值;
     3、删除表中的数据 
       方式1: 删除表中所有数据
        delete from 表名;
        truncate table 表名;
        
        ps:着两种都是直接删除表中所有的数据,但这两种又有些区别
          delete from 表名; --》 有多少条记录就执行多少次删除操作,效率低
          truncate table 表名; --》 先删除整张表,然后再重新创建一张一模一样的表,效率高    


       方式2: 根据条件删除数据
        delete from 表名 where 字段名 = 值;


    五、DQL数据查询语言:查询表中的数据
    1、简单查询
        1. 查询表中多少有数据:
            select *  from 表名;
        
        2. 查询表中的所有记录,但仅显示特定的字段
            select 字段1,字段2 from 表名;
            
        3. 查询表中的数据,并将列名用其他别名显示
            select
                eid AS '编号',
                ename AS '姓名',
                sex AS '性别',
                salary AS '薪资',
                hire_date '入职时间', -- AS 可以省略
                dept_name '部门名称'
            FROM emp;
            
        4. 查询表中的数据,并去掉重复的数据
            -- 使用distinct 关键字,去掉重复部门信息
            SELECT DISTINCT dept_name FROM emp;
        
        5. 查询表中的数据,并将查询结果参与运算
           SELECT ename , salary + 1000 FROM emp;

     2、条件查询  
        如果查询语句中没有设置条件,就会查询所有的行信息,在实际应用中,
        一定要指定查询条件,对记录进行过滤
        
        select 列名 from 表名 where 条件表达式;
        * 先取出表中的每条数据,满足条件的数据就返回,不满足的就过滤掉
    
        1.比较运算符:
        
        
        2.逻辑运算符
          
    
        3.模糊查询、通配符
            
            # 查询含有'精'字的所有员工信息
            SELECT * FROM emp WHERE ename LIKE '%精%';
            
            # 查询以'孙'开头的所有员工信息
            SELECT * FROM emp WHERE ename LIKE '孙%';
            
            # 查询第二个字为'兔'的所有员工信息
            SELECT * FROM emp WHERE ename LIKE '_兔%';
            
            # 查询没有部门的员工信息
            SELECT * FROM emp WHERE dept_name IS NULL;
            -- SELECT * FROM emp WHERE dept_name = NULL; 错误方式
            
            # 查询有部门的员工信息
            SELECT * FROM emp WHERE dept_name IS NOT NULL;

       

      3、排序

        - 通过 ORDER BY 字据可以将查询出的结果进行排序(排序只显示效果,不会影响真实数据)

        - 语法结构:

          select 字段名  from 表名 [ where 字段 = 值 ]  order by  字段名 [ asc / desc] ;

          asc 表示升序(默认)    desc 表示降序

        - 单列排序: 只按照某一个字段进行排序,就是单列排序    

          - 案例: 通过salary字段对emp表的数据进行排序

              -- 默认升序排序 asc

                select * from emp order by salay;

              -- 降序排序

                select * from emp order by salay desc;

        - 组合排序: 同时对多个字段进行排序,如果第一个字段相同就按照第二个字段进行排序,以此类推

          - 案例:再salary字段的基础上再按照id进行排序,如果salary字段相同就以id做降序排序

              -- 组合排序

                select * from emp order by salary desc, eid desc;

       

       4、聚合函数

        - 聚合函数就是纵向查询,它对某一列的值进行计算,然后返回一个单一的值,另外聚合函数回忽略null空值

        - 语法结构:  

          select  聚合函数(字段名) from 表名;

        - 常用的聚合函数:

          

        - 例子:

         #1 查询员工的总数

           -- 统计表中的记录条数 使用 count()

            select count(eid) from emp;   -- 使用某个字段

            select count(*) from emp;    -- 使用 *

            select count(1) from emp;    --  使用1 与 * 的效果相同

          -- 下面这条sql 得到的总条数不准确,因为count函数会忽略空值

           所以再做统计时尽量不要使用带null的列进行统计

          select  count(name) from emp;

         #2 查看员工总薪水、最高最小薪水、薪水平均值

          select 

             sum(salary) as '总薪水',

             max(salary) as '最高薪水',

               min(salary) as '最低薪水',

             avg(salary) as '平均薪水'

          from emp;    

        #3 查询薪水大于4000的员工个数

          select count(eid) from emp where  salary > 4000;  

        #4 查询部门为 '教学部' 的所有员工的个数

          select count(*) from emp where dept_name = '教学部';

        #5 查询部门为 '市场部' 所有员工的平均薪资

            select avg(salary)  as '市场部平均薪资' from emp where dept_name = '市场部';       

       

      5、分组查询 

        - 分组查询是指使用 group by 语句对查询的信息进行分组,相同数据作为一组

        - 语法格式:

          select 分组字段/聚合函数  from 表名 group by 分组字段 [having 条件];

        - 案例:

          #1.  查询有几个部门

            select dept_name as '部门名称' from emp group by dept_name;

          #2. 查询每个部门的平均薪资

            select dept_name as '部门名称', avg(salary) as '平均薪资' from emp group by dept_name;

          #3. 查询每个部门的拼接薪资,部门名称不能为null

            select

              dept_name as '部门名称',

              avg(salary) as '平均薪资'

            from emp wherer dept_name is not null group by dept_name;

          #4. 查询平均薪资大于6000的部门,需要再分组后在次进行过来,使用having

            select

              dept_name as '部门名称',

              avg(salary) as '平均薪资' 

            from emp where dept_nameis not null droup by dept_name having avg(salary) > 6000 ;

          

          # where 与 having的区别:

             where 进行分组前过滤且where 后面不能写聚合函数

           having 进行分组后过滤且 having后面可以写聚合函数

      6、limit分页查询    

        - limit是限制的意思,用于限制返回的查询结果的行数,limit语法是mysql的方言,主要用来完成分页操作

        - 语法结构:

          select 字段1,字段2.... from 表名  limit offset , length;

        - 参数说明:

          limit  offset, length;  关键字可以接受一个或者两个为0或者正整数的参数

          offset 起始行数,从0开始计数,如果省略默认为0

          length 返回的行数

        - 案例:

          -- 查询emp表中前5条数据

            select * from emp limit 5;

            select * from emp limit 0, 5;

          -- 查询emp表中 从第4条开始的数据,查询6条

            select * from emp limit 3,6;

          -- 分页操作 每页显示3条数据

            select * from emp limit 0,3;   -- 第一页

            select * from emp limit 3,3;   -- 第二页 

            select * from emp limit 6,3;   -- 第三页

          -- 分页公式: 起始索引= (当前页 - 1) * 每页条数

    六、DCL数据控制语言:用来定义数据库的访问权限和安全级别,及创建用户

      MySql默认使用的都是 root 用户,超级管理员,拥有全部的权限。除了root用户以外,

          我们还可以通 过DCL语言来定义一些权限较小的用户, 分配不同的权限来管理和维护数据库

      

      1、创建用户

        格式: CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';

            主机名:指定该用户在哪个主机上可以登陆,本地用户可用 localhost 如果想让该

                用户可以从任意远程主机登陆,可以使用通配符 %

        案例:

          1)创建 admin1 用户,只能在 localhost 这个服务器登录 mysql 服务器,密码为 123456

           CREATE USER 'admin1'@'localhost' IDENTIFIED BY '123456';

          2) 创建 admin2 用户可以在任何电脑上登录 mysql 服务器,密码为 123456

           CREATE USER 'admin2'@'%' IDENTIFIED BY '123456';

              ps: % 表示 用户可以在任意电脑登录 mysql服务器.

      2、用户授权

        格式:GRANT 权限 1, 权限 2... ON 数据库名.表名 TO '用户名'@'主机名';

        

          案例:

          1) 给 admin1 用户分配对 db4 数据库中 products 表的 操作权限:查询

             GRANT SELECT ON db4.products TO 'admin1'@'localhost';

          2) 给 admin2 用户分配所有权限,对所有数据库的所有表

             GRANT ALL ON *.* TO 'admin2'@'%';

       

       3、查看权限

        格式:

          SHOW GRANTS FOR '用户名'@'主机名';

        案例:

          SHOW GRANTS FOR 'root'@'localhost';

          

        

        4、删除用户:DROP USER '用户名'@'主机名';

          -- 删除 admin1 用户

          DROP USER 'admin1'@'localhost';

        5、查询用户

         选择名为 mysql的数据库, 直接查询 user表即可

         SELECT * FROM USER;

  • 相关阅读:
    Python元组、列表、字典
    测试通过Word直接发布博文
    Python环境搭建(windows)
    hdu 4003 Find Metal Mineral 树形DP
    poj 1986 Distance Queries LCA
    poj 1470 Closest Common Ancestors LCA
    poj 1330 Nearest Common Ancestors LCA
    hdu 3046 Pleasant sheep and big big wolf 最小割
    poj 3281 Dining 最大流
    zoj 2760 How Many Shortest Path 最大流
  • 原文地址:https://www.cnblogs.com/hzaixt/p/13723528.html
Copyright © 2011-2022 走看看