# 库的增删改查:
# 创建数据库并指定编码为:utf8
CREATE DATABASE first CHARSET utf8;
# 数据库一旦被创建就无法修改库的名称
# 修改数据库编码格式为:utf8
ALTER DATABASE FIRST CHARSET utf8;
# 使用数据库
use FIRST
# 查看所有数据库
show DATABASES
# 查看当前数据库
SELECT DATABASE();
# 删除数据库
DROP DATABASE FIRST_db;
# 表的增删改查
# 创建表
create table first3(
id INT,
sname varchar(50),
age INT(20),
class_room VARCHAR(50),
start_date DATE
)
# 删除表
DROP TABLE dep;
# 修改表
# 修改主键属性
# 修改主键属性时,需要删除原主键后,重新添加
# drop 删除原主键
alter table first3 drop id;
# 新增主键字段并添加自增属性
alter table first3 add id_2 int PRIMARY KEY AUTO_INCREMENT
# 修改数据类型及约束:modify
# 修改数据类型为int
alter table first3 MODIFY start_date INT
# 修改数据类型为单选
alter TABLE first3 MODIFY sexe enum('m','n')
# 修改数据类型为多选
alter TABLE first3 MODIFY hobbie SET('study','paly','sleep','swiming')
# 增加数据的约束条件not null
alter table first3 MODIFY start_date INT NOT NULL
# 删除数据约束条件 not NULL
alter table first3 MODIFY start_date INT
# 添加默认值:DEFAULT('默认值')
ALTER TABLE first3 MODIFY sname VARCHAR(30) DEFAULT('bbb')
# 删除默认值
ALTER TABLE first3 MODIFY sname VARCHAR(30)
# UNIQUE 添加数据唯一性约束
ALTER TABLE first3 MODIFY age INT UNIQUE
# 删除唯一约束:
ALTER TABLE first3 MODIFY age INT
# 联合唯一,设置两个字段同时相同
ALTER TABLE first3 ADD UNIQUE(age,sname)
# 删除联合唯一
ALTER TABLE first3 drop INDEX age
# DROP 删除表字段
ALTER TABLE first3 DROP move_date
# 新增表字段:add
# enum() 单选数据类型
ALTER TABLE first3 add sexe enum('man','wumen')
# set() 多选数据类型
ALTER TABLE first3 add hobbie SET('study','paly','sleep','swiming')
# AFTER 移动字段位置在某个字段后方 # first 移动字段位置为首位
ALTER TABLE first3 MODIFY start_date INT AFTER id_2
# 查看表字段信息
desc first3
# 主外键关联
# 创建表并进行主外键关联
# 创建部门表
create table dep(
id int primary key auto_increment,
dep_name varchar(16),
dep_desc varchar(255));
# 创建人员表
create table emp(
id int,
name varchar(6),
age int,
gender enum('male','female'),
dep_id int not null,
# 设置主键id,并添加主键自增属性
PRIMARY KEY auto_increment(id),
# 主外键关联,emp_dep为外键约束名称
CONSTRAINT emp_dep FOREIGN KEY(dep_id) REFERENCES dep(id))
# 在创建好的表中增加主外键关联
# emp为人员表,是dep部门表的子表
# emp_dep为主外键约束名称,删除外键约束时需要指定该名称
# dep_id:emp人员表中的外键
# dep(id):dep部门表中的主键
ALTER TABLE emp add CONSTRAINT emp_dep FOREIGN KEY(dep_id) REFERENCES dep(id)
# 添加 ON DELETE 和 ON UPDATE
# DELETE UPDATE 同时具有的属性:
#(1)restrict约束:删除父表数据时,需要检查子表中是否存在关联数据,如过存在,则不允许删除
#(2)no action约束:同上,如果存在不允许删除
#(3)cascade级联:删除父表数据,子表中关联的数据一起删除
#(4)set null:删除父表数据时,子表关联数据字段修改为null
# 如已进行外键关联想要增添加on delete属性时,需要先删除外键,重新添加外键时增加该属性
ALTER TABLE emp add CONSTRAINT emp_dep FOREIGN KEY(dep_id) REFERENCES dep(id) ON DELETE RESTRICT ON UPDATE RESTRICT
# 删除外键约束
ALTER TABLE emp DROP FOREIGN KEY emp_dep
# 查看主外键关联状态
SELECT @@FOREIGN_key_checks
# 禁用主外键约束
set foreign_key_checks=0
# 启用主外键约束
set foreign_key_checks=1
# 数据的增删改查
# 插入数据:INSERT
# 查看表字段
desc first3
# 删除主键
ALTER TABLE first3 DROP PRIMARY KEY
# 添加主键
ALTER TABLE first3 MODIFY id_2 int PRIMARY KEY auto_increment
# 插入一条数据,start_date=3
INSERT INTO first3 (start_date) VALUES (3)
# 插入多条数据,插入几行数据就加几个括号
INSERT INTO first3 (start_date) VALUES(3),(4),(5),(6)
# 修改数据/更新数据:UPDATE
# 更新一个字段数据
# 修改id_2=1的那条数据,将start_date的数据修改为9
UPDATE first3 SET start_date = 9 WHERE id_2 = 1
# 更新多个字段数据
UPDATE first3 SET start_date = 10,age = 18 WHERE id_2 = 1
# 删除数据:DELETE
# 删除指定数据 在表中删除id_2=1的字段
DELETE FROM first3 WHERE id_2 = 1
# 删除表中所有数据,清空数据表
DELETE FROM first3 # 不加where条件就是直接删除,后来新增的数据id以删除前最后一条最为开始
TRUNCATE TABLE first3 # 删除速度快,序号直接从0开始
# 查询数据
# 创建数据表
create table emp2 (
id int PRIMARY KEY auto_increment,
name char(20) not null,
gender enum('male','female') default 'male',
age int not null default 28,
hire_date date,
job_title varchar(30),
salary float(10,2),
office_num int,
dep_id int
)
# 插入数据
INSERT INTO emp2(name,gender,age,hire_date,job_title,salary,office_num,dep_id)values
('weiwei','male',78,'20150302','teacher',1000000.31,401,1),
('lala','male',81,'20130305','teacher',8300,401,1),
('zhangsan','male',73,'20140701','teacher',3500,401,1),
('liulaogen','male',28,'20121101','teacher',2100,401,1),
('aal','female',18,'20110211','teacher',9000,401,1),
('zhugelang','male',18,'19000301','teacher',30000,401,1),
('成龙','male',48,'20101111','teacher',10000,401,1),
('歪歪','female',48,'20150311','sale',3000.13,402,2),#以下是销售部门
('丫丫','female',38,'20101101','sale',2000.35,402,2),
('丁丁','female',18,'20110312','sale',1000.37,402,2),
('星星','female',18,'20160513','sale',3000.29,402,2),
('格格','female',28,'20170127','sale',4000.33,402,2),
('张野','male',28,'20160311','operation',10000.13,403,3), #以下是运营部门
('程咬金','male',18,'19970312','operation',20000,403,3),
('程咬银','female',18,'20130311','operation',19000,403,3),
('程咬铜','male',18,'20150411','operation',18000,403,3),
('程咬铁','female',18,'20140512','operation',17000,403,3)
# 查询所有字段信息,*标识所有字段
SELECT * FROM emp2
# 查询指定字段信息,在表中查询name和age两个字段的信息
SELECT name,age FROM emp2
# 通过4则运算查询,查询员工姓名及年薪。
SELECT name,salary*12 FROM emp2
# as 给查询的字段起别名为new_salary
SELECT name,salary*12 as new_salary FROM emp2
# as给表起别名
SELECT * FROM emp2 as e
# 根据where条件查询内容
# 查询老师的姓名及年龄,WHERE后面跟查询条件
SELECT name,age FROM emp2 WHERE job_title='teacher'
# and 多条件查询
SELECT name,age FROM emp2 WHERE job_title='teacher' and office_num=401
# or 多条件查询
SELECT name,age,office_num FROM emp2 WHERE job_title='teacher' or office_num=402
# BETWEEN……and 查询数值之间的数据
SELECT name,age FROM emp2 WHERE age BETWEEN 20 and 80
# >5000 and <8000 与between^and结论相同
SELECT name,age FROM emp2 WHERE age>20 and age<80
# in 在某某某数据里
SELECT name,age FROM emp2 WHERE age IN(28,38,48,58,68)
# not in 不在某某某数据里
SELECT name,age FROM emp2 WHERE age NOT IN(28,38,48,58,68)
# 模糊查询:like
# 查询name字段中以a开头的数据,%代表通配符,标识多个字符
SELECT name,age FROM emp2 WHERE name LIKE 'a%'
# 一个'-'代表一个字符
SELECT name,age FROM emp2 WHERE name LIKE 'a__'
# 分组查询:group by
# 将job_title进行分组,查询字段必须是分组字段
# 想要查询其他字段,可以借助于聚合函数count,avg,sum
SELECT job_title FROM emp2 GROUP BY job_title
# count(id)计算分组后id的数量
SELECT job_title,COUNT(id)FROM emp2 GROUP BY job_title
# avg(age)计算分组后的平均年龄
SELECT job_title,avg(age)FROM emp2 GROUP BY job_title
# 查看男女员工最大年龄,最小年龄,和整体年龄
SELECT gender,MAX(age),MIN(age),SUM(age)FROM emp2 GROUP BY gender
# having语句:将分组后的数据进行筛选查询
SELECT age FROM emp2 GROUP BY age having age=28
# 升序:ORDER BY 字段名称 asc
SELECT age FROM emp2 ORDER BY age asc
# 降序:ORDER BY 字段名称 desc
SELECT age FROM emp2 ORDER BY age desc
# limit 查询显示数据数量
# 显示前3条
SELECT name,age FROM emp2 LIMIT 3
# 从1条开始往后查5条
SELECT name,age FROM emp2 LIMIT 0,5
# 从5条开始往后查7条
SELECT name,age FROM emp2 LIMIT 4,7
# 正则查询:REGEXP
# 以指定字符头:‘^’
SELECT name,age FROM emp2 WHERE name regexp '^w'
# 以指定字符结尾:’$‘
SELECT name,age FROM emp2 WHERE name REGEXP 'i$'
# 匹配指定字符内容:
SELECT name,age FROM emp2 WHERE age REGEXP '8'
# 多表联查
#删除表
DROP TABLE dep;
DROP TABLE emp
# 准备数据
# 创建部门表
create table dep(
id int primary key,
name char(20));
# 创建员工表
create table emp(
id int primary key auto_increment,
name char(20),
sex enum("male","female") not null default "male",
age int,
dep_id int);
# 在员工表中增加职位id
ALTER TABLE emp add posit_id int
# 创建员工岗位表
CREATE TABLE posit(
id int PRIMARY KEY auto_increment,
posit_name VARCHAR(30) NOT NULL,
posit_detil VARCHAR(50)
)
# 员工岗位表中增加部门id字段
ALTER TABLE posit ADD dep_id INT
# 查看部门数据
SELECT * FROM dep
# 修改部门数据
UPDATE dep SET name='产品' WHERE name='销售'
UPDATE dep SET name='hr' WHERE name='人力资源'
# 插入岗位数据
INSERT INTO posit(dep_id,posit_name,posit_detil) VALUES
(3,'产品经理','负责产品设计及项目跟进'),
(3,'产品助理','负责协助产品经理'),
(2,'前端开发工程师','负责网页界面编写'),
(2,'后端开发工程师','负责产品服务端逻辑代码编写'),
(4,'运营经理','负责产品上线运营工作'),
(5,'人力资源管理师','负责人员招聘及人才储备等工作')
# 部门表插入数据
insert into dep(id,name) values
(200,'技术'),
(201,'人力资源'),
(202,'销售'),
(203,'运营');
# 员工表插入数据
insert into emp(name,sex,age,dep_id) values
('ailsa','male',18,200),
('lala','female',48,201),
('huahua','male',38,201),
('zhangsan','female',28,202),
('zhaosi','male',18,200),
('shenteng','female',18,204)
# 多表拼接
# 内连接:inner join
# 内连接需要两个表中关联的字段同时存在两个表中,若某条数据只存在一个表中时,则合并后不显示该条数据
SELECT * FROM emp INNER JOIN dep ON emp.dep_id = dep.id
# 外连接-左连接
# 以左边的表为主,到右边的表中匹配内容,若左表中内容右表中没有,则右表数据为null
SELECT * FROM emp LEFT JOIN dep ON emp.dep_id = dep.id
# 外连接-右连接
# 以右边的表为主,到左边的表中匹配内容,若右表中内容左表中没有,则左表数据为null
SELECT * FROM emp RIGHT JOIN dep ON emp.dep_id = dep.id
# 三表连接
SELECT * FROM(emp LEFT JOIN dep ON emp.dep_id = dep.id)
LEFT JOIN posit ON emp.posit_id = posit.id
# 练习题
# 以内连接的方式查询emp和dep表,并且emp表中的age字段值必须大于25,即找出年龄大于25岁的员工以及员工所在的部门\
# 以内连接的方式查询emp和dep表,并且emp表中的age字段值必须大于25,并且以age字段的升序方式显示
SELECT emp.name,dep.name,emp.age FROM emp INNER JOIN dep
ON emp.dep_id = dep.id WHERE age > 25 ORDER BY age ASC
# 查询平均年龄在25岁以上的部门名
SELECT dep.name,avg(emp.age) as a FROM emp INNER JOIN dep ON emp.dep_id = dep.id
GROUP BY dep.name HAVING a > 25
# 查看技术部员工姓名
# 嵌套查询方法
SELECT name FROM emp WHERE dep_id = (SELECT id FROM dep WHERE name = '技术')
# 多表链接查询方法
SELECT emp.name FROM emp INNER JOIN dep ON emp.dep_id = dep.id WHERE dep.name = '技术'
# 查询大于所有人平均年龄的员工名字与年龄
SELECT name,age FROM emp WHERE age > (SELECT AVG(age) FROM emp)