Mysql--day01

数据库—day01

概念

数据库就是存储数据的仓库。指的是长期保存在计算机中的存储设备上,按照一定规律组织起来的可以被各种应用或用户共享的数据的集合体。
数据库(DataBase,简称DB):文件系统

数据是对客观事物的抽象表示。在计算机科学中所有输入到计算机中并且能被计算机处理的符号都是数据。

数据库管理系统(DataBase Management System,简称 DBMS)
是一个操作和管理数据库的软件。
作用:创建,使用,维护,管理数据库。
对数据库进行统一的管理和控制。来保证数据库中的数据的安全性和完整性。

用户是通过数据库管理系统访问数据库中的数据。

数据库:存储,维护,管理数据的集合体。

广义上的数据库概念指的是数据的一种存储方式,区别普通文档的文件存储方式。
狭义上的解释,系统为了维护和管理数据库中的数据,提供的一个逻辑上的集合体。

为什么数据要存储到数据库中?

存储在纸上或者文档中的数据不方便我们进行查找和更新。还无法保证数据的正确性和准确性。
在软件开发中必须要保证数据是正确的。这个刚好就是数据库的一个优点。

数据库是把数据存储在数据表中,表和表之间还可以建立关系,还可以对
数据进行一些约束,这样就可以保证数据的正确性和准确性以及可靠性。还方便我们对数据进行增删改查各种操作。

常用的数据库
Oracle:oracle公司的数据库产品,主要用在大型企业数据库领域中。
Mysql:体积小,速度快,功能也全。被广泛用于中小型企业。
Sql Server:微软(Microsoft) 界面友好,容易上手。
db2:ibm公司的数据库产品。

sql

结构化查询语言(Structured Query Language)简称SQL。专门用来操作数据库的语言。
一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。

优点
不再是某个数据库的特有语言,现在几乎所有的数据库管理系统都支持这个sql标准。
简单,易学。sql语句都是由描述性很强的单词组成的。而且数量不多。
非过程话:用sql语句操作数据库的时候,只需要告诉它我要干什么,不用说 怎么干。存取路径的选择和操作的执行由dbms自动完成。

sql的分类:

DDL(Data Defination Language):数据定义语言
用来定义数据库对象:库,表,列。
常用关键字:create alter drop
DML(Data Manipulation Language):数据操作语言
用来操作数据库 表 中的数据
常用关键字:insert update delete
DQL(Data Query Language):数据查询语言
用来查询数据表中的数据
常用关键字:select
DCL(Data Control Language):数据控制语言
用来定义访问权限和安全级别
常用关键字:revoke grant

mysql的下载,安装和卸载

1,卸载:
停止mysql服务。在控制面板–管理工具—服务–找到mysql服务右键停止
在控制面板–程序和功能–右键卸载
把安装路径下的文件夹删除,把c盘下programdate中的文件夹也删除,programFile中有的话也删除。

2,安装和配置
建议安装版,有图形画界面方式
启动服务命令:net start mysql
停止服务命令:net stop mysql
登录mysql的命令
mysql -u 用户名 -p先回车 再输入密码
mysql -h 地址 -u 用户名 -p先回车 再输入密码
退出命令:exit / quit

sql操作数据库

DDL(数据定义语言)

创建库:
语法:create database 数据库名
create database mydb;
create database mydb2 character set 字符集;
create database mydb2 characer set gbk;
修改字符集:
语法:alter database 数据库名 character set 字符集;
alter database mydb2 character set utf8;
删除库:
语法:drop database 数据库名;
drop database mydb2;
查看当前数据库服务器中的所有数据库:
语法: show databases;

查看创建数据库的定义信息
语法:show create database 数据库名;
查看当前使用的是哪个数据库
语法:select database();
切换数据库:
语法:use 数据库名;

创建数据表:
语法:create table 表名(
字段一 字段类型,
字段二 子类类型,

​ … …,

​ 字段n 字段类型
​ );
​ 例子:create table stu_info(
​ id int,
​ name varchar(10),
​ age int,
​ bir date
​ );

数据库中常用的数据类型:
int 整型
double 浮点型 double(6,2) 表示最多6位数,其中必须有2位小数,最大值是 9999.99
char 固定长度的字符串 char(10) 'abc ’
varchar 可变长度的字符串 varchar(10) ‘abc’
blob 字节
text 文本
date 日期类型 格式:yyyy-MM-dd 2020-02-02
time 时间类型 格式:hh:mm:ss
datetime 日期时间类型 格式:yyyy-MM-dd hh:mm:ss

查看当前数据库中有哪些数据表
语法:show tables;
查看表的字段信息
语法:desc 表名;
在表中添加列
语法:alter table 表名 add 列名 数据类型;
alter table stu add birthday date;
修改列名
语法:alter table 表名 change 原列名 新列名 数据类型;
alter table stu change birthday bir date;
修改列
语法:alter table 表明 modify 列名 数据类型;
alter table stu modify age bigint;
删除列
语法:alter table 表名 drop 列名;
alter table stu drop age;
修改表名
语法:rename table 原表名 to 新表名;
rename table stu to student;
查看表的创建细节
语法:show create table 表名;
修改字符集:
语法:alter table 表名 character set 字符集;
删除表
语法:drop table 表名;

找到mysql的安装路径下有一个 my.ini文件
打开看default-character-set 这个的值是不是utf8。不是的话改过即可。

DML(数据操作语言)

是对表中数据进行 增 删 改 操作的

插入操作 insert
语法:insert into 表名(列名1,列名2,…) values(列值1,列值2,…);
要求:列名和列值的类型,个数,顺序要一致,并且要一一对应。
列名相当于是java的形参,列值相当于是实参。
值的长度不能超出列定义的长度
如果可以插入空值 null
插入的日期和字符串一样 都要用引号引起来 ‘aaa’ ‘2020-05-05’

举例:
	create table stu(
		 id int,
		 name varchar(10),
		 bir date,
		 gender varchar(4),
		 score double(4,1)
		 ); 
		 //给指定字段插入值
		 insert into stu (id,name,bir,score) values(
			101,'momo','2020-05-05',99.5);
		//给所有字段都插入值
		insert into stu (id,name,bir,gender,score) values(
		102,'xiaoba','2020-06-06','nan',88);
		//如果给所有字段都插入值,每次都要写一遍字段名台麻烦了。所以我们其实如果要给所有字段都插入值,字段名可以省略不写。
		insert into stu values(
		103,'xiaobao','2020-06-06','nan',89);
	//一次插入多行数据,批量插入
	insert into stu values
	(104,'xiaobao','2020-06-06','nan',89),
	(105,'xiaobao','2020-06-06','nan',89),
	(106,'xiaobao','2020-06-06','nan',89);

修改操作:update
语法:update 表名 set 列名1=列值1,列名2=列值2,… where 列名=列值;

​ – 把所有人的成绩都改成99
​ UPDATE stu SET score=99;

案例:

CREATE TABLE employee_info(
		id INT,
		NAME VARCHAR(10),
		gender VARCHAR(4),
		birthday DATE,
		join_date DATE,
		salary DOUBLE(8,2),
		bonus DOUBLE(6,2)
	);
INSERT INTO employee_info VALUES
	(1,'默默','男','2002-05-21','2005-05-21',20000,8888),
	(2,'宝强','男','1980-06-21','1988-05-21',10000,100),
	(3,'宋吉吉','男','1983-03-21','2000-05-21',8000,500),
	(4,'马蓉','女','1982-02-21','2000-05-21',2000,5000);
INSERT INTO employee_info VALUES
	(5,'冠希哥','男','1980-05-21','2005-05-21',20000,8888),
	(6,'张柏芝','女','1980-06-21','1988-05-21',10000,100),
	(7,'阿娇','男','1983-03-21','2000-05-21',8000,500),
	(8,'霆锋哥','男','1979-02-21','2000-05-21',2000,5000);
-- 把姓名叫做马蓉的人的工资改成5000
UPDATE employee_info SET salary=5000 WHERE NAME='马蓉';
-- 把阿娇的工资改成8000,奖金改成5000
UPDATE employee_info SET salary=8000,bonus=5000 WHERE NAME='阿娇';
-- 给张柏芝的工资加上5000
UPDATE employee_info SET salary=salary+5000 WHERE NAME='张柏芝';
-- 把冠希哥的奖金改成0
UPDATE employee_info SET bonus=0 WHERE NAME='冠希哥';
-- 把宋吉吉的奖金改成null
UPDATE employee_info SET bonus=NULL WHERE NAME='宋吉吉';
-- 给所有人的奖金+500
UPDATE employee_info SET bonus=bonus+500;
-- null和任何数据做运算结果都是null。如果我们非要给他加,需要使用
-- 一个函数:虑空函数  ifnull();
UPDATE employee_info SET bonus=IFNULL(bonus,0)+500;

删除操作:delete
语法:delete from 表名 where 列名=值;

删除表中id是3的人的信息
DELETE FROM employee_info WHERE id=3;

删除所有记录
DELETE FROM employee_info;

使用 truncate 删除所有记录
TRUNCATE TABLE employee_info;
delete删除表中数据,表结构还在
truncate删除时是直接把表drop了,然后创建了一个一模一样的新表。执行速度比delete快。

DQL(数据查询语言)

数据库执行DQL语句不会对数据库做出任何更改,而是把满足条件的数据展示出来。

查询出来的结果是一张虚拟表。

语法:select 列名,… from 表名;[where,group by,order by,limit,having…]

基础查询

查询所有列:可以使用通配符 * 表示所有
slect * from 表名;

​ SELECT * FROM employee_info;

查询指定列
SELECT 列名1,列名2,… FROM 表名;
SELECT id,NAME FROM employee_info;

条件查询
就是我们在查询的时候给出where子句,把满足条件的内容展示出来。
在where子句中可以使用一些运算符和关键字进行数据的过滤
= != <> < <= >= >
between…and…
in()
is null
is not null
and or not

案例:

-- 查询性别是女,工资在10000以上的人的信息
SELECT * FROM employee_info WHERE gender='女' AND salary>=10000;
-- 查询编号是4或者姓名叫宋吉吉的人的信息
SELECT * FROM employee_info WHERE id=4 OR NAME='宋吉吉';
-- 查询编号分别是 1 ,2 ,3 的人的信息
SELECT * FROM employee_info WHERE id=1 OR id=2 OR id=3;
SELECT * FROM employee_info WHERE id IN(1,2,3);
-- 查询编号不是 1 ,2 ,3 的人的信息
SELECT * FROM employee_info WHERE id NOT IN(1,2,3);
-- 查询奖金是null的人的信息
SELECT * FROM employee_info WHERE bonus IS NULL;
--  查询奖金不是null的人的信息
SELECT * FROM employee_info WHERE bonus IS NOT NULL;
SELECT * FROM employee_info WHERE NOT bonus IS NULL;
-- 查询工资在10000-20000之间的人的信息
SELECT * FROM employee_info WHERE salary>=1000 AND salary<=2000;
SELECT * FROM employee_info WHERE salary BETWEEN 1000 AND 2000;
-- 查询性别非男的人的信息
SELECT * FROM employee_info WHERE gender!='男';
SELECT * FROM employee_info WHERE gender<>'男';
SELECT * FROM employee_info WHERE NOT gender='男';
模糊查询

就是查询条件不是很确定。就需要用模糊查询。
比如我要查询姓张的人的信息
模糊查询需要使用关键字 like
使用通配符
_ 表示任意一个字符
% 表示任意个字符 0-n个
‘张%’ ‘张_’ ‘’ ‘%龙%’

案例

-- 查询姓名是3个字的人的信息
SELECT * FROM employee_info WHERE NAME LIKE '___';
-- 查询姓名是由3个字组成的最后一个字是哥的人的信息
SELECT * FROM employee_info WHERE NAME LIKE '__哥';
-- 查询性张的人
SELECT * FROM employee_info WHERE NAME LIKE '张%';
-- 查询姓名第二个字是小的人
SELECT * FROM employee_info WHERE NAME LIKE '_小%';
-- 查询姓名中包含小
SELECT * FROM employee_info WHERE NAME LIKE '%小%';
字段控制查询

去除重复的记录
需要使用关键字 distinct

​ – 查询工资要求去掉重复的值

​ SELECT DISTINCT salary FROM employee_info;

字段求和

-- 查询工资和奖金之和
-- 因为工资和奖金都是数值类型,所以可以做运算。如果做运算的2个字段有一个不是数值类型就会报错。
SELECT id,NAME,salary,bonus,salary+bonus FROM employee_info;
-- 因为bonus列有null,null和任何数据做运算结果都是null,所以需要使用虑空函数
SELECT id,NAME,salary,bonus,salary+IFNULL(bonus,0) FROM employee_info;
-- 注意下面写法是有问题的
SELECT id,NAME,salary,bonus,IFNULL(salary+bonus,0) FROM employee_info;

给列起别名
上面的查询语句结果出现了salary+IFNULL(bonus,0)这样的列名。不方便记忆,也不好看。需要给它起一个别名
需要使用关键字 as
SELECT id AS 编号,NAME 姓名,salary AS 工资,bonus 奖金,salary+IFNULL(bonus,0) AS 工资总和 FROM employee_info;
起别名的时候as关键字可以省略不写。

排序

排序需要使用关键字 order by 列名;
默认升序(asc) desc(降序)

-- 查询所有人的信息,要求按照工资的升序排序
SELECT * FROM employee_info ORDER BY salary;
SELECT * FROM employee_info ORDER BY salary ASC;
-- 查询所有人的信息,按照年龄的降序排序
SELECT * FROM employee_info ORDER BY birthday DESC;
-- 查询所有人的信息,按照工资的降序排序,如果工资一样,按照奖金的升序排序
SELECT * FROM employee_info ORDER BY salary DESC,bonus ASC;
聚合函数

聚合函数是用来做纵向运算的函数,比如我要知道所有人工资的总和是多少
count() 统计指定列不是null的记录数

max() 计算指定列的最大值,注意:如果指定列是字符串类型,那么他会使用字符串排序运算。
min() 计算指定类的最小值,注意:同上

sum() 计算指定列的数值和,注意:如果指定类不是数值类型,计算结果是0
avg() 计算指定列的平均值 注意同上

-- 查询表中的记录数
SELECT COUNT(*) FROM employee_info;
-- 查询奖金不为null的记录数
SELECT COUNT(bonus) FROM employee_info;
-- 查询表中工资大于10000的人数
SELECT COUNT(*) FROM employee_info WHERE salary>10000;
-- 查询表中工资+奖金之和大于10000的人数
SELECT COUNT(*) FROM employee_info WHERE salary+IFNULL(bonus,0)>10000;
-- 给表中增加一个列 leader 类型是int
ALTER TABLE employee_info ADD leader INT;
-- 分别查询有领导的人数,有奖金的人数
SELECT COUNT(leader),COUNT(bonus) FROM employee_info;
-- 查询有领导并且有奖金的人数
SELECT COUNT(leader AND bonus) FROM employee_info;
SELECT COUNT(*) FROM employee_info WHERE leader IS NOT NULL AND bonus IS NOT NULL;
-- 查询最高工资和最低工资
SELECT MAX(salary),MIN(salary) FROM employee_info;
-- 查询所有人的工资总和
SELECT SUM(salary) FROM employee_info;
-- 查询所有人的工资和,以及所有人的奖金和
SELECT SUM(salary),SUM(bonus) FROM employee_info;
-- 查询所有人的工资+奖金之和
SELECT SUM(salary)+SUM(bonus) FROM employee_info;
SELECT SUM(salary)+SUM(bonus) AS '总和' FROM employee_info;
-- 查询所有人的平均工资
SELECT AVG(salary) FROM employee_info;
SELECT SUM(salary)/COUNT(salary) FROM employee_info;
分组查询

分组查询的时候需要使用关键字 group by

RENAME TABLE employee_info TO emp;
ALTER TABLE emp CHANGE leader deptid INT;
SELECT * FROM emp;

CREATE TABLE dept(
	deptid INT,
	dname VARCHAR(10),
	address VARCHAR(50),
	phone VARCHAR(15)
);
INSERT INTO dept VALUES(10,'开发部','西安','85858585');
INSERT INTO dept VALUES(20,'教学部','襄阳','88881234');
INSERT INTO dept VALUES(30,'市场部','宝鸡','83821569');
INSERT INTO dept VALUES(40,'财务部','北京','85850291');
-- 查询每个部门的工资总和,说明先要以部门分组
-- 查询每个部门的编号,以及每个部门的工资总和
SELECT deptid,SUM(salary) FROM emp GROUP BY deptid;
-- 查询每个部门的编号,以及每个部门的人数
SELECT deptid,COUNT(*) FROM emp GROUP BY deptid;
-- 查询每个部门的编号,以及每个部门工资大于10000的人数
SELECT deptid,COUNT(*) FROM emp WHERE salary>10000 GROUP BY deptid;
having子句

注意:where和having的区别:
having:是分组后对数据进行过滤的条件
where:是分组前对数据进行过滤的条件
having:后面可以使用聚合函数
where:后面不能使用聚合函数

where是分组前对数据进行过滤,如果某行数据没有满足where子句的条件,那么这行数据是不会参与分组的。而having是分组后对数据进行过滤的条件。

查询工资总和大于20000的部门编号以及工资总和
SELECT deptid,SUM(salary) FROM emp GROUP BY deptid HAVING SUM(salary)>20000;

limit

limit是用来限定查询结果的起始行和总行数的。(分页查询)

select * from emp limit x,y;
x:表示从哪一行开始 0表示第一行
y:表示要查多少行

– 查询emp表,查询3条记录,从第一条记录开始
SELECT * FROM emp LIMIT 0,3;
– 查询emp表,查询3条记录,从第3条记录开始
SELECT * FROM emp LIMIT 2,3;

如果一页可以显示10条记录,我想看第三页的数据
第一页:SELECT * FROM emp LIMIT 0,10;
第二页:SELECT * FROM emp LIMIT 10,10;
第三页:SELECT * FROM emp LIMIT 20,10;

查询代码的书写顺序和执行顺序

书写顺序:select–from–where–group by–having–order by–limit
执行顺序:from–where–group by–having–select–order by–limit

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值