数据库
1.什么是数据库?
数据库是按照数据结构组织,存储,和管理数据的仓库。
2.数据库的分类?具体含义?常见的数据库?
数据库分为关系型数据库和非关系从数据库。
关系从数据库:需要表格来存储数据的数据库,关系型数据库是依据关系模型来创建的数据库,所谓关系模型就是“一对一、一对多、多对多”等关系模型,关系模型就是指二维表格模型,因而一个关系型数据库就是由二维表及其之间的联系组成的一个数据组织。
常用的关系型数据库:oracle、db2、sqlserver、sybase、mysql 等。
非关系型数据库:
- 非关系型数据库主要是基于“非关系模型”的数据库(由于关系型太大,所以一般用“非关系型”来表示其他类型的数据库)
- 非关系型模型比如有:
- 列模型:存储的数据是一列列的。关系型数据库以一行作为一个记录,列模型数据库以一列为一个记录。(这种模型,数据即索引,IO很快,主要是一些分布式数据库)
- 键值对模型:存储的数据是一个个“键值对”,比如name:liming,那么name这个键里面存的值就是liming
- 文档类模型:以一个个文档来存储数据,有点类似“键值对”。
- 非关系型数据库的特点:效率高,但不安全。
常见的非关系型数据库:
列模型:Hbase
键值对模型:redis,MemcacheD B
文档类模型:mongoDB
3.MySQL数据库服务器,数据库和表的关系?
所谓的数据库服务器只是在机器上装了一个数据库管理程序,这个管理程序可以管理多个数据库,一般开发人员会针对一个应用创建一个数据库。为了保存应用中实体的数据,一般会在数据库中创建多个表。已保存程序中的实体数据。
通常情况下,一个应用创建一个数据库,一个数据库对应多张表,用来保存实体数据。
4.MySQL数据库服务器下载和安装?【解决MySQL安装到最后一步未响应的三种方法】
下载地址:https://downloads.mysql.com/archives/community/
这种情况一般是你以前安装过MySQL数据库服务项被占用了。
解决方法:
卸载数据库:
1.卸载MySQL
2.删除安装目录及数据存放目录
3.在注册表(regedit)查询mysql,全部删除,
注意的是注册表 cmd -> regedit
1.HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Eventlog\Application\MySQL 目录
2.HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services\Eventlog\Application\MySQL 目录
3.HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application\MySQL 目录
4.HKEY_LOCAL_MACHINE\SYSTEM\CurrentControl001\Services\MYSQL 目录
5.HKEY_LOCAL_MACHINE\SYSTEM\CurrentControl002\Services\MYSQL 目录
6.HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MYSQL 目录
4、在c盘查询MySQL,全部删除 ;一般是在ProgramData文件夹下(该文件是隐藏的,需要设置为显示隐藏文件)和winbdows文件夹下
安装就不写了,非常简单。
5.SQL语言
1.基本数据库操作语句
1.1创建数据库
CREATE DATABASE [IF NOT EXISTS] db_name
1.CHARACTER SET:指定数据库采用的字符集
2.COLLATE:指定数据库字符集的比较方式
例如:
1、创建一个名称为mydb1的数据库。
CREATE DATABASE mydb1;
2、创建一个使用utf8字符集的mydb2数据库。
CREATE DATABASE mydb2 CHARACTER SET utf8;
3、创建一个使用utf8字符集,并带比较规则的mydb3数据库。
CREATE DATABASE mydb3 CHARACTER SET utf8 COLLATE utf8_bin;
1.2数据库的修改
例如:
修改mydb2字符集为gbk;
ALTER DATABASE mydb2 CHARACTER SET gbk;
1.3数据库查看:
例如:
查看所有数据库。
show databases;
查看数据库mydb1的字符集
show create database mydb1;
1.4数据库的删除:
例如:
删除数据库mydb3。
drop database mydb3;
1.5创建表(基本语句)
语法结构:
CREATE TABLE table_name
(
field1 datatype,
field2 datatype,
field3 datatype
);
field:指定列名 datatype:指定列类型
注意:1.创建表前,要先使用use db语句使用库。
2.创建表时,要根据需保存的数据创建相应的列,并根据数据的类型定义相应的列类型。
2.MySQL常用数据类型
字符串型 VARCHAR、CHAR
大数据类型BLOB、TEXT
数值型TINYINT 、SMALLINT、INT、BIGINT、FLOAT、DOUBLE
逻辑性 BIT
日期型DATE、TIME、DATETIME、TIMESTAMP
例如:
创建一个员工表employee1
具体字段描述如下:
create table employee1 (
id int ,
name varchar(20) not null,
gender varchar(10),
birthday date,
entry_date date,
job varchar(30),
salary double,
resume text
);
3.MySQL定义表的字段的约束(保证数据的有效性和完整性)
1.定义主键约束:primary key:不允许为空,不允许重复
2.删除主键:alter table tablename drop primary key ;
3.主键自动增长 :auto_increment
4.定义唯一约束:unique 例如:name varchar(20) unique
5.定义非空约束:not null 例如:salary double not null
例如:
创建一张员工表employee2,要求把id 设置成主键,并且自动增长。name不允许为空。
create table employee (
id int primary key auto increment,
name varchar(20)not null,
gender varchar(10),
birthday date,
entry_date date,
job varchar(30),
salary double,
resume text
);
4.基本数据库表操作语句
4.1删除表
删除employee1表
drop table employee1;
4.2数据表的结构的修改:
1、在上面员工表的基本上增加一个image列。
alter table employee2 add image varchr(20);
2、修改job列,使其长度为60。
alter table employee2 modify job varchar(60);
3、删除gender列。
alter table employee2 drop gender;
4、表名改为user。
rename table employee2 to user;
5、修改表的字符集为utf8
alter table user character set utf8;
6、列名name修改为username
alter table user change name username varchar(20) not null;
4.3查看表结构
1、查看数据库内的所有表
show tables;
2、查看employee的建表语句
show create table employee1;
3、查看employee的表结构
desc employee1;
5.INSERT 语句向表中插入数据
语法结构:
INSERT INTO table [(column [, column...])] VALUES (value [, value...]);
1.插入的数据应与字段的数据类型相同。
2.数据的大小应在列的规定范围内,例如:不能将一个长度为80的字符串加入到长度为40的列中。
3.在values中列出的数据位置必须与被加入的列的排列位置相对应。
4.字符和日期型数据应包含在单引号中。
5.插入空值:不指定或insert into table value(null)
6.update语句修改表中数据
语法结构:
UPDATE tbl_name
SET col_name1=expr1 [, col_name2=expr2 ...]
[WHERE where_definition]
1.UPDATE语法可以用新值更新原有表行中的各列。
2.SET子句指示要修改哪些列和要给予哪些值。
3.WHERE子句指定应更新哪些行。如没有WHERE子句,则更新所有的行。
例如:
1、将所有员工薪水修改为5000元。
UPDATE employee SET salary=5000;
2、将姓名为’zs’的员工薪水修改为3000元。
UPDATE employee SET salary=3000 WHERE NAME='zs';
3、将姓名为’ls’的员工薪水修改为4000元,job改为ccc。
UPDATE employee SET salary=4000,job='ccc' WHERE NAME='ls';
4、将wangwu的薪水在原有基础上增加1000元。
UPDATE employee SET salary=salary+1000 WHERE NAME='wangwu';
7.delete语句删除表中数据
语法结构:
delete from tbl_name
[WHERE where_definition]
1.如果不使用where子句,将删除表中所有数据。
2.Delete语句不能删除某一列的值(可使用update)
3.使用delete语句仅删除记录,不删除表本身。如要删除表,使用drop table语句。
4.同insert和update一样,从一个表中删除记录将引起其它表的参照完整性问题,在修改数据库数据时,头脑中应该始终不要忘记这个潜在的问题。外键约束
例如:
1、删除表中名称为’zs’的记录。
DELETE FROM employee WHERE NAME='zs';
2、删除表中所有记录。
DELETE FROM employee;
6.select语句
6.1基本select语句
语法结构:
SELECT [DISTINCT] *|{column1, column2. column3..} FROM table;
1.select 指定查询哪些列的数据。
2.column指定列名。
3.*号代表查询所有列。
4.from指定查询哪张表。
5.DISTINCT可选,指显示结果时,是否剔除重复数据
例如:
CREATE TABLE exam(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20) NOT NULL,
chinese DOUBLE,
math DOUBLE,
english DOUBLE
);
INSERT INTO exam VALUES(NULL,'关羽',85,76,70);
INSERT INTO exam VALUES(NULL,'张飞',70,75,70);
INSERT INTO exam VALUES(NULL,'赵云',90,65,95);
INSERT INTO exam VALUES(NULL,'刘备',97,50,50);
INSERT INTO exam VALUES(NULL,'曹操',90,89,80);
INSERT INTO exam VALUES(NULL,'司马懿',90,67,65);
1、查询表中所有学生的信息。
SELECT * FROM exam;
2、查询表中所有学生的姓名和对应的英语成绩。
SELECT NAME,english FROM exam;
3、过滤表中重复数据。
SELECT DISTINCT * FROM exam GROUP BY ;
6.1.1.在select语句中可使用表达式对查询的列进行运算
语法格式:
SELECT *|{column1|expression, column2|expression,..} FROM table;
例如:
统计每个学生的总分。
SELECT * ,(chinese+math+english) AS 总分 FROM exam;
6.1.2在select语句中可使用as语句
语法格式:
SELECT column as 别名 from 表名;
例如:
使用别名表示学生分数。
SELECT id,NAME 名字, chinese 语文,math 数学, english 英语 FROM exam;
6.1.3使用where子句,进行过滤查询
在where子句中经常使用的运算符
注意:Like语句中,% 代表零个或多个任意字符,_ 代表一个字符,例first_name like ‘_a%’;
例如:
1.查询姓名为刘备的学生成绩
SELECT NAME,chinese,math,english FROM exam WHERE NAME='刘备';
2.查询英语成绩大于90分的同学
SELECT * FROM exam WHERE english>90;
3.查询总分大于200分的所有同学
SELECT * FROM exam WHERE (chinese+math+english)>200;
4.查询英语分数在 80-90之间的同学。
SELECT * FROM exam WHERE english BETWEEN 80 AND 90;
5.查询数学分数为89,75,91的同学。
SELECT * FROM exam WHERE math=85 OR math=75 OR math=91;
SELECT * FROM exam WHERE math IN(85,75,91);
6.查询所有姓刘的学生成绩。
SELECT * FROM exam WHERE NAME LIKE '刘%';
7.查询所有姓刘两个字的学生成绩。
SELECT * FROM exam WHERE NAME LIKE '刘_';
8.查询数学分>80并且语文分>80的同学。
SELECT * FROM exam WHERE math>80 OR chinese>80;
9.查询数学分>80 或者 语文分>80的同学。
SELECT * FROM exam WHERE math>80 AND chinese>80;
6.1.4.使用order by 子句排序查询结果。
语法结构:
SELECT column1, column2. column3..
FROM table;
order by column asc|desc
1.Order by 指定排序的列,排序的列即可是表中的列名,也可以是select 语句后指定的列名。
2.Asc 升序、Desc 降序
3.ORDER BY 子句应位于SELECT语句的结尾。
例如:
1.对数学成绩排序后输出。
SELECT * FROM exam ORDER BY math;
2.对总分排序按从高到低的顺序输出
SELECT * FROM exam ORDER BY (chinese+math+english) DESC;
3.对姓刘的学生成绩排序输出
SELECT * FROM exam WHERE NAME LIKE '刘%' ORDER BY chinese;
6.1.5.SQL聚合函数
1.Count(列名)返回某一列,行的总数
语法结构:
Select count(*)|count(列名) from tablename
[WHERE where_definition]
2.Sum函数返回满足where条件的行的和
语法结构:
Select sum(列名){,sum(列名)…} from tablename
[WHERE where_definition]
注意:1.sum仅对数值起作用,否则会报错。
2.对多列求和,“,”号不能少。
3.AVG函数返回满足where条件的一列的平均值
语法结构:
Select avg(列名){,avg(列名)…} from tablename
[WHERE where_definition]
4.Max/min函数返回满足where条件的一列的最大/最小值
语法结构:
Select max(列名)/min(列名) from tablename
[WHERE where_definition]
练习:
统计一个班级共有多少学生?
SELECT COUNT(*) AS 总人数 FROM exam;
统计数学成绩大于或等于90的学生有多少个?
SELECT COUNT(*) FROM exam WHERE math>90 OR math=90;
统计总分大于250的人数有多少?
SELECT COUNT(*) FROM exam WHERE (chinese+math+english)>250;
统计一个班级数学总成绩?
SELECT SUM(math) FROM exam ;
统计一个班级语文、英语、数学各科的总成绩
SELECT SUM(chinese) AS 语文,SUM(math) AS 数学,SUM(english) AS 英语 FROM exam;
统计一个班级语文、英语、数学的成绩总和
SELECT SUM(chinese+math+english) FROM exam;
统计一个班级语文成绩平均分
SELECT AVG(chinese) 语文平均分 FROM exam;
求一个班级数学平均分?
SELECT AVG(math) FROM exam;
求一个班级总分平均分
SELECT AVG(chinese+math+english) FROM exam;
求班级最高分和最低分(数值范围在统计中特别有用)
SELECT MAX(chinese+math+english) FROM exam;
SELECT MIN(chinese+math+english) FROM exam;
6.1.6.分页查询
Select [*/col] from tablename limit 参数1 , 参数2
参数1---每页数据的起始值 (当前页码 - 1)* 每页记录数
参数2--每页记录数
select * from t_exam;
--每页4条记录
--显示第2页数据
select * from t_exam limit 4,4;
--显示第3页数据
select * from t_exam limit 8,4;
6.1.7.GROUP BY子句可以将查询结果按属性列或属性列组合在行的方向上进行分组,每组在属性列或属性列组合上具有相同的值。
注意,使用GROUP BY 时,SELECT 子句中只能由以下部分组成:
1. 汇总函数
2. GROUP BY 中出现的列名
3. 1和2 通过函数和表达式的结果
例如:
SELECT A_ID +COUNT(*) FROM C GROUP BY A_ID; =>合法
SELECT A_DATE,COUNT(*) FROM C GROUP BY A_ID; =>不合法,如图示中的按A_ID分组后,对于其他各列的查询只能是汇总查询,否则没有意义
练习:
CREATE TABLE orders(
id INT,
product VARCHAR(20),
price FLOAT
);
INSERT INTO orders(id,product,price) VALUES(1,'电视',900);
INSERT INTO orders(id,product,price) VALUES(2,'洗衣机',100);
INSERT INTO orders(id,product,price) VALUES(3,'洗衣粉',90);
INSERT INTO orders(id,product,price) VALUES(4,'桔子',9);
INSERT INTO orders(id,product,price) VALUES(5,'洗衣粉',90);
查询购买了几类商品,并且每类总价大于100的商品
SELECT product,SUM(price) FROM orders WHERE price>100 GROUP BY product;
--having是对分组之后的结果进行条件查询
--having的查询条件必须在分组查询的结果中出现
select product,price from orders group by product having price > 100;
6.2多表查询
6.2.1.表与表之间的关系
6.2.2.外键的约束
定义外键约束
foreign key
foreign key(ordersid) references orders(id)
-一对一主键键关联设计
--创建用户信息表
create table t_user(
u_id int primary key auto_increment,
u_name varchar(20),
u_age int,
u_sex bit,
u_address varchar(30),
foreign key t_user(u_id) references t_card(c_id)
);
--创建用户省份证信息表
create table t_card(
c_id int primary key auto_increment,
c_number varchar(18),
c_arg varchar(10),
c_year int
);
--向用户省份证信息表中添加测试数据
insert into t_card values(null,'123456789012345678','陕西.西安',10);
insert into t_card values(null,'098765432112345678','陕西.铜川',10);
--向用户信息表中添加测试数据
insert into t_user values(null,'zhangsan',23,true,'长安县');
insert into t_user values(null,'lisi',24,false,'雁塔区');
--一对一外键关联设计
--创建用户信息表
create table t_user(
u_id int primary key auto_increment,
u_name varchar(20),
u_age int,
u_sex bit,
u_address varchar(30),
card_id int unique,
foreign key t_user(card_id) references t_card(c_id)
);
--创建用户省份证信息表
create table t_card(
c_id int primary key auto_increment,
c_number varchar(18),
c_arg varchar(10),
c_year int
);
--向用户省份证信息表中添加测试数据
insert into t_card values(null,'123456789012345678','陕西.西安',10);
insert into t_card values(null,'098765432112345678','陕西.铜川',10);
--向用户信息表中添加测试数据
insert into t_user values(null,'zhangsan',23,true,'长安县',1);
insert into t_user values(null,'lisi',24,false,'雁塔区',2);
一对多关联设计
--一对多关联设计
--注意:外键要设计在多方维护
--创建一个班级表
create table t_class(
c_id int primary key auto_increment,
c_number varchar(10),
c_name varchar(10)
);
--向班级表添加测试数据
insert into t_class values(null,'J20180903','javaEE');
insert into t_class values(null,'A20181010','Android');
insert into t_class values(null,'I20181111','IOS');
--创建学生表
create table t_student(
s_id int primary key auto_increment,
s_name varchar(20),
s_age int,
s_sex bit,
s_address varchar(30),
class_id int,
foreign key t_student(class_id) references t_class(c_id)
);
--向学生表添加测试数据
insert into t_student values(null,'zhangsan',23,true,'西安',1);
insert into t_student values(null,'lisi',24,false,'北京',2);
insert into t_student values(null,'wangwu',25,true,'上海',3);
insert into t_student values(null,'zhangsansan',26,true,'西安南',1);
insert into t_student values(null,'lisisi',27,false,'北京北',2);
insert into t_student values(null,'wangwuwu',28,true,'上海东',3);
多对多关联设计
--多对多关联设计
--注意:需要有一个中间表来维护关联关系,保存的是不同表的主键
--创建角色表
create table t_role(
r_id int primary key auto_increment,
r_name varchar(10),
r_desc varchar(30)
);
--创建项目组表
create table t_group(
g_id int primary key auto_increment,
g_name varchar(20),
g_desc varchar(30)
);
--创建中间表维护关联关系
create table t_rolegroup(
z_id int primary key auto_increment,
role_id int,
group_id int
);
--通过修改表结构的方式添加外键
alter table t_rolegroup add constraint fk1 foreign key (role_id) references t_role(r_id);
alter table t_rolegroup add constraint fk2 foreign key (group_id) references t_group(g_id);
--向角色表中添加测试数据
insert into t_role values(null,'java程序员','负责开发java程序');
insert into t_role values(null,'测试员','负责测试程序');
--向项目组表中添加测试数据
insert into t_group values(null,'CRM组','负责开发CRM系统');
insert into t_group values(null,'ERP组','负责开发ERP系统');
--向中间表中添加测试数据
insert into t_rolegroup values(null,1,1);
insert into t_rolegroup values(null,1,2);
insert into t_rolegroup values(null,2,1);
insert into t_rolegroup values(null,2,2);
6.2.3.子查询
就是将一个查询语句包含在另一个查询语句中,那么这个被包含的查询语句就是子查询语句。
子查询练习:
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);
INSERT INTO emp VALUES(7981,'MILLER','CLERK',7788,'1992-01-23',2600,500,20);
CREATE TABLE dept(
deptno INT,
dname VARCHAR(14),
loc VARCHAR(13)
);
INSERT INTO dept VALUES(10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO dept VALUES(20, 'RESEARCH', 'DALLAS');
INSERT INTO dept VALUES(30, 'SALES', 'CHICAGO');
INSERT INTO dept VALUES(40, 'OPERATIONS', 'BOSTON');
1.单行子查询(> < >= <= = <>)
查询出高于10号部门的平均工资的员工信息
SELECT * FROM emp WHERE sal >(SELECT AVG(sal) FROM emp WHERE deptno=10 );
2.多行子查询(in not in any all)
查询出比10号部门任何员工薪资高的员工信息
SELECT * FROM emp WHERE sal > ANY(SELECT sal FROM emp WHERE deptno=10) AND deptno!=10;
3.多列子查询(实际使用较少)
和10号部门同名同工作的员工信息
SELECT * FROM emp WHERE (ename,job)IN(SELECT ename,job FROM emp WHERE deptno=10) AND deptno!=10;
4.select 后面接子查询
获取员工的名字和部门的名字
SELECT p.ename,d.dname FROM emp p,dept d WHERE p.deptno=d.deptno;
5.from 后面接子查询
查询emp表中经理信息
SELECT * FROM emp e,(SELECT DISTINCT mgr FROM emp) AS jingli WHERE e.empno=jingli.mgr;
6.where 后面接子查询
薪资高于10号部门平均工资的所有员工信息
SELECT * FROM emp WHERE sal>(SELECT AVG(sal) FROM emp WHERE deptno=10);
7. group by 后面接子查询
有哪些部门的平均工资高于30号部门的平均工资
SELECT deptno, AVG(sal) AS bumen FROM emp GROUP BY deptno HAVING bumen > (SELECT AVG(sal) FROM emp WHERE deptno=30);
8.工资>JONES工资
SELECT * FROM emp WHERE sal>(SELECT sal FROM emp WHERE ename='JONES');
9.查询与SCOTT同一个部门的员工
SELECT * FROM emp WHERE deptno = (SELECT deptno FROM emp WHERE ename='SCOTT') AND ename!='SCOTT';
10.工资高于30号部门所有人的员工信息
SELECT * FROM emp WHERE sal>(SELECT MAX(sal) FROM emp WHERE deptno=30);
11.查询工作和工资与MARTIN完全相同的员工信息
SELECT job,sal FROM emp WHERE ename='MARTIN';
SELECT * FROM emp WHERE (job,sal)IN(SELECT job,sal FROM emp WHERE ename='MARTIN');
12.得出两个以上直接下属的员工信息
1.SELECT * FROM emp WHERE empno IN (SELECT mgr FROM emp GROUP BY mgr HAVING COUNT(mgr) >2);
2.SELECT * FROM emp e1 WHERE e1.empno IN (SELECT e2.mgr FROM emp e2 GROUP BY e2.mgr HAVING COUNT(*)>2);
7.联合查询
7.1.内连接查询【inner join】
7.2.左连接查询【left join】 左外连接查询【left outer join】
7.3.右连接查询【right join 】 右外连接查询【right outer join】
内连接与左连接和有链接的区别
内连接:显示左右两边共有的
左连接:显示左边有的,右边没有的为null;
右连接:显示右边有的,左边没有的为null;
语法结构:
select [col1,col2...coln来自多张表【最好使用别名】]
from table1
inner join/
left outer join/left join/
right outer join/right join
table2
on table1.col = table2.col
where 查询条件
例如:
创建一个班级表:
create table t_class(
c_id int primary key auto_increment,
c_number varchar(10),
c_name varchar(10)
);
向班级表添加测试数据:
insert into t_class values(null,'J20180903','javaEE');
insert into t_class values(null,'A20181010','Android');
insert into t_class values(null,'I20181111','IOS');
创建学生表:
create table t_student(
s_id int primary key auto_increment,
s_name varchar(20),
s_age int,
s_sex bit,
s_address varchar(30),
class_id int,
foreign key t_student(class_id) references t_class(c_id)
);
向学生表添加测试数据:
insert into t_student values(null,'zhangsan',23,true,'西安',1);
insert into t_student values(null,'lisi',24,false,'北京',2);
insert into t_student values(null,'wangwu',25,true,'上海',3);
insert into t_student values(null,'zhangsansan',26,true,'西安南',1);
insert into t_student values(null,'lisisi',27,false,'北京北',2);
insert into t_student values(null,'wangwuwu',28,true,'上海东',3);
--查询姓名是zhangsna的地址和班级名称
select 学生表.s_name,学生表.s_address,班级表.c_name
from t_student as 学生表
inner join
t_class as 班级表
on 学生表.class_id = 班级表.c_id
where 学生表.s_name='zhangsna';
--根据班级编号“I20181111”的所有学生信息
select 学生表.s_id ,
学生表.s_name,
学生表.s_age,
学生表.s_sex,
学生表.s_address
from t_student as 学生表
left join
t_class as 班级表
on 学生表.class_id = 班级表.c_id
where 班级表.c_number='I20181111';
--查询姓名是lisi的所有信息包括班级信息
select 学生表.s_id ,
学生表.s_name,
学生表.s_age,
学生表.s_sex,
学生表.s_address,
班级表.c_id,
班级表.c_number,
班级表.c_name
from t_student as 学生表
right join
t_class as 班级表
on 学生表.class_id = 班级表.c_id
where 学生表.s_name='lisi';
综合练习:
1查询员工编号为7788的员工名称,员工工资,部门名称,部门地址
SELECT e.*,d.loc FROM emp e,dept d WHERE e.empno=7788 AND e.deptno=d.deptno;
2.查询出高于本部门平均工资的员工信息-
SELECT *,AVG(sal) AS 平均工资 FROM emp GROUP BY deptno;
SELECT * FROM emp e WHERE sal > (SELECT AVG(sal) AS 平均工资 FROM emp d GROUP BY deptno HAVING e.deptno=d.deptno);
-- 方式二:
-- SELECT * FROM emp e1 WHERE e1.sal > (SELECT AVG(e2.sal) FROM emp e2 WHERE e1.deptno=e2.deptno GROUP BY e2.deptno);
3.列出达拉斯加工作的人中,比纽约平均工资高的人
SELECT AVG(sal) FROM emp e INNER JOIN dept d ON e.deptno=d.deptno WHERE d.loc='NEW YORK';
SELECT * FROM emp e INNER JOIN dept d ON e.deptno=d.deptno WHERE d.loc='DALLAS'
AND sal>(SELECT AVG(sal) FROM emp e INNER JOIN dept d ON e.deptno=d.deptno WHERE d.loc='NEW YORK');
-- 方法二
SELECT * FROM emp WHERE deptno = (SELECT deptno FROM dept WHERE loc='DALLAS')
AND sal > (SELECT AVG(sal) FROM emp WHERE deptno = (SELECT deptno FROM dept WHERE loc='NEW YORK'));
4.查询7369员工编号,姓名,经理编号和经理姓名
SELECT mgr FROM emp WHERE empno=7369;
SELECT ename FROM emp WHERE empno =(SELECT mgr FROM emp WHERE empno=7369);
SELECT empno,ename,(SELECT mgr FROM emp WHERE empno=7369) AS 经理编号
,(SELECT ename FROM emp WHERE empno =(SELECT mgr FROM emp WHERE empno=7369)) AS 经理姓名 FROM emp WHERE empno=7369;
SELECT e1.empno,e1.ename,e1.mgr,mgrtable.ename FROM emp e1,emp mgrtable WHERE e1.mgr = mgrtable.empno AND e1.empno=7369;
5.查询出各个部门薪水最高的员工所有信息
SELECT * FROM emp WHERE sal=MAX(sal) GROUP BY deptno;
SELECT * FROM emp e WHERE sal = (SELECT MAX(sal) AS 最高薪水 FROM emp e2 WHERE e.deptno=e2.deptno GROUP BY deptno );
-- SELECT * FROM emp e1 WHERE e1.sal = (SELECT MAX(sal) FROM emp e2 WHERE e1.deptno = e2.deptno GROUP BY deptno);
本文地址:https://blog.csdn.net/xibeiwang1/article/details/107666766
上一篇: redis笔记(三)
下一篇: Storm容错和高可用