数据库2——查询

所要用到的关键字:
select from where group by having order by limit
where 条件使用的关键字:
=! < > <= >=
in between and
is null is not null
and or not
通配符:_ %
模糊查询: like
聚合函数:max min avg count(统计指定列不为NULL的记录行数)
字段控制查询
分组查询
limit 查询
多表查询
//////////////////////////////////////////////////////
假设已知存在的列,stu emp

一:基础查询

所涉及的关键字:select …from…

//1.查询所有列
select * from stu;
//2.查询指定的列
select sid from stu;
select sid, name from stu;

**

二: 条件查询

**
关键字:where
=! < > <= >=
in between and
is null is not null
and or not

//1.查询年龄为50 的女性的信息
select * from stu where gender='female' and age>50 
//2.查询学号为S_1001 或者是姓名为liSi 的记录
select * form where sid='S_1001' or sname='Lisi';
//3.查询学号为S_1001,S_1002,S_1003的记录
select * from stu where sid in('S_1001','S_1002','S_1003');
//4.查询学号不是S_1001,S_1002,S_1003的记录
select * from stu where sid not in('S_1001','S_1002','S_1003');
//5.查询年龄为null 的记录
select * from stu where age is null;
select * from stu where age is not null;
//6.查询年龄在20到40之间的学生记录
select * from stu where age>20 and age<40;
select * from stu where between 20 and 40;
//7.查询性别非男的学生记录
select * from stu where gender !='male';

**

三: 模糊查询

**
关键字:where like
通配符:
_ :任意一个字母
%:任意0~n 个字母

//1.查询姓名由5个字母构成的学生记录
seletc * from stu where sname like '_____';//五个下划线
//2.查询姓名由5个字母构成,并且第5个字母为“i”的学生记录
select * from stu where sname like '____i';
//3.查询姓名以“z”开头的学生记录
select * from stu where sname like 'z%';
//4.查询姓名中第2个字母为“i”的学生记录
select * from stu where sname like '_i%';
//5.查询姓名中包含“a”字母的学生记录
select * from stu where sname like '%a%';

**

四:字段控制查询

**
去重复:distinct (两行或两行以上记录中系列的上的数据都相同)
滤空函数:ifnull()
给列起别名: 空格或者是as
排序:order by ASC (升序 默认)DESC(降序)

//1.去重复,两行数据相同才会踢出重复的
SELECT DISTINCT deptno FROM emp;
SELECT DISTINCT deptno,mgr FROM emp;
//2. 查看雇员的月薪与佣金之和(任何值和null 运算都是null)
SELECT sal+IFNULL(comm,0) FROM emp;

//3.滤空函数//ifnull(comm,0)函数:comm为null则取零,
SELECT IFNULL(comm,0) FROM emp;
//4. 给列起别名
SELECT sal+IFNULL(comm,0) AS total FROM emp;

SELECT sname AS 姓名,gender  性别 FROM stu;
//5.排序
SELECT * FROM stu;
SELECT * FROM stu ORDER BY sname ASC;
SELECT * FROM stu ORDER BY sname ASC,age DESC;

**

五:聚合函数

**
max min :纵行求最大值和最小值
avg sum: 纵向的求平均数和求和
count:当需要纵向统计时可以使用COUNT(),统计非空的行

//1.查询表中的行数
select count(*) from stu; 
//2.查询表中拥有佣金的人数
select count(sal) from emp;
//3.查询佣金大于2500 的人数
select  count(sal) c from emp where sal>2500;

//4. 统计月薪和佣金之和大于2500 的人数
select count(*) from emp where sal+ifnull(comm,0)>2500;
//5.查询有佣金和有领导的人数
select count(*) from emp where sal is not null and mgr is not null;
select count(sal),cout(comm) from emp ;

**

扫描二维码关注公众号,回复: 3845167 查看本文章

六:分组查询

**
关键字:group by

//1.查询每个部门的部门编号和每个部门的工资和
select deptno,sum(sal) from emp group by deptno;
//2.查询每个部门的编号以及每个部门的人数
//操作的对象都是分组后的部门
select deptno,count(*) from emp group by deptno;
//3.查询每个部门的部门编号以及每个部门工资大于1500 的人数
//后半句操作对象是每个人,前半句是分组后的部门
select deptno,count(*) from emp  where sal >1500 group by deptno ;

//1.分组查询是:将符合分组条件的行归列到一起,再判断前面的具体要求
//2.带有where order by 的语句从后面往前看,执行的顺序:
select 查找的数据 from 表 where 未分组时对数据筛选 order by 分组依据 having 对分组后的数据的操作 order by 排序

LIMIT
LIMIT用来限定查询结果的起始行,以及总行数。
应用为: 分页查询

//查询5行记录,起始行从0开始
SELECT * FROM emp LIMIT 0, 5;

/////////////////////////////////////////////////////////////////////////////////
**

七:数据的完整性:

**
1.实体完整性:
2.域完整性:
3.引用完整性:
///
实体完整性:
实体就是一行,实体完整性就是保证没有重复的行
约束类型:主键约束(primary key) 唯一约束(unique) 自动增长列(auto_increment)
1.逐渐约束:每个表都要有一个主键,保证数据唯一,并且不为空,主键是唯一能确定这一行数据的,在去重复依赖的就是由主键判断两行数据是否一致

//添加方式一;
create table(
	id int primary key,
	name varchar(5);
);
//添加方式二:
create table (
	id int ,
	name varchar(*)
	primary key(id)
);
//添加方式三:
create table (
	id int ,
	name varchar(20)
);
alter table emp add primary key(id);

2.唯一约束
数据不重复

CREATE TABLE student(
Id int primary key,
Name varchar(50) unique
);
//
unique(name)
//
alter table emp add unique(name);

3.自动增长列

给主键添加自动增长的数值,列只能是整数类型
CREATE TABLE student(
Id int primary key auto_increment,
Name varchar(50)
);

4.域的完整性:使用基本数据类型
5.引用完整性(参照完整性,多表)

//外键约束:FOREIGN KEY 

CREATE TABLE student(
sid int pirmary key,
name varchar(50) not null,
sex varchar(10) default ‘男’
);

create table score(
	id int,
	score int,
	sid int , -- 外键列的数据类型一定要与主键的类型一致
	CONSTRAINT fk_score_sid foreign key (sid) references student(id)
);
//第二种添加外键方式。
ALTER TABLE score1  ADD CONSTRAINT  fk_stu_score FOREIGN KEY(sid) REFERENCES stu(id);

表之间的关系
表之间建立关系是通过
*主外键的关联,**主外键的存在是为了保证数据的完整性,保证你在插入,修改删除的时候不出现数据的错误,与表的查询没有关系
1. 一对多(多对一):(从不同的角度,有主次关系)
2. 多对多:(无论从哪个角度都是一对多,没有主次关系,要借助第三张表)

八:多表查询(两个表一定有联系)
关键字:
合并查询: 将两个表的查询结果合并到一起
条件:查询的列数相同,列的类型相同

select * from emp1
unique all    //不去重复//unique 要去重复的数据
select * from deptno
//默认去重复是一行数据每个属性之都相同

在这里插入图片描述

**

连接查询:

**
外连接,内连接,自然连接

select * from  emp,deptno;
//查出的数据是两个表的数据做笛卡儿积的结果

//查询之后可以用主键筛选不符合的数据‘

SELECT * FROM student,score WHERE student.sid=score.sid;-- 将主外键数据对应就不会出错
-- 内链接 99查询法
SELECT s.sid,s.name,c.score1 FROM student s,score c WHERE s.sid=c.sid; -- 筛选的时候在注意一下
-- 内连接标准查询法
SELECT  s.sid,s.name,c.score1 FROM student s JOIN score c ON s.sid=c.sid; -- 通过主外键筛选,符合的数据
-- 外连接  左连接/右连接
SELECT s.sid,s.name,c.score1 FROM student s LEFT JOIN score c ON s.sid=c.sid;
SELECT s.sid,s.name,c.score1 FROM  score c LEFT JOIN student s  ON s.sid=c.sid;
-- 右连接
SELECT s.sid,s.name,c.score1 FROM student s RIGHT JOIN score c ON s.sid=c.sid; 
SELECT s.sid,s.name,c.score1 FROM score c RIGHT JOIN student s ON s.sid=c.sid; 

**

## -- 多表查询

**
CREATE TABLE course(
	courseid INT,
	cname VARCHAR(50)
);
-- 方法99
SELECT s.sid,s.name,c.score1,cc.courseid,cc.cname FROM student s,score c ,course cc WHERE s.sid=c.sid AND c.courseid=cc.courseid;
-- 内连接方法,将查到的表在作为一个表和其他的表查询
SELECT s.sid,s.name,c.score1,cc.courseid,cc.cname FROM student s JOIN score c ON s.sid=c.sid
JOIN course cc ON cc.courseid=c.courseid

**

子查询:(重要)

**

-- 子查询有多个select 
-- 查询与SCOTT同一个部门的员工

SELECT * FROM emp WHERE deptno=(
SELECT deptno FROM emp WHERE ename='scott');

-- 1.	工资高于JONES的员工

SELECT * FROM emp WHERE sal>(
SELECT sal FROM emp WHERE ename='jones');

-- 工资高于30号部门所有人的员工信息

SELECT * FROM emp WHERE sal>( 
SELECT MAX(sal) FROM emp WHERE deptno=30);

SELECT * FROM emp WHERE sal>ALL(SELECT sal FROM emp WHERE deptno=30);

-- 查询工作和工资与MARTIN(马丁)完全相同的员工信息

SELECT * FROM emp WHERE job=(
SELECT job FROM emp WHERE ename='martin')
AND
sal =(SELECT sal FROM emp WHERE ename='martin');

SELECT * FROM emp WHERE(job,sal) IN (SELECT job,sal FROM emp WHERE ename='martin');

-- 有2个以上直接下属的员工信息

SELECT * FROM emp WHERE (empno) IN (
SELECT mgr FROM emp  GROUP BY mgr HAVING COUNT(mgr)>=2);

-- 查询员工编号为7788的员工名称、员工工资、部门名称、部门地址--多表查询
SELECT e.ename,e.sal,d.dname,d.loc FROM emp e,dept d WHERE e.deptno= d.deptno AND empno=7788;
-- 用子表的方式
SELECT e.ename,e.sal,d.dname,d.loc  FROM emp e,(SELECT * FROM dept) d WHERE e.deptno= d.deptno AND empno=7788;

-- 自连接查询
-- 求7369员工编号、姓名、经理编号和经理姓名

SELECT e1.empno,e1.ename,e2.empno,e2.ename FROM emp e1,emp e2 WHERE e1.mgr=e2.empno AND e1.empno=7369;

-- 求各个部门薪水最高的员工所有信息

SELECT * FROM emp WHERE (sal) IN(
SELECT MAX(sal) FROM emp GROUP BY deptno); 

select e* from emp e,  (select max(sal) maxsal,deptno from emp group by deptno) a   where e.deptno = a.deptno   and e.sal =a.maxsal

SELECT *FROM emp;

数据库数据的导出(备份)
 mysqldump –u用户名 –p密码 数据库名>生成的脚本文件路径
数据库数据的导入(恢复)
SOURCE C:\mydb1.sql
注意:在恢复数据的时候要查看原数据库中是否有相同的部分


重大总结:理解sql 语句,特别是查询的时候的条件 分组,都从语句的后面往前面看


数据库中的函数:

-- 与时间有关的函数
-- 时间增减
SELECT ADDTIME('15:30:2','1:1:1');
-- 当前日期
SELECT CURRENT_DATE();
-- 当前(时分秒)
SELECT CURRENT_TIME();
-- 当前时间戳(年月日 时分秒)
SELECT CURRENT_TIMESTAMP();
-- 当前系统时间(年月日 时分秒)
SELECT NOW();
-- 返回日期部分
SELECT DATE(NOW());
-- 返回当前日期的年月日部分
SELECT DAY(NOW());
SELECT MONTH(NOW());
SELECT YEAR(NOW());
-- 在当前的日期上再加上时间或者日期
SELECT DATE_ADD(NOW(),INTERVAL 1 DAY);
SELECT DATE_ADD(NOW(),INTERVAL-1 YEAR);
SELECT DATE_ADD(NOW(),INTERVAL -1 HOUR);
-- 两个日期的差--只能算相差的天数
SELECT DATEDIFF(NOW(),'2018-9-16');


--  字符串相关函数
-- 返回字串字符集
SELECT CHARSET('skdow');
-- 连接字符串
SELECT CONCAT('sw','sd');
-- 返回子串在串中的位置,从1开始,没有返回0
SELECT INSTR('accnien','c');
-- 转换成大写/小写
SELECT UCASE('hdihwi');
SELECT LCASE('SHIHI');
-- 从字符串的左边起多少多少个字符
SELECT LEFT('hihih',3);
-- 字符串的长度
SELECT LENGTH('siwhidh0');
-- 字符串中的替换
SELECT REPLACE('hudhwud','dh','mm');
-- 字符串逐字比较,相等返回0 不等返回-1
SELECT STRCMP('ahiw','ahiw');
-- 从指定位置取指定长度的字串
SELECT SUBSTRING('hiwhhiqw',3,2);
-- 去除字符串前后的空格
SELECT LTRIM('  hdiwhdi  jd9wjdj  ');

--    数学相关的函数
-- 绝对值
SELECT ABS(-12);
-- 十进制转二进制
SELECT BIN(2);
-- 转十六进制
SELECT HEX(18);
-- 进制转化
SELECT CONV(8,2,8);-- 将12二进制数转化为八进制
-- 向上取整
CEILING()
-- 向下取整
FLOOR()
-- 保留小数位数--四舍五入
SELECT FORMAT(2.99999,2);
-- 求最小值
-- 求余
-- 随机数
RAND(seed);

猜你喜欢

转载自blog.csdn.net/Stitch__/article/details/83098741