`bd1`
#数据库操作的代码演示:
CREATE DATABASE demo; # 创建数据库
CREATE DATABASE IF NOT EXISTS studets; #判断是否存在,不存在则创建新的数据库
DROP DATABASE demo; #删除数据库
ALTER DATABASE demo CHARACTER SET utf8; #修改数据库字符集
SHOW DATABASES; #显示所有的数据库
SHOW CREATE DATABASE demo; #查询某个数据库的字符集
USE demo; #使用该数据库(指定的)
#表操作的代码演示:
CREATE TABLE students( #创建一个新的表;
id INT,
NAME VARCHAR(40)
);
SHOW TABLES; #查看该数据库下的所有表格
DESC students; #查看该表的结构
ALTER TABLE students RENAME father; #修改该表的名字
ALTER TABLE father CHARACTER SET utf8; #修改该表的字符集
ALTER TABLE father ADD shengao INT; #添加一列
ALTER TABLE father CHANGE shengao tizhong INT; #修改列名称,类型
ALTER TABLE father DROP tizhong; #删除列
DROP TABLE students; #删除表名
DROP TABLE IF EXISTS students; #删除表名(如果存在则删除
#数据的增删改查代码演示:
INSERT INTO students VALUES(1,'zhanglei'); #添加数据(默认给所有列添加值
INSERT INTO students(id)VALUES(2); #给指定的列添加值
DELETE FROM students; #删除所有数据(不推荐使用,只删除数据,不删除表)
TRUNCATE TABLE students; #删除表内所有数据(推荐使用,只删除数据,不删除
表)
DELETE FROM students WHERE NAME ='zhanglei'; #删除指定表的指定内容
UPDATE students SET NAME="我"; #修改所有的该列值
UPDATE students SET NAME="哈哈哈" WHERE id=1; #修改指定行的列的值
UPDATE students SET NAME="我不是" ,id=2; #修改所有的行的多个列的值。 (如果需要指定
行的多列的值后面加 where 条件即可)
SELECT *FROM students; #查询该表的所有数据
DELETE FROM students WHERE id=2; #查询 id 为 2 的该行数据(指定列的所有行数据)
SELECT DISTINCT *FROM students; #查询去重复后的表中所有数据
SELECT id,NAME FROM students WHERE id=2; #查询指定行的指定列数据
SELECT id+1,NAME FROM students; #查询带简单运算后的表中数据
SELECT id 学号 ,NAME 名字 FROM students; #查询带别名,将指定列的名字修改后查询带
别名的数据
SELECT (id +NAME)AS 学生信息 FROM students; #查询组合带别名的所有学生信息
#条件查询:
-- 1). 查询员工的所有信息
SELECT * FROM t_employee;
-- 2). 查询所有员工的姓名和职位
SELECT ename,job FROM t_employee;
-- 3). 查询所有员工的职位(去掉重复的)
SELECT DISTINCT job FROM t_employee;
-- 查询所有员工的姓名和总金额(薪资+佣金)
SELECT ename 姓名,sal,comm,sal+IFNULL(comm,0) 总金额 FROM t_employee;
-- 查询部门编号等于 20 的所有员工信息
SELECT * FROM t_employee WHERE deptno = 20;
-- 查询职位是 clear 并且薪资大于 1000 的员工信息
SELECT * FROM t_employee WHERE job = 'clear' AND sal > 1000;
-- 查询薪资在 2000 到 3000 之间的所有员工信息
SELECT * FROM t_employee WHERE sal BETWEEN 2000 AND 3000;
-- 查询佣金是 null 的所有员工信息
SELECT * FROM t_employee WHERE comm IS NULL;
-- 查询部门编号在 10 和 20 中的所有员工信息
SELECT * FROM t_employee WHERE deptno IN(10,20);
-- 查询员工姓名包含 M 的所有员工信息
SELECT * FROM t_employee WHERE ename LIKE '%M%';
-- 查询员工中佣金大于 800 并且以佣金降序排序
SELECT * FROM t_employee WHERE sal>800 ORDER BY sal DESC;
-- 查询员工中佣金大于 800 并且以佣金升序排序
SELECT * FROM t_employee WHERE sal>800 ORDER BY sal ASC;
-- 求女性的平均年龄
SELECT AVG(age) FROM student3 WHERE sex= '女';
-- 查询平均年龄,居住地,人数,按照居住地分组;
SELECT AVG(age),address,COUNT(address)人数 FROM student3 GROUP BY address;
-- 查询平均年龄,居住地,人数,按照居住地分组,并筛选出人数大于 1 人的地区;(使用
聚合函数,条件查询,分组查询)
SELECT AVG(age),address,COUNT(address)人数 FROM student3 GROUP BY address HAVING 人
数>1;
-- 分页查询所有信息
SELECT *FROM student3 LIMIT 3,6;
# 约束
#非空约束
-- 非空约束:not null,某一列的值不能为 null
CREATE TABLE stu(
id INT,
NAME VARCHAR(20) NOT NULL -- name 为非空
);
-- 创建表完后,添加非空约束
ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;
-- 删除 name 的非空约束
ALTER TABLE stu MODIFY NAME VARCHAR(20);
#唯一约束
-- 在创建表时,添加唯一约束
CREATE TABLE stu(
id INT,
phone_number VARCHAR(20) UNIQUE -- 手机号
);
-- 删除唯一约束
ALTER TABLE stu DROP INDEX phone_number;
-- 在表创建完后,添加唯一约束
ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;
#主键约束
-- 在创建表时,添加主键约束
CREATE TABLE stu(
id INT PRIMARY KEY,-- 给 id 添加主键约束
NAME VARCHAR(20)
);
-- 删除主键
ALTER TABLE stu DROP PRIMARY KEY;
-- 创建完表后,添加主键
ALTER TABLE stu MODIFY id INT PRIMARY KEY;
-- 在创建表时,添加主键约束,并且完成主键自增长
CREATE TABLE stu(
id INT PRIMARY KEY AUTO_INCREMENT,-- 给 id 添加主键约束
NAME VARCHAR(20)
);
-- 删除自动增长
ALTER TABLE stu MODIFY id INT;
-- 添加自动增长
ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;
-- 在创建表时,可以添加外键
CREATE TABLE 表名(
....
外键列
CONSTRAINT 外键名称 FOREIGN KEY (外键列名称) REFERENCES 主表名称(主表列名称)
);
-- 删除外键
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
-- 创建表之后,添加外键
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主
表名称(主表列名称);
-- 添加级联操作
ALTER TABLE 表名 ADD CONSTRAINT 外键名称
FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称) ON UPDATE CASCADE ON
DELETE CASCADE ;
-- 级联更新:ON UPDATE CASCADE
-- 级联删除:ON DELETE CASCADE
# 作业代码演示:
-- 11). 查询所有员工信息按照薪资降序排列
SELECT * FROM t_employee ORDER BY sal DESC;
-- 12). 查询所有员工信息先按照薪资升序排列在按照雇佣时间降序排列
SELECT * FROM t_employee ORDER BY sal ASC,hiredate DESC;
-- 统计所有员工的个数
SELECT COUNT(*) FROM t_employee
-- 14). 查询部门编号等于 10 的所有员工的平均薪资
SELECT AVG(sal) FROM t_employee WHERE deptno = 10;
-- 15). 查询所有员工中薪资最高的员工信息
SELECT * FROM t_employee WHERE sal = (SELECT MAX(sal) FROM t_employee);
-- 16). 查询每个部门的最高薪资
SELECT deptno,MAX(sal) FROM t_employee GROUP BY deptno;
-- 17). 查询每个部门的员工个数,并按照人数降序排列
SELECT deptno,COUNT(*) num FROM t_employee GROUP BY deptno ORDER BY num DESC;
-- 18 查询每个部门平均薪资在 2000 以上的部门编号和平均薪资
SELECT deptno,AVG(sal) 平均 FROM t_employee GROUP BY deptno HAVING 平均 > 2000
-- 多表查询
# 隐式内查询:
SELECT
emp.name,emp.`gender`,dept.`NAME`
FROM
dept,emp
WHERE
dept.`id`=emp.`id`;
#显式内查询:
SELECT
t2.name,t2.gender,t1.`NAME`
FROM
dept t1
JOIN
emp t2
ON
t1.`id`=t2.id;
# 外连接 左连接
SELECT
*
FROM
emp
LEFT JOIN
dept
ON dept.`id`=emp.`id`;
# 外连接 内连接
SELECT
*
FROM
emp
RIGHT JOIN
dept
ON dept.`id`=emp.`id`;
#子查询
# 先找出工资最高的人
SELECT
MAX(emp.`salary`)
FROM emp ;
# 再找出该员工
SELECT emp.`NAME` ,emp.`salary`
FROM emp
WHERE
emp.`salary`=9000;
#使用子查询一次到位:
SELECT emp.`NAME` ,emp.`salary`
FROM emp
WHERE
emp.`salary`=(SELECT MAX(emp.`salary`)FROM emp);