zoukankan      html  css  js  c++  java
  • Mysql学习第三天

    1、对表中数据的增删改(DML)
          create table t_user(
          id int primary key auto_increment,
          name varchar(20) not null,
          email varchar(20) unique
         )

    为表添加记录 (必须掌握)

    insert into 表名[(列名1,列名2...)] values (值1,值2...);
    1.插入一条数据

       1.1指定要插入那些列
           insert into t_user(name,email) values('tom','tom@itcast.cn');
    ****注意: 数据类型为字符串类型的.需要使用单引号包裹.
        1.2不指定插入哪些列, 需要指定每一列的值
            insert into t_user values(null,'jerry','jerry@itcast.cn');
            insert into t_user(name,email) values('汤姆','tom2@itcast.cn');
    =====================================================================================
    SHOW VARIABLES LIKE '%character%'; ==> 查看字符编码配置

          | character_set_client | gbk 客户端的编码 ***
          |
          | character_set_results | gbk 结果集的编码 ***
          |
          | character_set_connection | utf8 客户端连接的编码
          |
          | character_set_database | utf8 数据库默认使用的编码
          |
          | character_set_filesystem | BINARY 文件系统存放时使用的编码

          |
          | character_set_server | utf8 服务器编码 安装时指定的
          |
          | character_set_system | utf8 内部系统编码
      结论: 如果使用cmd 命令控制台操作 数据库,
      注意character_set_client 和 character_set_results 需要设置成GBK, 因为我们的命令控制航使用gbk码表显示中文.
      使用如下命令设置:
      方式:
          set character_set_client=gbk
          set character_set_results=gbk
     注意:
        每次重新连接数据库都要重新设置.
        如果使用的cmd窗口操作数据库. 就修改如下的码表为gbk(cmd窗口使用的是gbk码表).
        这种做法影响的范围只在你当前链接中.
    2、修改一条记录 (必须掌握)

    update 表名 set 列名1 = 值 , 列名2 = 值 ....[where 条件1,条件2...]
         create table t_user(
         id int primary key auto_increment,
         name varchar(20) not null,
         email varchar(20) unique
         )
    2.1、修改表中id为3 的记录, 将name修改为rose;

    update t_user set name='rose' where id=3;
    update t_user set name='rose';
    //-----------------------------------------------------------------------------------------------------
          CREATE TABLE employee (
          id INT,
          NAME VARCHAR(20),
          gender VARCHAR(20),
          birthday DATE,
          entry_date DATE,
          job VARCHAR(30),
          salary DOUBLE,
          RESUME LONGTEXT
          );
          INSERT INTO employee VALUES(1,'zs','male','1980-12-12','2000-12-12','coder',4000,NULL);
          INSERT INTO employee VALUES(2,'ls','male','1983-10-01','2010-12-12','master',7000,NULL);
          INSERT INTO employee VALUES(3,'ww','female','1985-03-08','2008-08-08','teacher',2000,NULL);
          INSERT INTO employee VALUES(4,'wu','male','1986-05-13','2012-12-22','hr',3000,NULL);
    -- 要求
    -- 将所有员工薪水修改为5000元。
    -- 将姓名为’zs’的员工薪水修改为3000元。
    -- 将姓名为’ls’的员工薪水修改为4000元,job改为ccc。

    -- 将wu的薪水在原有基础上增加1000元。
    3、删除记录语句 (必须掌握)
    DELETE FROM 表名 [WHERE 条件];
    3.1、 删除表中名称为’rose’的记录。
    DELETE FROM employee WHERE NAME='rose';
    3.2、 删除表中所有记录。
    DELETE FROM employee ;
    3.3、使用truncate删除表中记录。
    TRUNCATE TABLE employee;
    DELETE 删除 和 TRUNCATE删除(了解) 两者有什么区别?
    首先,这两种都是删除表中的记录.

    不同的是:
    1、 delete 是逐行标记删除. TRUNCATE 是将整张表包括表结构都移除,然后将表重新创建.
    2、 delete DML语句。 TRUNCATE DDL语句。
    3、delete 删除的记录可以被恢复,TRUNCATE 不能回复。
    4.、delete 不释放空间,TRUNCATE 释放空间.
    5、 TRUNCATE 会提交事务. (还没学)

    //-------------------------以上就是 增加 修改 删除 表记录 相关语句 ,(DML)-----------------------------------------------------------
    DQL语句(DML) 查询语句. (必须掌握)

    语法:
          SELECT selection_list /*要查询的列名称*/
          FROM table_list /*要查询的表名称*/
          WHERE condition /*行条件*/
          GROUP BY grouping_columns /*对结果分组*/
          HAVING condition /*分组后的行条件*/
          ORDER BY sorting_columns /*对结果排序*/
           LIMIT offset_start, row_count /*结果限定*/
    //---------------------------------------------------------------------------------------
          CREATE TABLE stu ( --学生表
          sid CHAR(6), -- 学生编号
          sname VARCHAR(50), -- 学生姓名
          age INT, -- 年龄
         gender VARCHAR(50) -- 性别
          );
          INSERT INTO stu VALUES('S_1001', 'liuYi', 35, 'male');
          INSERT INTO stu VALUES('S_1002', 'chenEr', 15, 'female');
          INSERT INTO stu VALUES('S_1003', 'zhangSan', 95, 'male');
          INSERT INTO stu VALUES('S_1004', 'liSi', 65, 'female');
          INSERT INTO stu VALUES('S_1005', 'wangWu', 55, 'male');
          INSERT INTO stu VALUES('S_1006', 'zhaoLiu', 75, 'female');
          INSERT INTO stu VALUES('S_1007', 'sunQi', 25, 'male');
          INSERT INTO stu VALUES('S_1008', 'zhouBa', 45, 'female');
          INSERT INTO stu VALUES('S_1009', 'wuJiu', 85, 'male');
          INSERT INTO stu VALUES('S_1010', 'zhengShi', 5, 'female');
          INSERT INTO stu VALUES('S_1011', 'xxx', NULL, NULL);
    //---------------------------------------------------------------
          CREATE TABLE emp( -- 员工表
          empno INT, -- 员工编号
          ename VARCHAR(50), -- 员工姓名
          job VARCHAR(50), -- 工作
          mgr INT, -- 员工上司的编号
          hiredate DATE, -- 入职日期
          sal DECIMAL(7,2), -- 工资
          comm DECIMAL(7,2), -- 奖金
          deptno INT -- 部门编号
    );
          INSERT INTO emp VALUES(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
          INSERT INTO emp VALUES(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
          INSERT INTO emp VALUES(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
          INSERT INTO emp VALUES(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
          INSERT INTO emp VALUES(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
          INSERT INTO emp VALUES(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
          INSERT INTO emp VALUES(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
          INSERT INTO emp VALUES(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20);
          INSERT INTO emp VALUES(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
          INSERT INTO emp VALUES(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);
          INSERT INTO emp VALUES(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20);
          INSERT INTO emp VALUES(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);
          INSERT INTO emp VALUES(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20);
          INSERT INTO emp VALUES(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);
    1.1 查询所有行所有列
    select * from stu;
    *号 是通配符.通配所有列. 上面语句与下面是一模一样的
    select sid,sname,age,gender from stu;
    谁的效率更高?
    下面的效率更高. *需要运算.
    1.2 查询所有行指定列
    select sname from stu;
    2.1 条件查询介绍
    条件查询就是在查询时给出WHERE子句,在WHERE子句中可以使用如下运算符及关键字:
    ? =、!=、<>、<、<=、>、>=;
    ? BETWEEN…AND;
    ? IN(SET);
    ? IS NULL;
    //---条件连接符
    ? AND; &&
    ? OR; ||
    ? NOT; !
    2.2 查询性别为女,并且年龄小于50的记录
    select * from stu where gender='female' and age<50;
    2.3 查询学号为S_1001,或者姓名为liSi的记录
    select * from stu where sid='S_1001' or sname='liSi';
    数据库中,sql语句不区分大小写 ,但是 数据区分大小写.
    2.4 查询学号为S_1001,S_1002,S_1003的记录
    select * from stu where sid='S_1001' or sid='S_1002' or sid='S_1003';
    select * from stu where sid in('S_1001','S_1002','S_1003');
    2.5 查询学号不是S_1001,S_1002,S_1003的记录
    select * from stu where not (sid='S_1001' or sid='S_1002' or sid='S_1003');
    select * from stu where sid not in('S_1001','S_1002','S_1003');
    2.6 查询年龄为null的记录
    select * from stu where age=null;
    null的特性: null不等于null 所以判断时应如下写法:
    select * from stu where age is null;
    2.7 查询年龄在20到40之间的学生记录
    select * from stu where age >= 20 and age <= 40;
    select * from stu where age between 20 and 40;
    2.8查询性别非男的学生记录
    select * from stu where gender!= 'male';
    select * from stu where not gender='male';
    select * from stu where gender not in ('male');
    2.9 查询姓名不为null的学生记录
    select * from stu where sname is not null;
    select * from stu where not sname is null;
    //--------------------------------------------------------------------------------------------------
    where 字段 like '表达式';
    % => 通配 通配任意个字符.
    _ => 通配 通配单个字符.
    说明: LIKE 条件后 根模糊查询表达式, "_"==> 代表一个任意字符
    3.1查询姓名由5个字母构成的学生记录
    select * from stu where sname like '_____';
    3.2查询姓名由5个字母构成,并且第5个字母为“i”的学生记录
    select * from stu where sname like '____i';
    3.3 查询姓名以“z”开头的学生记录
    说明: "%"该通配符匹配任意长度的字符.
    select * from stu where sname like 'z%';
    3.4查询姓名中第2个字母为“i”的学生记录
    select * from stu where sname like '_i%';
    3.5 查询姓名中包含“a”字母的学生记录
    select * from stu where sname like '%a%';
    //-----------------------------------------------------------------
    4.1 去除重复记录
    关键词: distinct => 去除重复查询结果记录.
    select gender from stu; ==> 出现大量重复的记录
    select distinct gender from stu; =>去除重复的记录
    4.2查看雇员的月薪与佣金之和
    select sal*12+comm from emp;
    null与任何数字计算结果都是null.上面的写法是错误的.
    使用IFNULL(参数1,参数2) 函数解决. 判断参数1的值是否为null,如果为null返回参数2的值.
    select sal*12 + IFNULL(comm,0) from emp;
    *这个函数在所有数据库通用吗?
    不通用.
    4.3 给列名添加别名
    select sal*12 + IFNULL(comm,0) as '年收入' from emp;
    ** select sal*12 + IFNULL(comm,0) '年收入' from emp;
    select sal*12 + IFNULL(comm,0) 年收入 from emp;
    //------------------------------------------------------------------------------------------------------------------------------
    5.1 查询所有学生记录,按年龄升序排序
    asc: 升序
    desc:降序
    select * from stu order by age asc;
    默认就是升序
    select * from stu order by age;
    5.2 查询所有学生记录,按年龄降序排序
    select * from stu order by age desc;
    5.3 查询所有雇员,按月薪降序排序,如果月薪相同时,按编号升序排序
    select * from emp order by sal desc , empno asc;
    聚合函数
    聚合函数是用来做纵向运算的函数:
    ? COUNT():统计指定列不为NULL的记录行数;
    ? MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
    ? MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
    ? SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
    ? AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
    6.1 COUNT
    当需要纵向统计时可以使用COUNT()。
    ? 1>查询emp表中记录数:
    select count(*) from emp;
    2>查询emp表中有佣金的人数:
    select count(*) from emp where comm is not null and comm >0;
    3>查询emp表中月薪大于2500的人数:
    select count(*) from emp where sal > 2500;
    4>统计月薪与佣金之和大于2500元的人数:
    select count(*) from emp where sal+IFNULL(comm,0) > 2500;
    5>查询有佣金的人数并且有领导的人数:
    select count(*) from emp where comm > 0 and mgr is not null;
    6.2 SUM(计算总和)和AVG(计算平均值)
    当需要纵向求和时使用sum()函数。
    1>查询所有雇员月薪和:
    select sum(sal) from emp;
    2>查询所有雇员月薪和,以及所有雇员佣金和:
    select sum(sal),sum(comm) from emp;
    3>查询所有雇员月薪+佣金和:
    select sum(sal+IFNULL(comm,0)) from emp;
    4>统计所有员工平均工资:
    select avg(sal) from emp;
    6.3 MAX和MIN
    ? 查询最高工资和最低工资:
    select max(sal),min(sal) from emp;
    //---------------------------------------------------------------------------------------------------------------------------------------
    分组查询
    当需要分组查询时需要使用GROUP BY子句,例如查询每个部门的工资和,这说明要使用部分来分组。
    ? 1>查询每个部门的部门编号和每个部门的工资和:
    select deptno,sum(sal) from emp group by deptno;
    2>查询每个部门的部门编号以及每个部门的人数:
    select deptno,count(ename) from emp group by deptno;
    3>查询每个部门的部门编号以及每个部门工资大于1500的人数:
    select deptno,count(ename) from emp where sal>1500 group by deptno ;
    HAVING子句
    4>查询工资总和大于9000的部门编号以及工资和:
    select deptno,sum(sal) from emp group by deptno having sum(sal)>9000;
    使用having在分组之后加条件.
    where和having都可以加条件?
    1.where在分组之前加条件.
    2.having在分组之后加条件.
    where的效率要远远高于having. 分组本身消耗资源非常大.
    //----------------------------------------------以下是分页相关知识---------------------------------------------------------------------------------------
    LIMIT(MySQL方言) (必须掌握)
    LIMIT用来限定查询结果的起始行,以及总行数。
    1>查询5行记录,起始行从0开始
    select * from emp limit 0,5;
    2> 查询10行记录,起始行从3开始
    select * from emp limit 3,10;
    3>如果一页记录为5条,希望查看第3页记录应该怎么查呢?
    ? 第一页记录起始行为0,一共查询5行;
    select * from emp limit 0,5;
    ? 第二页记录起始行为5,一共查询5行;
    select * from emp limit 5,5;
    ? 第三页记录起始行为10,一共查询5行;
    select * from emp limit 10,5;

  • 相关阅读:
    Android UI基本测验:线性布局 狼人:
    Android与服务器端数据交互 狼人:
    Windows Phone 7 Tips (1) 狼人:
    基于.NET/C#开发跨平台Windows Phone 7、iPhone及Android应用程序 狼人:
    Windows Phone 7 Tips (4) 狼人:
    Widget开发心得 解决跳转页面和SQLite类问题 狼人:
    在Visual Studio中使用MonoTouch开发iOS应用程序(上):环境配置 狼人:
    Android设计趋势分析10则 狼人:
    Android开发经验分享 狼人:
    初探AIR for Android开发 狼人:
  • 原文地址:https://www.cnblogs.com/java0619/p/8375892.html
Copyright © 2011-2022 走看看