MySql学习笔记(二)

雇员表:emp
字段名称 字段类型 说明
empno int 员工编号
ename varchar(50)  员工姓名
job varchar(50)  员工工作
mgr int 领导编号
hiredate date 入职日期
sal decimal(7,2) 月薪
comm decimal(7,2) 奖金
deptno int 部分编号


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);






---------------------------------------------------------------------------------------------------
* 模糊查询:like
* 通配符
* _:匹配单个任意字符






比如: 我要查询姓名是3个任意字符组成的
select  * from student sname like='___';
例如:我要查询第二个字符是m的
select * from student where sanme like '_m%';




* %:匹配多个任意字符
例如:我要查询名字中包含m的 select * from student where sname like '%m%';
例如我要查询名字是a开头的 select * from student where sname like 'a%';
例如我要查询名字是b结尾的 select * from student wher like '%b';




* 字段控制:
* 修改字段的别名:AS (可以省略)
* 给字段起别名:
例如:   select sname as 姓名, sage 年龄 from student;
*给运算字段起别名:
例如: select sname as 姓名, (工资+奖金) as 总收入 from student;


* 给表起别名:给每一张表起一个别名。简化书写
` 例如: select stu.sname, stu.sage from student as stu;
* 字段运算:
* null参与的运算,结果都为null  
比如 工资 是100  奖金是null  我们让这两个字段运算 那结果就为null
* 一般会将null替换为0: ifnull(字段名称,如果是null的替换值)  ifnull 是mysql的方言

所有如果奖金字段为null 一般我们把奖金替换为0
例如: select sname,(工资+ifnull(奖金,0)) as 总收入from student;

* 去除重复记录   比如我查询工资是3000的 出现了多条工资为3000 的记录 那我只想展示一条3000的记录  所以可以用 distinct 去除重复记录
* DISTINCT     


例如: select distinct 工资  from student;


排序: order by  默认升序排列  ASC 默认值                DESC 降序排列
按工资从小到大排
select * from student order by 工资 asc;
按工资从大到小排
select * from student order by 工资 desc 
如果出现多条工资一样的 那我们可以指定第二排序条件 
select * from student order by 工资 desc,奖金desc;
 
* 聚合函数:
* 聚合函数是用来做纵向运算的函数:
COUNT():统计指定列不为NULL的记录行数; 统计个数的 比如我统计有多少个学生
select count(sid) from student;  或者传个星 号    select count(*) from student;         一般不要传有null 值的字段


MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
  例如 查询工资最大值    select max(工资) as 最高工资 from student;

MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
例如 查询 最少工资   select min(工资) as 最小工资 from student;
SUM():计算指定列的数值和,如果指 定列类型不是数值类型,那么计算结果为0;
例如 计算总工资  select sun(工资) as 总支出 from student;


AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
例如:计算平均 工资 select avg(工资) as 平均工资 from student;


* 分组查询:group by     一般配合聚合函数使用 查出的数据才有意义
* 查询的字段:
1.分组字段本身
2.聚合函数
比如我按部分编号分组  比如有三个部门 然后我求每个部门的平均工资  那展示出来的数据应该有三条
例如: select 部门编号,AVG(工资) from student group by 部门编号;


1.例如查询 每个部门的部门编号 已经每个部门工资大于1500的人数
select 部门编号, count(*) from student where 工资>1500 group by 部门编号;
注意这里的 where 是对分组前的条件限定 也就是说不满足条件的 不参与分组



* where和having
* where:在分组之前对条件进行限定。不满足条件,就不会参与分组
* having:在分组之后,对结果集的筛选


2.例如 我要查询 各个部门平均工资 大于2000 的部门


select 部门编号,avg(工资) from student group by 部门编号 having avg(工资)>2000;


3. 例如我要查询 各个部门  员工工资大于1500 的平均工资  并且平均工资 大于2000的部门


上面这句话怎么理解呢? 首先查询各个部门 那肯定要按部门编号分组 分组前的条件限定是 员工工资大于1500的才参与分组
计算出平均工资  然后对结果再进行筛选 筛选出 平均工资 大于2000的部门

  select 部门编号,avg(工资) from student group by 部门编号 where avg(工资)>1500 having  avg(工资)>2000;


* 分页查询:limit
* limit 0,5 开始的记录索引, 每一页显示的条数     索引从0开始
开始的记录索引  = (页码-1)*每一页显示的条数


例如 我显示第一页  每页5条记录
select * from student limit 0,5 ;  这是第一页 5 条记录
select * from student limit 5,5 ; 这是第二页 5条记录
select * from student limit 10,5 这是第三页 5条记录

* oracle:rownum 分页方言

* sqlserver:top 分页方言

约束:
作用:
为了保证数据的有效性和完整性
mysql中常用的约束:主键约束(primary key)  唯一约束(unique) 非空约束(not null) 外键约束(foreign key)
主键约束:被修饰过的字段唯一非空
注意:一张表只能有一个主键,这个主键可以包含多个字段
方式1:建表的同时添加约束 格式: 字段名称 字段类型 primary key
方式2:建表的同时在约束区域添加约束 
所有的字段声明完成之后,就是约束区域了
格式: primary key(字段1,字段2)

create table pk01(
id int,
username varchar(20),
primary key (id)
);

insert into pk01 values(1,'tom');-- 成功
insert into pk01 values(1,'tom');-- 失败 Duplicate entry '1' for key 'PRIMARY'
insert into pk01 values(null,'tom');-- 失败  Column 'id' cannot be null

create table pk01(
id int primary key,
username varchar(20),
primary key (id)
);-- 错误的 一张表只能有一个主键

方式3:建表之后,通过修改表结构添加约束
create table pk02(
id int,
username varchar(20)
);

alter table pk02 add primary key(字段名1,字段名2..);
alter table pk02 add primary key(id,username);

insert into pk02 values(1,'tom');-- 成功
insert into pk02 values(1,'tomcat');-- 成功
insert into pk02 values(1,'tomcat');-- 失败

唯一约束:(了解)
被修饰过的字段唯一,对null不起作用
方式1:建表的同时添加约束 格式: 字段名称 字段类型 unique
create table un(
id int unique,
username varchar(20) unique
);

insert into un value(10,'tom');-- 成功
insert into un value(10,'jack');-- 错误 Duplicate entry '10' for key 'id'
insert into un value(null,'jack');-- 成功
insert into un value(null,'rose');-- 成功

方式2:建表的同时在约束区域添加约束 
所有的字段声明完成之后,就是约束区域了
unique(字段1,字段值2...)
方式3:建表之后,通过修改表结构添加约束
alter table 表名 add unique(字段1,字段2);-- 添加的联合唯一
alter table 表名 add unique(字段1);-- 给一个添加唯一
alter table 表名 add unique(字段2);-- 给另一个添加唯一

////////////////
create table un01(
id int,
username varchar(20)
); 
alter table un01 add unique(id,username);
insert into un01 values(1,'tom');-- 成功
insert into un01 values(1,'jack');-- 成功
insert into un01 values(1,'tom');-- 失败  Duplicate entry '1-tom' for key 'id'
/////////////////////
非空约束(了解)
特点:被修饰过的字段非空
方式:
create table nn(
id int not null,
username varchar(20) not null
);

insert into nn values(null,'tom');--  错误的 Column 'id' cannot be null
///////////////////////////////

发布了38 篇原创文章 · 获赞 1 · 访问量 5464
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章