小白入门数据库(MySQL)操作之二

目录

数据库类型

1.整数:

2. 浮点数:

3. 字符串:

4. 日期类型:

经常使用的数据库操作

主键约束(primary key)

主键约束+自增(auto_increment) 

注释(comment)

导入*.sql 文件

非空约束(is null 和 is not null)

去重 distinct

比较运算符 (> < >= <= =  !=和<>)

and和or

between x and y  包含x和y

in

综合练习

模糊查询 (like)

排序 order by 字段名

分页查询 (limit)

数值计算 (+ - * / %)

别名

聚合查询

分组查询 group by xxx

having

各种关键字的顺序

综合练习

附上练习操作的数据库


数据库类型

1.整数:

    int(m) 和 bigint(m) m代表显示长度(补0)    bigint等效java中的long   

       create table t_int(id int,age int(10) zerofill);

        insert into t_int values(1,18);

       select * from t_int;

2. 浮点数:

double(m,d) m总长度 d小数长度   double(5,3)   26.378   ,decimal是一个超高精度的浮点数,精度远高于double,只有涉及到超高精度运算时才会使用

3. 字符串:

- char(m)不可变长度 char(5) "abc" 占5 最大字符长度255,  

- varchar(m) 可变长度 节省空间 最大字符长度为65535 但是超过255建议使用text

- text可变长度的字符串类型 长度65535

4. 日期类型:

- date: 只能保存年月日

- time: 只能保存时分秒

- datetime: 默认值null   最大值9999-12-31

- timestamp: 时间戳 默认值当前系统时间 2038-1-19 

     create table t_date(t1 date,t2 time,t3 datetime,t4 timestamp);

     insert into t_date values("2019-10-12",null,null,null);

     insert into t_date values(null,"10:37:20",

        "2019-10-11 11:11:11",null);

经常使用的数据库操作

主键约束(primary key)

- 约束: 创建表时给表字段添加的限制条件

- 主键: 表示数据唯一性的字段称为主键

- 主键约束: 唯一且非空

        create table t1(id int primary key,name varchar(10));

        insert into t1 values(1,'aaa'); //成功

        insert into t1 values(2,'aaa'); //成功

        insert into t1 values(2,'bbb');  //报错 不能重复

        insert into t1 values(null,'ccc');// 报错 不能为空

主键约束+自增(auto_increment) 

- 从历史最大值+1  只增不减

    create table t2(id int primary key auto_increment,name varchar(10));

    insert into t2 values(null,'aaa');    //1

    insert into t2 values(null,'bbb');    //2

    insert into t2 values(10,'bbb');      //10

    insert into t2 values(null,'ccc');    //11

    delete from t2 where id>=10;

    insert into t2 values(null,'ddd');    //12

注释(comment

- 创建表时给字段添加的介绍信息

    create table t3 (id int comment '这是主键',name varchar(10) comment '这是名字');

    show create table t3;

导入*.sql 文件

- linux系统:   把文件放到桌面

    source /home/soft01/桌面/xxx.sql;

- windows系统: 把文件放到d盘根目录

    source d:/xxx.sql;

- 检查是否成功:

1. show databases; 查看是不是出现了一个newdb3数据库

2. use newdb3;    使用 导入的这个数据库

3. show tables;   查看是否有 emp和dept两个表

4. select * from emp  查看数据  如果出现乱码 执行 set names gbk;后再查询

非空约束(is null 和 is not null)

1. 查询没有上级领导的员工信息

    select * from emp where mgr is null;

2. 查询有上级领导的员工信息

    select * from emp where mgr is not null;

去重 distinct

1. 查询员工所从事的职业有哪些

    select distinct job from emp;

比较运算符 (> < >= <= =  !=和<>)

查询工作不是程序员的员工姓名和工作

    select ename,job from emp where job!='程序员';

    select ename,job from emp where job<>'程序员';

and和or

- and类似java中的 &&

- or类似java中的||

1. 查询1号部门工资低于1500的员工信息

    select * from emp where deptno=1 and sal<1500;

2. 查询2号部门员工或工资高于2000的员工姓名,工资和部门编号.

    select ename,sal,deptno from emp where deptno=2 or sal>2000;

between x and y  包含x和y

1. 查询工资在2000到3000之间的员工姓名和工资

    select ename,sal from emp where sal>=2000 and sal<=3000;

    select ename,sal from emp where sal between 2000 and 3000;

in

查询工资等于800,3000,1500的员工信息

    select * from emp where sal=800 or sal=3000 or sal=1500;

    select * from emp where sal in(800,3000,1500);

综合练习

1. 查询有上级领导并且是1号部门的员工信息

    select * from emp where mgr is not null and deptno=1;

2. 查询2号部门中工资在1000到2000之间的员工信息

    select * from emp where deptno=2 and sal between 1000 and 2000;

3. 查询1号部门中有哪几种不同的工作

    select distinct job from emp where deptno=1;

模糊查询 (like)

- %:  代表0或多个未知字符

- _:  代表一个未知字符

- 举例:

    1. 以x开头     x%

    2. 以y结尾     %y

    3. a开头b结尾   a%b

    4. 第二个字符是x   _x%

    5. 包含x      %x%

    6. 第三个字符是x倒数第二个字符是y   __x%y_

1. 查询名字中以孙开头的员工信息

    select * from emp where ename like "孙%";

2. 查询工作中包含销售的员工姓名和工作

    select ename,job from emp where job like '%销售%';

排序 order by 字段名

- 格式: order by 字段名 (默认升序 desc降序),字段名

1. 查询每个员工的姓名和工资 按照工资升序

    select ename,sal from emp order by sal ;

2. 查询3号部门的员工姓名和工资 按照工资降序排序

    select ename,sal from emp where deptno=3 order by sal desc;

3. 查询每个员工的姓名,工资和部门编号 按照部门编号升序,如果部门编号相同则按照工资降序排序

    select ename,sal,deptno from emp order by deptno,sal desc;

分页查询 (limit)

- 格式: limit 跳过的条数,请求的条数(每页的条数)

- 公式:limit (页数-1)*条数,条数

1. 查询每个员工的编号,姓名,工资 按照工资降序排序 查询前三条数据

    select empno,ename,sal from emp order by sal desc limit 0,3;

2. 查询每个员工的编号,姓名,工资 按照工资降序排序 查询第二页的三条数据

    select empno,ename,sal from emp order by sal desc limit 3,3;

3. 查询工资在1000到3000之间的员工信息 按照工资降序排序第3页的2条数据

    select * from emp where sal between 1000 and 3000 order by sal desc limit 4,2;

数值计算 (+ - * / %)

1. 查询每个员工的姓名,工资和年终奖(工资*5)

    select ename,sal,sal*5 from emp;

别名

- 给查询的字段起一个别的名字

    select ename as '名字' from emp;

    select ename '名字' from emp;

    select ename 名字 from emp;

聚合查询

- 对查询的多条数据进行统计查询

- 平均值 最大值 最小值 求和 计数

1. 平均值 avg(字段)

-  查询1号部门的平均工资

    select avg(sal) from emp where deptno=1;

2. 最大值 max(字段)

-  查询1号部门的最高工资

    select max(sal) from emp where deptno=1;

3. 最小值 min(字段)

- 查询员工表中的最低工资

    select min(sal) from emp;

4. 求和 sum(字段)

- 查询2号部门的工资总和

    select sum(sal) from emp where deptno=2;

5. 计数 count(字段)

- 一般场景用count(*) 即可

- 查询2号部门有多少人

    select  count(*)  from emp where deptno=2;

分组查询 group by xxx

- 如果需求中出现每个或每种这样的关键字 则使用分组查询

1. 查询每个部门的平均工资

    select deptno,avg(sal) from emp group by deptno;

2. 查询每个部门的最高工资

    select deptno,max(sal) from emp group by deptno;

3. 查询每种职位的工资总和

    select job,sum(sal) from emp group by job;

4. 查询每种职位的员工人数

    select job,count(*) from emp group by job;

5. 查询每个部门工资大于1500的员工人数

    select deptno,count(*) from emp where sal>1500 group by deptno;

6. 查询1号和3号部门的最低工资  

    select deptno,min(sal) from emp where deptno in(1,3) group by deptno;

having

- where 后面只能写普通字段的条件,不能写聚合函数条件

- 如果条件是聚合函数的条件 则必须使用having

- having要和group by 结合使用

1. 查询每个部门的平均工资 要求平均工资大于2000;

    select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;

2. 查询每个部门的平均工资,只查询工资在1000-3000之间的员工,并且过滤掉平均工资低于2000的部门

    select deptno,avg(sal) from emp where sal between 1000 and 3000 group by deptno having avg(sal)>=2000;

各种关键字的顺序

- select ...... from 表名 where ....group by....having....

 order by...... limit ....;

综合练习

1. 查询没有上级领导的员工编号empno,姓名,工资

SELECT EMPNO,ENAME,SAL FROM EMP WHERE MGR IS NULL;

2. 查询有奖金的员工姓名和奖金

SELECT ENAME,COMM FROM EMP WHERE COMM>0;

3. 查询名字中包含精的员工姓名和工资

SELECT ENAME,SAL FROM EMP WHERE ENAME LIKE '%精%';

4. 查询名字中第二个字是八的员工信息

SELECT * FROM EMP WHERE ENAME LIKE '_八%';

5. 查询1号部门工资大于2000的员工信息

SELECT * FROM EMP WHERE DEPTNO=1 AND SAL>2000;

6. 查询2号部门或者工资低于1500的员工信息

SELECT * FROM EMP WHERE DEPTNO=2 OR SAL<1500;

7. 查询工资为3000,1500,5000的员工信息按照工资升序排序

SELECT * FROM EMP WHERE SAL IN(3000,1500,5000) ORDER BY SAL;

8. 查询3号部门的工资总和

SELECT SUM(SAL) FROM EMP WHERE DEPTNO=3;

9. 查询每个部门工资大于1000的员工人数,按照人数升序排序

SELECT DEPTNO,COUNT(*) FROM EMP WHERE SAL>1000 GROUP BY DEPTNO ORDER BY COUNT(*);

10. 查询每种工作中有领导的员工人数按照人数降序排序

SELECT JOB,COUNT(*) C FROM EMP WHERE MGR IS NOT NULL GROUP BY JOB ORDER BY C DESC;

11. 查询所有员工信息,按照部门编号升序排序,如果部门编号一致则工资降序

SELECT * FROM EMP ORDER BY DEPTNO,SAL DESC;

12. 查询有领导的员工,每个部门的编号和最高工资

SELECT DEPTNO,MAX(SAL) FROM EMP WHERE MGR IS NOT NULL GROUP BY DEPTNO;

13. 查询有领导的员工,按照工资升序排序,第3页的2条数据

SELECT * FROM EMP WHERE MGR IS NOT NULL ORDER BY SAL LIMIT 4,2;

14. 查询每个部门的工资总和,只查询有上级领导的员工并且要求工资总和大于5400,最后按照工资总和降序排序,只查询结果中的第一条数据

SELECT DEPTNO,SUM(SAL) S FROM EMP WHERE MGR IS NOT NULL GROUP BY DEPTNO HAVING S>5400 ORDER
BY S DESC LIMIT 0,1;

附上练习操作的数据库

创建数据库

CREATE DATABASE newdb3;

进入数据库

USE newdb3;

创建(dept)表结构

CREATE TABLE `dept` (
  `DEPTNO` int(4) NOT NULL,
  `DNAME` varchar(14) NOT NULL,
  `LOC` varchar(13) DEFAULT NULL,
  PRIMARY KEY (`DEPTNO`),
  UNIQUE KEY `DNAME` (`DNAME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

往表中插入数据

insert  into `dept`(`DEPTNO`,`DNAME`,`LOC`) values (1,'神仙','天庭'),(2,'妖怪','盘丝洞'),(3,'普通人','北京'),(4,'赛亚人','外星球');

创建表(emp)结构

CREATE TABLE `emp` (
  `EMPNO` int(4) NOT NULL,
  `ENAME` varchar(10) NOT NULL,
  `JOB` varchar(9) DEFAULT NULL,
  `MGR` int(4) DEFAULT NULL,
  `HIREdate` date DEFAULT NULL,
  `SAL` double(7,2) DEFAULT NULL,
  `COMM` double(7,2) DEFAULT NULL,
  `DEPTNO` int(4) DEFAULT NULL,
  PRIMARY KEY (`EMPNO`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

往表中添加数据

insert  into `emp`(`EMPNO`,`ENAME`,`JOB`,`MGR`,`HIREdate`,`SAL`,`COMM`,`DEPTNO`) values (1,'孙悟空','销售',4,'1980-12-17',800.00,NULL,1),(2,'猪八戒','销售',4,'1981-02-20',1600.00,300.00,1),(3,'沙僧','销售',4,'1981-02-22',1250.00,500.00,1),(4,'唐僧','销售经理',8,'1981-04-02',2975.00,NULL,1),(5,'刘备','项目经理',NULL,'1981-09-28',1250.00,1400.00,3),(6,'关羽','程序员',5,'1981-05-01',2850.00,NULL,3),(7,'张飞','程序员',5,'1981-06-09',2450.00,NULL,3),(8,'观音','CEO',NULL,'1981-11-17',5000.00,NULL,1),(9,'白骨精','人事',8,'1981-09-08',1500.00,0.00,2),(10,'蜘蛛精','人事',8,'1981-12-03',950.00,NULL,2),(11,'黑熊怪','市场',8,'1981-12-03',3000.00,NULL,2);

若出现中文乱码

set names gbk;

Guess you like

Origin blog.csdn.net/weixin_45511500/article/details/105701262