1数据库的基本操作
1.1查看所有存在数据库
show databases;
1.2创建数据库
(1)create databaseday15;
(2)create database day15
default character set utf8;(指定默认字符集为utf-8)
1.3删除数据库
drop datebase day15;
1.4查看数据库的默认字符集
show create database day15;
1.5修改数据库(修改数据库的字)
alter database day15 defaultcharacter set gbk;
6选择数据库
useday15;
2数据库表的操作
2.1查看数据库的所有表
useday15;(查看表之前需要先选择数据库)
showtabkes(查看数据库中的所有表)
.2.2创建表 这里写代码片
(数据名称 数据类型, 数据名称 数据类型)
createtable student(sid int,sname varchar(20),sage int);
(sidint,sname varchar(20),sage int);
.2.3查看表的结构
desc student;
.2.4删除表
droptable student;
2.5修改表
2.5.1添加一个字段(添加一列)
altertable student add column sgender varchar(20);
ALTERTABLE student ADD servlet INT,ADD jsp INT;
2.5.2删除一个字段(添加一列)
altertable student drop column sgender;
2.5.3修改一个字段的类型
altertable student modify( column) sgender varchar(100);
2.5.3修改一个字段的名称
altertable student change( column) sgender gender varchar(20);
2.5.3修改表的名称
altertable student rename(to)teacher;
3增删改数据
3.1增加数据
3.1.1插入所有字段
INSERTINTO student VALUES(1,'张三','男',20);
⚠️注意:插入所有的字段;要一次按顺序插入,不能少或者多字段的值
3.1.2插入部分字段
INSERTINTO student(id,NAME) VALUES(1,'张三');
3.2查询数据
3.2.1查询表中所有数据
SELECT *FROM student;
(查询表中所有数据);
3.3修改数据
3.3.1修改所有数据(少用)
UPDATEstudent SET gender='女';
3.3.2带条件的修改
UPDATEstudent SET gender='女' where id=1;
3.3.3带条件的修改(修改多个字段)
UPDATEstudent SET gender='男',age=30 WHERE id=2;
3.4删除数据
3.4.1删除所有数据(少用)
deletefrom student;
3.4.2删除待条件数据
DELETEFROM student WHERE id=1;
3.4.2另一种删除数据的方式
TRUNCATETABLE student;
3.4.2 (delete from)和(truncatetable)的区别
(deletefrom)可以带条件删除(truncate table)不能带条件删除
(deletefrom)不可以删除约束(truncate table)可以删除约束
(deletefrom)删除的数据可以回滚(事务) (truncate table) 删除的数据不可以回滚(事务)
3.5查询数据(重点)—基于一张表的查询
3.5.1查询所有列
SELECT *FROM student;
3.5.2查询指定列
SELECTid,NAME FROM student;
SELECTid AS ‘编号’,NAMEAS ‘姓名’ FROM student;(查询时指定别名-在多表查询时很有用)
3.5.3查询时添加常量列
SELECTid,NAME,chinese,english,math,'java就业班' FROM student;
SELECTid,NAME,chinese,english,math,'java就业班'AS '年级' FROM student;
3.5.4查询时合并列 (只能合并数值类型的列)
SELECTid,NAME,(servlet+jsp) AS '总成绩' FROM student;
3.5.5查询时去除重复记录
SELECTDISTINCT gender FROM student;
3.5.6条件查询(where)
①逻辑条件:and(与) or(或)
SELECT *FROM student WHERE id=2 OR NAME='王五';
②比较条件:< > >= <= == <>(不等于) (between and)代表>=并且<=
SELECT *FROM student WHERE jsp>90;
③判空条件(null 空字符串): is null/is not null /==/<
SELECT *FROM student WHERE jsp IS NULL;
④模糊条件(like)
SELECT *FROM student WHERE NAME LIKE '李_';(只能是两个字)
SELECT *FROM student WHERE NAME LIKE '李%';(不限制字符)
3.5.7聚合查询
常用的聚合函数:sum() avg() max() min() count()
SELECTSUM(servlet) AS ‘总成绩’ FROM student;
SELECTAVG(servlet) AS ‘平均分’ FROM student;
SELECTMAX(servlet) AS ‘最高分’ FROM student;
SELECTMIN(servlet) AS ‘最低分’ FROM student;
SELECTCOUNT(*) AS ‘字段数’ FROM student;(统计字段最大的数量.
COUNT统计的数量不包括null的数据,尽量使用不包含null的字段)SELECTCOUNT(id) AS ‘字段数’ FROM student;
3.5.8分页查询(LIMIT 起始行(从0开始),查询几条记录)没有记录则不显示
分页查询sql语句SELECT * FROM student LIMIT (当前页-1)*每页显示的条数,每页显示的条数
SELECT *FROM student LIMIT 0,2;
3.5.9查询排序
–查询排序 默认情况下按插入记录的顺序–
–语法 ORDER BY 字段 ASC/DESC–
–ASC 顺序,正序,递增,字母,自然顺序(a-z)–
–DESC 倒序,反序,递减,字母,自然反序(z-a)–
SELECT *FROM student ORDER BY id ASC;
SELECT *FROM student ORDER BY id DESC;
SELECT *FROM student ORDER BY jsp DESC,servlet DESC;
3.5.10分组查询
–分组查询(GROUP BY )–
–需求:查询男女的人数—
SELECTgender,COUNT(*) AS '人数' FROM student GROUP BY gender;
3.5.11分组查询后筛选
– 需求:查询人数大于2的性别(分组之后的筛选用having-分组之前用where-
SELECTgender,COUNT() FROM student GROUP BY gender HAVING COUNT()>3;
总结
mysql基础
1)mysql存储结构:数据库 -> 表 -> 数据 sql语句
2)管理数据库:
增加: create database 数据库 default character utf8;
删除: drop database 数据库;
修改: alter database 数据库 default character gbk;
查询: show databases / show createdatabase 数据库;
3) 管理表:
选择数据库:use 数据库;
增加: create table 表(字段名1字段类型,字段名2 字段类型......);
删除: drop table 表;
修改:
添加字段: alter table 表 add [column] 字段名 字段类型;
删除字段: alter table 表 drop[column] 字段名;
修改字段类型: alter table 表 modify 字段名 新的字段类型;
修改字段名称 : alter table 表 change 旧字段名 新字段名 字段类型;
修改表名称: alter table 表 rename [to] 新表名;
查询:
showtables / desc student;
4) 管理数据:
增加: insert into 表(字段1,字段2,。。。) values(值1,值2.。。。。);
删除: delete from 表 where 条件;
修改: update 表 set 字段1=值1,字段2=值2...... where条件;
查询:
4.1)所有字段: select * from 表;
4.2)指定字段: select 字段1,字段2....from 表;
4.3)指定别名: select 字段1 as 别名from 表;
4.4 )合并列: select (字段1+字段2) from 表;
4.5)去重: select distinct 字段 from 表;
4.6)条件查询:
a)逻辑条件 :and(与) or(或)
select* from 表 where 条件1 and/or 条件2
b)比较条件: > < >= <= = <> between and(在。。。之间)
select* from 表 whereservlet>=90;
c)判空条件:
判断null: is null / isnot null
判断空字符串: ='' / <>''
d)模糊条件: like
%: 替换任意个字符
_: 替换一个字符
4.7 分页查询:limit 起始行,查询行数
起始行从0开始
4.8 排序: order by 字段 asc/desc
asc:正序,顺序
desc:反序,倒序
4.9 分组查询:group by 字段
4.10: 分组后筛选: having 条件
SQL语句的分类:
DDL: 数据定义语言
create /drop / alter
DML:数据操作语句
insert /delete /update / truncate
DQL: 数据查询语言:
select / show
今天的目标:
大纲:
1)数据约束
2)数据库设计(表设计)
3)存储过程
4)触发器
5)mysql权限问题
5数据的约束
5.1什么是数据约束
对用户操作表的数据进行约束
5.2默认值(DEFAULT)
默认值插入允许为null
只有在不插入值的时候默认值才可以使用
CREATE TABLE TEXT(
id INT,
NAME VARCHAR(20),
address VARCHAR(20) DEFAULT '河南信阳'-- 默认值
);
5.3非空(not null)
必须得赋值,而且不能赋值为null
CREATETABLE student(
id INT NOT NULL,
NAME VARCHAR(20),
address VARCHAR(20) DEFAULT '河南信阳'-- 默认值
);
5.4唯一(unique)
不能有一样的id,但是不能对null起作用,在有值的情况下才起作用
CREATETABLE student(
id INT UNIQUE,
NAME VARCHAR(20) NOT NULL,
address VARCHAR(20) DEFAULT '河南信阳'-- 默认值
);
5.5主键(非空+唯一PRIMARY KEY,)
通常情况下,每张表都会设置一个主键的字段,用于标记表中数据的唯一性。
建议不要选择表的包含业务含义的字段作为主键,建议给每张表设计一个非业务字段的id作为主键
CREATETABLE student(
id INT(4) ZEROFILL PRIMARYKEY,//不满四位用0填充
NAME VARCHAR(20) NOT NULL,
address VARCHAR(20) DEFAULT '河南信阳'-- 默认值
);
5.6自增长(AUTO_INCREMENT)
作用:自动的递增
可以不赋值,自动的增加
CREATETABLE student(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20) NOT NULL,
address VARCHAR(20) DEFAULT '河南信阳'-- 默认值
);
5.6外键的约束
作用;主要约束两张表
插入数据是部门名称冗余比较高
–解决冗余问题,给冗余的字段放到一张单独的表中,将冗余的字段单独出一张表
外键是设置在副表上的,主表的参考字段通常为主键
添加数据必须添加主表
1.当有了外键约束的时候,添加数据的顺序:先添加主表的数据,在添加副表的数据
2.当有外键的约束,修改数据的顺序:不能先修改主表,先改副表(确认副表中没有与主表关联的数据),再改主表
3.当有外键的约束的时候,删除数据的顺序:先删除副表是的数据,再删除主表的数据
CREATETABLE employee(–副表/从表)
id INT PRIMARY KEY,
empName VARCHAR(20),
-- deptName varchar(20) -- 部门名
deptId INT, -- 部门id
-- 声明外键约束
CONSTRAINTemploy_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id)
-- 外键的名称 外键 参考表(参考字段)
); SHOWTABLES;
– 设计一个部门表
CREATETABLE dept((–主表)
id INT PRIMARY KEY,
deptName VARCHAR(20)
);
INSERTINTO employee VALUE(1,’张三’,1);
INSERTINTO employee VALUE(2,’李四’,1);
INSERTINTO employee VALUE(3,’王五’,2);
4.问题 当有了外键约束的时候,必须先删除或修改副表的数据,才能修改主表中的数据
5.7级联的操作
问题: 当有了外键约束的时候,必须先修改或删除副表中的所有关联数据,才能修改或删除主表!但是,我们希望直接修改或删除主表数据,从而影响副表数据。可以使用级联操作实现!!!
级联修改: ON UPDATE CASCADE
级联删除: ON DELETE CASCADE
CREATE TABLE employee(
id INT PRIMARY KEY,
empName VARCHAR(20),
deptId INT,-- 把部门名称改为部门ID
-- 声明一个外键约束
CONSTRAINT emlyee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id) ON UPDATE CASCADE ON DELETE CASCADE -- ON CASCADE UPDATE :级联修改
-- 外键名称 外键 参考表(参考字段)
)
注意: 级联操作必须在外键基础上使用
– 级联修改(修改)
– 直接修改部门
UPDATE dept SET id=5 WHERE id=4;
– 级联删除
– 直接删除部门
DELETE FROM dept WHERE id=1;
6数据库的设计
6.1三大范式
6.1.1第一范式
要求每个字段必须是不可分割的独立单元
Student : name —违反了第一范式
张小明|狗娃 查询的时候会出问题
正确做法: Student: name oldname
张小明 |狗娃
6.1.2第二范式
在第一范式的基础上,要求每张表只表达一个意思,表的每个字段和表的主键有依赖
6.1.3第三范式
在第二范式基础,要求每张表的主键之外的其他字段都只能和主键有直接决定依赖关系。
违反第三范式,数据冗余会比较高,需要使用外键
7关联查询(多个表之间的查询)
– 关联查询–
– 需求:查询出员工及其所在的部门(希望显示员工姓名,部门名称)
– 交叉链接查询(产生笛卡尔乘积现象;3*3=9,有些记录重复)不推荐使用
SELECT empName,deptName FROM employee,dept
– 内连接查询
– 多表查询的规则,1、确定查询哪些表。2,确定哪些字段
– 3.表与表之间连接条件
– 需求:查询出员工及其所在的部门(希望显示员工姓名,部门名称)
SELECT empName,deptName
FROMemployee,dept
WHEREemployee.deptId=dept.id;-- 连接条件是查询表数目减一
– 内连接的另一种语法
SELECT empName,deptName
FROMemployee
INNERJOIN dept
ONemployee.deptId=dept.id;
– 内连接使用别名
SELECT empName,deptName
FROMemployee AS e
INNERJOIN dept AS d
ONe.deptId=d.id;
– 左外连接查询:使用左边表的数据去匹配右边的数据,如果符合连接条件的结果则显示,如果不符合连接条件则显示为null
– 如果是左外连接,左边表的数据一定会显示
– 需求 查询每个部门的员工
SELECT d.deptName,e.empName
FROMdept d
LEFTOUTER JOIN employee e
ONd.id=e.deptId;
– 右[外]连接查询
– 使用右边表的数据去匹配左边的数据,如果符合连接条件的结果则显示,如果不符合连接条件则显示为null
– 如果是右外连接,右边表的数据一定会显示
SELECT d.deptName,e.empName
FROMemployee e
RIGHTOUTER JOIN dept d
ONd.id=e.deptId;
– 自连接查询
– 需求:查询员工及其上司
SELECT e.empName,b.empName
FROMemployee e
LEFTOUTER JOIN employee b
ONe.bossId=b.id;
ALTER TABLE employee ADD bossId INT;
UPDATE employee SET bossId=NULL WHERE id=1;
UPDATE employee SET bossId=2 WHERE id=2;
UPDATE employee SET bossId=3 WHERE id=3;
8存储过程
8.1什么是存储过程
存储过程:带有逻辑的sql语句
之前是sql没有条件判断,没有循环
存储过程带上流程控制语句(if while)
8.2存储过程特点
1)执行效率非常快!存储过程是在数据库的服务器执行的!!
2)移植性很差,不同数据库的存储过程是不能移植的
8.3存储过程的使用
– 存储过程
– 声明结束符
DELIMITER ¥ –声明存储过程的结束符
CREATE PROCEDURE pro_test() – 存储过程名称(参数列表)
BEGIN
--可以写多个sql语句;
SELECT* FROM employee;
END ¥ – 结束 结束符
– 调用存储过程
CALL pro_test();
参数:
IN:表示输入参数,可以携带数据带存储过程中
– 带有存储输入参数的存储过程
– 需求 传入一个员工的id,查询员工的信息
DELIMITER $
CREATE PROCEDURE pro_finfById(IN eid INT)
BEGIN
SELECT* FROM employee WHERE id=eid;
END $
– 调用
CALL pro_finfById(2);
OUT:表示输出参数,可以从存储过程中返回结果
– 带有输出参数的存储过程
DELIMITER $
CREATE PROCEDURE pro_testOut(OUT strVARCHAR(20))
BEGIN
SETstr='这是一个输出参数';
END $
– 调用
– 如何接受返回参数的值?
– *****MySQL的变量
– 全局变量(内置变量):
--查看所有的全局变量:show variables
--查看某个全局变量:select @@变量名
--修改全局变量:set 变量名=新值
--character_set_client:mysql服务器接收数据的编码
--character_set_results:mysql服务器输出数据的编码
– 会话变量:只存在于当前客户端与数据库服务器端是一次连接当中,如果连接断开,变量丢失
--定义会话变量:set @变量=值
--查看会话变量:select @变量
– 局部变量:在存储过程中使用的变量就叫局部变量,只要存储过程执行完毕,局部变量就会丢失
– 定义一个会话变量
CALL pro_testOut(@NAME);
– 查看变量值
SELECT @NAME;
INOUT: 表示输入输出参数,既可以输入,也可以输出功能
– 带有输入输出参数的存储过程
DELIMITER $
CREATE PROCEDURE pro_testInOut(INOUT n INT)
BEGIN
– 查看变量
SELECTn;
SETn=500;
END $
– 调用
SET @n=10;
CALL pro_testInOut(@n);
SELECT @n;
– 带有条件判断的存储过程
– 需求 输入一个整数,如果是1 返回“星期一”,如果是2,返回“星期二”
DELIMITER $
CREATE PROCEDURE pro_testIf(IN num INT,OUTstr VARCHAR(20))
BEGIN
IFnum=1 THEN
SETstr='星期一';
ELSEIFnum=2 THEN
SETstr='星期二';
ELSEIFnum=3 THEN
SETstr='星期三';
ELSE
SET str='输入错误';
END IF;
END $
– 调用
SET @num=1;
CALL pro_testIf(@num,@str);
SELECT @str;
– 把查询结果作为返回值
DELIMITER $
CREATE PROCEDURE pro_testfindById(IN eidINT,OUT vname VARCHAR(20))
BEGIN
SELECTempaName INTO vname FROM employee WHERE id=eid;
END $
9触发器
9.1触发器的作用
当操作
9.2触发器的用法
– 触发器
USE day16;
SELECT * FROM employee;
– 日志表
CREATE TABLE test_log(
idINT PRIMARY KEY AUTO_INCREMENT,
contentVARCHAR(100)
);
– 需求:当向员工表插入一条记录时,希望MySQL自动同时在日表中插入数据】
– 创建触发器
CREATE TRIGGER tri_empAdd AFTER INSERT ONemployee FOR EACH ROW – 当往员工表插入一条记录时
INSERTINTO test_log(content) VALUES('员工表插入一条记录');
– 插入数据
INSERT INTO employee(id,empName,deptId)VALUES(4,’张三’,1);
INSERT INTO employee(id,empName,deptId)VALUES(5,’李四’,2);
– 修改数据
CREATE TRIGGER tri_empUpd AFTER UPDATE ONemployee FOR EACH ROW – 当往员工表修改一条记录时
INSERTINTO test_log(content) VALUES('员工表修改一条记录');
– 修改
UPDATE employee SET deptId=2 WHERE id=4;
– 删除数据
CREATE TRIGGER tri_empDel AFTER DELETE ONemployee FOR EACH ROW – 当往员工表删除一条记录时
INSERTINTO test_log(content) VALUES('员工表删除一条记录');
– 删除
DELETE FROM employee WHERE id=4;
SELECT * FROM employee;
SELECT * FROM test_log;
9权限问题
– ********MySQL权限问题
– MySQL数据库权限问题:root:拥有所有权限(可以干任何事情)
– 权限账户:只拥有部分权限(CURD)例如,只能操作摸个数据库的某张表
– 如何修改MySQL的用户密码?
– password:md5加密函数(单向加密)
SELECT PASSWORD(‘root’);–*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
– mysql数据库 用户配置:user表
USE mysql;
SELECT * FROM USER;
– 修改密码
UPDATE USER SET PASSWORD=PASSWORD(‘123456’)WHERE USER=’root’;
– 分配权限账户
GRANT 权限 ON 数据库.表 TO ‘账户名’@’账户类型’ IDENTIFIED BY ‘密码’;
GRANT SELECT ON day16.employee TO’lijun’@’localhost’ IDENTIFIED BY ‘5618’;
– * mysql的备份和还原
– 备份 必须退出数据库登录 在命令行中写入此命令 不需要登录
mysqldump -u root -p day16 > e:/dayl6.sql;
– 还原必须退出数据库登录 在命令行中写入此命令 不需要登录
mysql -u root -p day16 < e:/dayl6.sql;