mysql数据库

一:常见的数据库

SQL Server: 微软的产品,与net平台兼容比较好!!!收费的。

     Oracle:甲骨文公司的产品。与java平台兼容性最好!!!收费的。中大型企业(中大型应用)

     mysql:开源产品。免费的。与java平台兼容性最好!!中小企业(中小应用)                                                         本文主要研究mysql数据库;再分析之前必须先明确先有数据库,再有表,然后才有数据;我们是通过sql语句对mysql数据库进行数据管理  。

 二:管理数据库

2.1 查看所有数据库
show databases; --分号结束。sql语句就会发送给mysql服务器端执行
2.2 创建数据库
create database day01;
2.3 删除数据库
drop database day01;
2.4 修改数据库
alter database day01 default character set gbk;--将数据库的编码方式修改为gbk编码方式。
三 管理表(table)
3.1 查询所有表
use day01;--确定在那个数据库中建立表
show tables;--查看数据库中所有表
3.2 创建表
案例:创建一个学生表,字段(id,name,chinese,math,english)
CREATE TABLE student(
id INT,
NAME VARCHAR(20),
chinese INT,
math INT,
english INT
);
3.3 删除表
drop table student;
3.4 修改表
(1)添加字段
alter table student add column sex varchar(4);
(2)修改字段类型
alter table student modify column sex varchar(2);
(3)修改字段名称
alter table student change column sex gender varchar(3);
(4)删除字段
alter table studnet drop column gender; --删除一列
alter table studnet drop column gender,drop column english; --删除两列
(5)修改表名
alter table student rename to student1;
四 管理数据
4.1 查看表的数据
select * from student;
4.2 插入数据
insert into student values(1,'张三丰',89,78,90);
--插入时数据一定要和值的数量一致
insert into student(id,name,english) values (2,'刘诗诗',89);
4.3 修改数据
update student set sex='男'; --一般情况,很少对所有数据进行修改,经常是对具体的某个条件进行修改
需求:将id为2的学生的语文成绩改为96;
update student set chinese=96 where id=2;
4.4 删除数据
delete from student; --全表删除,请注意此时删除的是表中的数据,但是表依然存在在day01数据库中;删除表时用delete其他为drop。
delete from student where id=2; --按条件删除数据
truncate table; --删除全表数据;
注意 delete from 和 truncate table 的区别?

1)delete from删除全部,也可以按条件删除,但是truncatetable只能全表删除,不能按条件删除

2)delete from删除的数据可以回滚,truncatetable删除的数据不能回滚。

3)delete from不可以把自增长约束(auto_increment)重置,truncate table可以把自增长约束(auto_increment)重置

4)truncate不可以按指定条件删除

五 查询数据

5.1查询所有列

select * from student;

5.2查询指定列(多个列之间用逗号隔开)

select name,chinese from student;

5.3查询时指定别名

select name as '姓名' from student; --as可以省略

5.4合并列查询

select name ,(chinese+math+english) from student; --一般都是数值的合并

5.5去除重复数据

select distinct chinese from student;

5.6条件查询

(1)逻辑条件 and or

需求:查询id值为3,且性别为男的学生

select * from student where id=3 and sex='男';

需求:查询id为3,或性别为男的学生

select * from student where id =3 or sex='女';

(2)比较条件 > < >= <= = between and

需求: 查询chinese分数大于80分的学生

select * from student where chinese>80;

需求:查询math分数小于或等于80分的学生

select * from student where math<=80;

select * from student where math<80 or math=80;

(3)判空条件 =''  isnull  <>''  is not null

需求: 查询name字段为空的学生(包含null,也包含字符串)

select * from student where name is null or name='';

(4)模糊条件 like

like后面跟上符号:%表示任意多个字符;_表示一个字符;

需求: 查询姓李的学生

select * from student where name like '李%';

需求:查询名字第二个字为诗的学生

select * from studnet where name like '_诗%';

5.7聚合查询

(1)需求:查询所有学生chinese的总分 (SUM: 求和函数)
select sum(chinese) from student;

(2)需求:查询所有学生math的平均分(AVG; 平均函数)

select avg(math) from student;

(3)查询最高的math分数(MAX:最大值函数)(MIN:最小值函数)

select max(servlet) from student;

(4)一共几个学生(COUNT: 统计数量函数)

select count(*) from student;

5.8 分组查询:

需求: 查询男女的数量各自多少

select gender,count(*) as '人数' from student group by gender;
5.9 分组筛选 (group by + having(条件))
需求:查询人数大于2的性别
select gender,count(*) as '人数' from student group by gender having count(*)>2
5.10分页查询
limit起始行数(从0开始),查询的行数
需求:学生共20条数据,每页显示5条,共4页

看第3页(第11到15条)的学生数据sql:select * from student limit 10,5;

看第4页(第16到20条)的学生数据sql: select * fromstudent limit 15,5;

注意:结论分页查询当前页数据的sql: select * from student limit (当前页码-1)*每页显示条数,每页显示条数;
5.11查询后排序(oder by)
desc:降序;asc:升序
需求:按照id的升序排序
select * from student oder by id asc;
需求: 按照name升序,按照math成绩升序排序
select * from student oder by age name,math asc;
六 字段类型
(1) char(20) vs varchar(20)

char(20): 固定长度的字符串。不管实际存储的数据的大小,一定占用20个字符空间

varchar(20): 可变长度的字符串。占用的空间大小就是实际存储的数据大小。

(2) int vs int(4)

  int:默认最多11位,长度根据实际存储的数值的长度

int(4): 固定的数值长度

七 数据约束

7.1 默认值约束:当前没有插入默认值字段的时候,默认值才会起作用

CREATE TABLE test(
	NAME VARCHAR(20),
	gender VARCHAR(2) DEFAULT '男'
)

INSERT INTO test(NAME) VALUES('张三');
INSERT INTO test(NAME,gender) VALUES('张三',NULL);
7.2 非空约束:不能不插入值;不能插入null;
CREATE TABLE test(
	NAME VARCHAR(20) NOT NULL,
	gender VARCHAR(2)
)

7.3 唯一约束(UNIQUE):不能插入重复值;可以插入多个null;

7.4主键约束(primary key):唯一+非空

注意:

-- 1)通常情况下,我们会给每张表都会设置一个主键字段,用来标记记录的唯一性

-- 2)但是不建议把业务含义字段(姓名,年龄等)作为主键,因为随着业务的变化,业务字段可能会出现重复。

-- 3)建议给每张张独立添加一个叫id的字段,把这个id字段设置成主键,用来作为记录的唯一性。

7.5 自增长约束(auto_acrement):初始值为0,每次自增长1;

7.6 外键约束:一般当一个数据表中出现冗余,有可能需要重新设计一张表,这时会增加外键约束;

当有了外键约束之后,操作数据的顺序如下:

 插入数据:先插入主表的数据,再插入副表数据

 修改数据:先修改主表数据,再修改副表数据

 删除数据:先删除副表数据,再删除主表数据

需求:deptId字段值来自于dept表的id字段的值,这时可以给deptId字段添加外键约束。

CREATE TABLE employee(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20),
	deptId INT,
	CONSTRAINT employee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id)
	--          外键名称                     外键字段  参考          
)
8 数据库设计:

第一范式:要求表的每个字段必须独立的不可分割的单元(每个字段的值唯一确定)
第二范式:在第一范式的基础上,要求表的除主键以外的字段都和主键有依赖关系的(每个字段都和主键有直接或间接的关系)

第三范式: 在第二范式基础上,要求表的除主键外的字段都只能和主键有直接决定的依赖关系(每个表只和主键有关系,只由主键决定)

9 多表查询

步骤:(1)确定查询哪些表(2)确定查询那些字段(3)确定连接条件

9.1 交叉连接查询(容易产生笛卡尔积)

9.2 内连接查询

SELECT e.name,d.name
	FROM employee e,dept d
	WHERE e.deptId=d.id;
9.3 左外连接查询:左表的数据全部显示,又表的数据当满足条件时就显示,不满足就显示为null;

SELECT d.name,e.name
	FROM dept d
	LEFT OUTER JOIN employee e
	ON d.id=e.deptId;	
9.4 右外连接查询:右表的数据全部显示,左表的数据当满足连接条件的时候,就显示满足条件的数据,但是如果不满足连接条件,则显示null
SELECT d.name,e.name
	FROM employee e
	RIGHT OUTER JOIN dept d
	ON d.id=e.deptId;   
9.5 自连接查询
SELECT e.name AS '员工',b.name AS '上司'
	FROM employee e
	LEFT OUTER JOIN employee b
	ON e.bossId=b.id;
mysql存储过程

创建存储过程

-- 定义结束符号

DELIMITER 结束符号

CREATE PROCEDURE 存储过程名称 (形式参数列表)

BEGIN

         多个sql语句

END 结束符号

 

-- 调用存储过程

CALL 存储过程名称(实际参数列表);

 

参数类型:

IN: 输入参数,可以携带数据到存储过程中

OUT: 输出参数,可以携带数据到存储过程外面。

INOUT: 输入输出参数。

如何接受存储过程的输出参数呢?定义变量去接受输出参数

 mysql数据库三种变量:

         --1)全局变量。mysql内置的变量,mysql程序关闭的时候全局变量才会失效!!

           -- show variables:产看全局变量

           --character_set_client: mysql接收的客户端的数据编码

          --character_set_results: mysql使用什么编码输出给客户端数据

           -- 查看某个全局变量: select @@变量名

           -- 修改某个全局变量: set @@变量名=值

         --2) 会话变量。变量只在某次登录的会话中有效!退出连接,会话变量数据失效!!  

                -- 查看某个会话变量: select @变量名

                 -- 修改/定义某个会话变量: set @变量名=值

           -- 案例:演示查询和更改会话变量

         --3) 局部变量:在存储过程中定义的变量。存储过程结束局部变量失效!!

                 -- 查看某个局部变量: select 变量名

                 -- 修改某个局部变量: set 变量名=值

                 -- 定义某个局部变量: declare 变量名 数据类型;

十一:触发器:当往员工表插入/修改/删除一条数据的时候, 同时往日志表记录下来,这时就要使用触发器完成。

11.1语法介绍:

需求: 当往员工表插入一条数据时,往员工日志插入一条记录。

创建增加触发器

CREATE TRIGGER tri_empAdd AFTER INSERT ONemployee FOR EACH ROW

         INSERTINTO emp_log(content) VALUES('员工被插入了一条记录');

创建修改触发器

CREATE TRIGGER tri_empUpd AFTER UPDATE ONemployee FOR EACH ROW

         INSERTINTO emp_log(content) VALUES('员工被修改了一条记录');

创建删除触发器

CREATE TRIGGER tri_empDel AFTER DELETE ONemployee FOR EACH ROW

         INSERTINTO emp_log(content) VALUES('员工被删除了一条记录');

11.2 数据库权限问题

 root用户:超级管理员。   权限: 增删改查(数据库,表,数据)

-- 加密函数(md5算法--单向加密)

SELECT PASSWORD('root'); --*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B

-- 修改用户密码

UPDATE USER SET PASSWORD=PASSWORD('123456')WHERE USER='root';

-- 分配权限给不同的用户

-- 需求: 分配查询day15数据库的employee表的权限给eric用户,密码为‘123456’

GRANT SELECT ON day15.employee TO'eric'@'localhost' IDENTIFIED BY '123456';










































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值