SELECT * FROM emp;
# 03视频================================================
#创建一个学生表
CREATE TABLE stu (
sid CHAR(6),
sname VARCHAR(50),
age INT,
gender VARCHAR(6)
);
#插入数据
INSERT INTO stu (sid,sname,age,gender) VALUES ('30001','刘三姐',20,'female');
INSERT INTO stu (sid,sname,gender) VALUES ('30002','刘四姐','female');
#如果是插入所有字段,字段的指定可以省略
INSERT INTO stu VALUES ('30003','刘二姐',20,'female');
SELECT * FROM stu;
INSERT INTO stu VALUES('S_1001', 'liuYi', 35, 'male');
INSERT INTO stu VALUES('S_1002', 'chenEr', 15, 'female');
INSERT INTO stu VALUES('S_1003', 'zhangSan', 95, 'male');
INSERT INTO stu VALUES('S_1004', 'liSi', 65, 'female');
INSERT INTO stu VALUES('S_1005', 'wangWu', 55, 'male');
INSERT INTO stu VALUES('S_1006', 'zhaoLiu', 75, 'female');
INSERT INTO stu VALUES('S_1007', 'sunQi', 25, 'male');
INSERT INTO stu VALUES('S_1008', 'zhouBa', 45, 'female');
INSERT INTO stu VALUES('S_1009', 'wuJiu', 85, 'male');
INSERT INTO stu VALUES('S_1010', 'zhengShi', 5, 'female');
INSERT INTO stu VALUES('S_1011', 'xxx', NULL, NULL);
INSERT INTO stu VALUES('S_1009', 'wuJiu', 85, 'male');
INSERT INTO stu VALUES('S_1010', 'zhengShi', 5, 'female');
INSERT INTO stu VALUES('S_1011', 'xxx', NULL, NULL);
#创建一个员工表
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);
#创建部门表
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');
#04视频 ====================================
#1.查询表的所有列
select * from stu;
#2.查询表的部分列
select sid,sname from stu;
#3.查询性别为女,并且年龄50的记录 【=】
SELECT * FROM stu WHERE gender='female' and age = 50;
#查询性别为女,并且年龄大于50的记录
SELECT * FROM stu WHERE gender='female' and age >= 50;
#4.查询学号为S_1001,或者姓名为liSi的记录 【OR 或者】
SELECT * FROM stu WHERE sid='S_1001' OR sname='liSi';
#5.查询学号为S_1001,S_1002,S_1003的记录 【in 范围内】
SELECT * FROM stu WHERE sid IN ('S_1001','S_1002','S_1003');
#文件保存的路径
#C:\Users\10301\Documents\Navicat\MySQL\servers\mysql\mydb2\mysq101.sql
#C:\Users\用户名\Documents\Navicat\MySQL\servers\mysql\数据库\保存的文件名
#05视频.============================
#6.查询学号不是S_1001,S_1002,S_1003的记录 【NOT IN 不在某个范围内】
SELECT * FROM stu WHERE sid NOT IN ('S_1001','S_1002','S_1003');
#7.查询年龄为null的记录 【字段 null】
SELECT * FROM stu WHERE age IS NULL;
#8.查询年龄在20到40之间的学生记录 【BETWEEN ...AND... 在区间】
SELECT * FROM stu WHERE age >= 20 AND age <=40;
SELECT * FROM stu WHERE age BETWEEN 20 AND 40;
#9.查询性别非男的学生记录 【!= <> 这个是非的意思】
SELECT * FROM stu where gender = 'female';
SELECT * FROM stu where gender != 'male';
SELECT * FROM stu where gender <> 'male';
#10.查询姓名不为null的学生记录 【NOT NULL】
SELECT * FROM stu WHERE sname IS NOT NULL;
SELECT * FROM stu WHERE NOT sname IS NULL;
#06.视频 LIKE 模糊查询 【_:匹配一个字符】
#查询姓名由5个字母构成的学生记录
SELECT * FROM stu WHERE sname LIKE '_____';
#查询姓名由5个字母构成,并且第5个字母为“i”的学生记录
SELECT * FROM stu WHERE sname LIKE '____i';
#查询姓名以“z”开头的学生记录 【% 匹配n个字符】
SELECT *
FROM stu
WHERE sname LIKE 'z%';
#查询姓名中第2个字母为“i”的学生记录
SELECT * FROM stu WHERE sname LIKE '_i%';
#查询姓名中包含“a”字母的学生记录
SELECT * FROM stu WHERE sname LIKE '%a%';
#07视频.字段控制查询
#去除重复记录:使用DISTINCT
#查询员工工资
SELECT sal,ename FROM emp;
#DISTINCT不要和多个字段使用,如果使用就无效
SELECT DISTINCT sal FROM emp;#去除重复工资
#查看员工的月薪与提成之和
SELECT *,sal+comm FROM emp;#在提成没有空的情况下,是没有问题
SELECT *,sal+IFNULL(comm,0) FROM emp;
# 给列名添加别名 AS as也是可以省略
SELECT *,sal+IFNULL(comm,0) AS 'total' FROM emp;
SELECT *,sal+IFNULL(comm,0) AS '总金额' FROM emp;
SELECT *,sal+IFNULL(comm,0) '总金额' FROM emp;
#查询部分字段 【一般开发中不会取中文别名】
SELECT ename '员工名字',job '员工职位',sal '月薪',comm '提成' FROM emp;
#08.视频 排序 order by 列名 asc(默认) 升序 desc降序【由大到小】
#查询所有学生记录,按年龄升序【由小到大】排序
SELECT * FROM stu ORDER BY age;
SELECT * FROM stu ORDER BY age ASC;
#查询所有学生记录,按年龄降序排序
SELECT * FROM stu ORDER BY age DESC;
#查询所有雇员,按月薪降序排序,如果月薪相同时,按编号降序排序
#【掌握多个字段排序】
SELECT * FROM emp ORDER BY sal DESC,empno DESC;
#09.视频 聚合函数
#查询emp表中记录数 COUNT():统计指定列不为NULL的记录行数;
SELECT COUNT(*) FROM emp;
#查询emp表中有佣金的人数
SELECT COUNT(comm) FROM emp;
#SELECT COUNT(comm) FROM emp WHERE comm != 0;
#查询emp表中月薪大于2500的人数
SELECT count(*) FROM emp WHERE sal > 2500;
#统计月薪与佣金之和大于2500元的人数:
SELECT * FROM emp WHERE sal+IFNULL(comm,0) > 2500;
SELECT count(*) FROM emp WHERE sal+IFNULL(comm,0) > 2500;
#查询有佣金的人数,有领导的人数
SELECT COUNT(comm) FROM emp WHERE mgr IS NOT NULL;
#查询所有雇员月薪和 【sum】
SELECT SUM(sal) FROM emp;
#查询所有雇员月薪和,以及所有雇员佣金和:
SELECT SUM(sal),SUM(comm) FROM emp;
# 查询所有雇员月薪+佣金和
SELECT SUM(sal)+SUM(comm) '月总支出' FROM emp;
SELECT SUM(sal + IFNULL(comm,0)) '月总支出' FROM emp;
#统计所有员工平均工资 【avg 求平均数】
SELECT AVG(sal) FROM emp;
#查询最高工资和最低工资 MAX(expr) MIN(expr)
SELECT MAX(sal),MIN(sal) FROM emp;
#10视频-分组查询
#查询员工,按部门编号分组
SELECT * FROM emp GROUP BY deptno;
#查询每个部门的部门编号和每个部门的工资和:此时求和是按部门求和
SELECT deptno,SUM(sal) FROM emp GROUP BY deptno;
#查询每个部门的部门编号以及每个部门的人数:
SELECT deptno,COUNT(*) FROM emp GROUP BY deptno;
#查询每个部门的部门编号以及每个部门工资大于1500的人数
SELECT deptno,COUNT(*) FROM emp WHERE sal > 1500 GROUP BY deptno;
#11视频. HAVING
-- having与where的区别:
-- 1.having是在分组后对数据进行过滤. ctrl + / 注释
-- where是在分组前对数据进行过滤
--
-- 2.having后面可以使用聚合函数(统计函数)
-- where后面不可以使用聚合函数。
#查询工资总和大于9000的部门编号以及工资和
SELECT deptno,SUM(sal) FROM emp GROUP BY deptno HAVING SUM(sal) > 9000;
#LIMIT 方言 是mysql独有,oracle 和 SQL Server没有Limit这种用法
-- LIMIT 用于分页显示数据
-- 假设 员工表有14条数据,分页显示,每页显示5条数据,总要需要3页显示
-- 第一页数据 当前页数p=1-10,【开始的位置 = (p - 1) * 每页的条数(5)】
SELECT * FROM emp LIMIT 0,5;
-- 第二页数据
SELECT * FROM emp LIMIT 5,5;
-- 第三页数据
SELECT * FROM emp LIMIT 10,5;
#12视频 主键约束(primary key):数据唯一[不能重复],且不能为null
#一般会给一张表添加一个主键
DROP TABLE student;
CREATE TABLE student(
id int PRIMARY KEY,
name varchar(20)
);
INSERT INTO student VALUES(1,'mayun');
INSERT INTO student VALUES(NULL,'mayun');
#另一种方式添加主键
CREATE TABLE student(
id int,
name varchar(20),
PRIMARY KEY(id)
);
#联合主键
CREATE TABLE student(
id int,
name varchar(20),
PRIMARY KEY(id,name)
);
INSERT INTO student VALUES(1,'mayun');
INSERT INTO student VALUES(1,'mahuteng');
INSERT INTO student VALUES(2,'mahuteng');
#第三种方式添加主键
CREATE TABLE student(
id int,
name varchar(20)
);
ALTER TABLE student ADD PRIMARY KEY(id);
#13.唯一约束(unique)
CREATE TABLE student(
id int PRIMARY KEY,
name varchar(20) UNIQUE
);
INSERT INTO student VALUES(1,'mayun');
INSERT INTO student VALUES(1,'mayun');#主键不能重复
INSERT INTO student VALUES(2,'mayun');#name字段重复
#14视频:自动增长列(auto_increment)
INSERT INTO student (id,name) VALUES('mayun');#Column count doesn't match value count at row 1
INSERT INTO student VALUES('mayun');#Column count doesn't match value count at row 1
INSERT INTO student (name) VALUES('mayun');#id没有传值
INSERT INTO student (id,name) VALUES(2,'ggl');
INSERT INTO student (id,name) VALUES(3,'xd');
-- 创建一张自动递增id的表 auto_increment 只能用在数字的列
CREATE TABLE student(
id int PRIMARY KEY AUTO_INCREMENT,
name varchar(20) UNIQUE
);
INSERT INTO student (name) VALUES('mayun');
INSERT INTO student (name) VALUES('mahuateng');
INSERT INTO student (name) VALUES('liyanhong');
INSERT INTO student (name) VALUES('liuqiangdong');
INSERT INTO student (id,name) VALUES(3,'liyanhong');
#15.视频
-- 非空约束:not null
CREATE TABLE student(
id int PRIMARY KEY AUTO_INCREMENT,
name varchar(20) UNIQUE NOT NULL
);
INSERT INTO student (name) VALUES(NULL);
-- 默认值约束 default
CREATE TABLE student(
id int PRIMARY KEY AUTO_INCREMENT,
name varchar(20) UNIQUE NOT NULL,
gender varchar(6) DEFAULT 'male'
);
INSERT INTO student (name,gender) VALUES ('mayun','male');
INSERT INTO student (name,gender) VALUES ('mahuateng1',NULL);#不会把null变成默认
INSERT INTO student (name) VALUES ('mahuateng');
#16.外键约束
-- step 1.创建两张表
-- 学生表
CREATE TABLE student(
id int PRIMARY KEY AUTO_INCREMENT,
name varchar(20) NOT NULL,
gender char(1) DEFAULT '男'
);
INSERT INTO student (name) VALUES ('zhangsan');
INSERT INTO student (name,gender) VALUES ('lisi','女');
-- 成绩表
-- 添加外键的语法格式:
-- CONSTRAINT 外键名称 FOREIGN KEY (外键字段) REFERENCES 表名(主键)
CREATE TABLE score(
id int PRIMARY KEY AUTO_INCREMENT,
score int,
name varchar(10) NOT NULL,
sid int,
CONSTRAINT fk_student_score FOREIGN KEY(sid) REFERENCES student(id)
);
INSERT INTO score (score,name,sid) VALUES (90,'数学',1);
INSERT INTO score (score,name,sid) VALUES (93,'数学',2);
INSERT INTO score (score,name,sid) VALUES (98,'数学',3);
#18 UNION,UNION ALL 合并结果使用
-- 1.如果使用UNION,操作的表必须要有相同的列,并且每个列类型都是一样
CREATE TABLE employee_china(
id int,
name varchar(50)
);
CREATE TABLE employee_usa(
id int,
name varchar(50)
);
INSERT INTO employee_usa VALUES (1,'michal');
INSERT INTO employee_usa VALUES (2,'lucy');
INSERT INTO employee_usa VALUES (3,'anmy');
INSERT INTO employee_china VALUES (1,'永马云');
INSERT INTO employee_china VALUES (2,'郭峰');
INSERT INTO employee_china VALUES (3,'马化腾');
INSERT INTO employee_usa VALUES (4,'vincent');
INSERT INTO employee_china VALUES (4,'vincent');
SELECT * FROM employee_china;
SELECT * FROM employee_usa;
#合并两张表
-- UNION 去除重复
SELECT * FROM employee_china UNION SELECT * FROM employee_usa;
-- UNION ALL 不去除重复
SELECT * FROM employee_china UNION ALL SELECT * FROM employee_usa;
#笛卡尔集
#连接查询
SELECT * FROM employee_china,employee_usa;
CREATE TABLE department(
id int,
name varchar(50)
);
INSERT INTO department VALUE(10001,'销售部');
INSERT INTO department VALUE(10002,'咨询部');
INSERT INTO department VALUE(10003,'人事部');
INSERT INTO department VALUE(10004,'技术部');
CREATE TABLE employee(
id int,
name varchar(50),
depno int
);
INSERT INTO employee VALUES(1,'tony',10001);
INSERT INTO employee VALUES(2,'lucy',10001);
INSERT INTO employee VALUES(3,'mia',10001);
INSERT INTO employee VALUES(4,'amy',10002);
INSERT INTO employee VALUES(5,'jerry',10002);
INSERT INTO employee VALUES(6,'micheal',10003);
INSERT INTO employee VALUES(7,'lily',10003);
INSERT INTO employee VALUES(8,'elain',10004);
INSERT INTO employee VALUES(9,'ruly',10004);
INSERT INTO employee VALUES(10,'kk',10004);
INSERT INTO employee VALUES(11,'cici',10004);
#笛卡尔集过滤
SELECT * FROM employee e, department d WHERE e.depno = d.id;
SELECT * FROM employee , department WHERE employee.depno = department.id;
SELECT e.id '员工ID', e.name '员工名字',d.id '部门编号',d.name '部门名称'
FROM employee e, department d
WHERE e.depno = d.id;