MySQL学习笔记(三)

138 阅读5分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

接上文

4、表的结构

  • 不看表内容 , 只看表的结构 desc + 表名 ;
  •  mysql> desc dept;
     +--------+-------------+------+-----+---------+-------+
     | Field  | Type        | Null | Key | Default | Extra |
     +--------+-------------+------+-----+---------+-------+
     | DEPTNO | int(2)      | NO   | PRI | NULL    |       |     部门编号
     | DNAME  | varchar(14) | YES  |     | NULL    |       |     部门名称
     | LOC    | varchar(13) | YES  |     | NULL    |       |     地理位置
     +--------+-------------+------+-----+---------+-------+
     3 rows in set (0.15 sec)
     ​
     mysql> desc emp ;
     +----------+-------------+------+-----+---------+-------+
     | Field    | Type        | Null | Key | Default | Extra |
     +----------+-------------+------+-----+---------+-------+
     | EMPNO    | int(4)      | NO   | PRI | NULL    |       |   员工编号
     | ENAME    | varchar(10) | YES  |     | NULL    |       |   员工姓名
     | JOB      | varchar(9)  | YES  |     | NULL    |       |   工作岗位
     | MGR      | int(4)      | YES  |     | NULL    |       |   上级编号
     | HIREDATE | date        | YES  |     | NULL    |       |   入职日期
     | SAL      | double(7,2) | YES  |     | NULL    |       |   工资
     | COMM     | double(7,2) | YES  |     | NULL    |       |   补助
     | DEPTNO   | int(2)      | YES  |     | NULL    |       |   部门编号
     +----------+-------------+------+-----+---------+-------+
     8 rows in set (0.00 sec)
     ​
     mysql> desc salgrade ;
     +-------+---------+------+-----+---------+-------+
     | Field | Type    | Null | Key | Default | Extra |
     +-------+---------+------+-----+---------+-------+
     | GRADE | int(11) | YES  |     | NULL    |       |      工资等级
     | LOSAL | int(11) | YES  |     | NULL    |       |      最低工资
     | HISAL | int(11) | YES  |     | NULL    |       |      最高工资
     +-------+---------+------+-----+---------+-------+
     3 rows in set (0.00 sec)
    

5、MySQL常用命令

  • 详情参见第二部分

6、字符占用空间

  • 一个字母为一个字节
  • 一个汉字为三个字节

1.1 SELECT语句

  • 注意:select语句不会更改原表之中的任何内容,只负责检索、查询

  • select 后面可以跟字段名(自变量) , 也可以跟字面量/ 字面值(数据)

    • 如果select后面跟的是字段名,那么查询字段
    • 如果跟的是数据,那么会借助这个表的结构, 形成这个数据表
1.1.1 简单查询
 select 字段名 from 表名 ;                        // 查询一个字段
 select 字段名1,字段名2,... from 表名;             // 查询多个字段
 select * from 表名 ;                            //  查询所有字段(效率低、可读性差)
 select 字段名 as 新字段名 from 表名;              // 给查询的列起别名
 /*注意:只是将列名的显示改为新的名称,原表不变。select语句不会更改原表之中的任何内容
         as可以省略,但只能显示一个字符。
         假设起别名是有空格,加上单引号 
         字符串用单引号标起来(标准),双引号在oracle数据库中无法使用
         在列之中的字段可以使用数学表达式
         别名是中文,属于字符串,用单引号括起来即可*/
 ​
1.1.2 条件查询
  • 查询出来符合条件的

  • 格式 : select 字段名1 , 字段名2 , 字段名3 ... from 表名 where 条件 ;

  • 条件查询的条件:

    • = \ <>或 != \ < \ <= \ > \ >= \ between...and ... \ is null \ and \ or \ in \ not \ like \ % \ _
 1= 等于
  【案例】:查询薪资等于800的员工的姓名和编号
  select empno,ename from emp where sal=800 ;
 ​
 2<>!= 不等于
  【案例】:查询薪资不等于800的员工的姓名和编号
   select empno,ename from emp where sal<>800 ;
   select empno,ename from emp where sal!=800 ;
   
 3<  小于
  【案例】:查询薪资小于2000的员工的姓名与编号
   select empno,ename from emp where sal<2000 ; 
  
 4<= 小于等于
  【案例】:查询薪资小于3000的员工的姓名与编号
   select empno,ename from emp where sal<=3000 ; 
  
 5> 大于
  【案例】:查询薪资小于2000的员工的姓名与编号
   select empno,ename from emp where sal>4000 ; 
  
 6>= 大于等于
  【案例】:查询薪资小于2000的员工的姓名与编号
   select empno,ename from emp where sal>=4000 ; 
  
 7、between... and... 两个值之间,等同于 >= and <=
 注意:使用此语句时必须保证左小右大 , 闭区间,包含两端的值
  【案例】:查询薪资小于2000的员工的姓名与编号
   select empno,ename from emp where sal between 2000 and 4000 ; 
   select empno,ename from emp where sal >= 2000 and sal <= 4000 ; 
  
 8is (not) null 
  【案例】:查询津贴(补助)(不)为null的员工姓名和员工编号
   select empno,ename from emp where comm is null;
   select empno,ename from emp where comm is not null ;
   
 9and 并且
  【案例】:查询工作岗位是manager并且工资大于2500的员工信息
  select * from emp where job = 'manager' and sal > 2500 ;
 ​
 10or 或者
  【案例】:查询工作岗位是manager或者是salesman的员工信息
  select * from emp where job = 'manager' or job = 'salesman';
  
  【注意】:andor 同时出现,and 优先级高 , 先执行and。
  【语句】: select * from emp where sal > 2500 and deptno = 10 or deptno = 20 ;
       表达的意义是工资大于2500并且dept = 10 的人,或者是deptno = 20 的所有人
        select * from emp where sal > 2500 and (deptno = 10 or deptno = 20) ;
        表达的意义是工资大于2500的人,同时是dept = 10 或者deptno = 20 的所有人
  
 11、(not) in 包含,相当于多个or
  【案例】:查询工作岗位是manager或者是salesman的员工信息
   select * from emp where job in ('manager', 'salesman');
   【注意】:in后面是具体的值,不是区间
 ​
 12not   not 可以取非 , 主要用在isin之中
  
 13like   like称为模糊查询,支持% 或者_匹配 
             %    匹配任意个字符
             _    一个下划线只匹配一个字符
 【案例】: 找出姓名中含有'o'的员工信息
   select * from emp where ename like '%o%' ;
 【案例】:找出姓名中以T结尾的
   select * from emp where ename like '%t';
 【案例】:找出姓名以k开始的
   select * from emp where ename like 'k%';
 【案例】:找出姓名第二个字母是A的
   select * from emp where ename like '_a%';
 【案例】:找出第三个字母是r的
   select * from emp where ename like '__r%';
 【案例】:找出名字中含有下划线的
   select * from emp where ename like '%_%';     // 反斜杠代表转义, 类似于转义字符
1.1.3 排序
  • 格式 : select 字段名1 , 字段名2 , 字段名3 ... from 表名 order by 字段名 ;(默认升序排列)
  • 格式: select 字段名 from 表名 where 条件 order by 排序方式 ;
 【案例】:查询所有员工薪资
   select ename , sal from emp order by sal ;            // 默认升序
   select ename , sal from emp order by sal asc ;        // 指定升序排列 
   select ename , sal from emp order by sal desc ;       // 指定降序排列 
 【案例】:按照员工名字和薪资排列,按照薪资升序排列,如果相同按照姓名升序排列
   select ename , sal from emp order by sal asc , ename asc ;    // 多字段排序
 【案例】:按照查询结果的第二列排列 
   select ename , sal from emp order by 2 ;              // 不建议,因为不健壮
   
 【案例】:找出工资在12503000之间的员工信息,按照薪资的降序排列
 格式: select 字段名 from 表名 where 条件 order by 排序方式 ;
   select ename , sal from emp where sal between 1500 and 3000 order by sal desc ;

\