“Mysql是一个关系型数据库管理系统,主要是用来管理数据库的.”
mysql
一个mysql下面有多个数据库
一个数据库下面一般有多个表
一张表内我们会存储多条数据
为什么要用mysql :
1 成本低
2 开源
3 体积小
4 运行快
“综上所述,MySQL适用于中小型企业”
“sql : 结构化查询语言,专门为了数据库设计的一门语言 主要用于数据库存储 所有的关系型数据库会遵守这个标准”
关系型数据库 : 遵守sql标准的数据库
非关系型数据库: 不遵守sql标准的数据库(nosql)
sql的分类
1 数据库查询语言DQL(查询数据使用)
2 数据定义语言 DDL(负责数据结构的定义与删除)
3 数据操纵语言DML(主要针对数据的增 删 改)
4 数据控制语言DCL(主要用于数据库的权限控制)
5 指针控制语言CCL
6 事务处理语言TPL
MySQL的登录
mysq -hip地址 -u账号 -p
MySQL的退出:
exit
quit
如何展示已有数据库
show databases;
如何创建数据库
create database 数据库名称;
如何删除数据库
drop database 数据库名称
2.7 数据库的类型
MySQL Java
int int
char String
varchar String
bigint long
double double
text String
longtext String
date年月日
datetime年月日时分秒
time时分秒
2.8 char 与 varchar区别
char 形容多少长度就占用多少长度
varchar 根据里面的内容进行改变
长度最多255
create 代表创建的意思
table 代表表的意思
user
是我们自定义的表名
查看表结构 desc 描述
desc user;
删除表
drop table user;
“对于已经存在的表 需要增加里面的列的时候可以使用alter add,多个add需要使用 , 分割”
“alter table user ADD height int,ADD a varchar(20);”
“对于已经存在的表,需要删除里面的列可以使用 alter drop colum”
“alter table user drop column height,drop column a;”
最基本的查询
select * from user;
查询 全部的列 从哪里开始查询 需要查询的表
如果只想查询ID 只需将
替换成ID
SELECT id from user;
如果想查询id name需将
换成id name
“select id,name from user;”
MySQL 中插入数据有三种方式
第一种 按照所有列的顺序来插入全部的值
“insert into user values(1,‘张三’,19,‘女’);”
“第二种 按照指定的列来插入指定的值,在表名后面使用(列名…)来告诉数据库 values里面的值都放在那些列中”
“insert into user(id,name) values(2,‘赵六’);”
MySQL数据翻倍 就是将查询出来的内容 自动添加到表中(一般用于测试)
insert user select *from user;
update +表名+ set +需要改的值+ where +需要改的值的+;
“update user set name=‘丫丫’,age=12 where id=2;”
删除
第一种 按照指定的条件进行删除指定的行
delete from user where id=1
第二种 直接删除表中的所有数据(不允许有条件)
truncate table user;
第三种 直接删除表以及数据
drop table user;
什么是约束
“对插入的数据进行限制,不符合要求的不让插入”
mysql 中的约束 (主要是用来约束表中的数据)
唯一约束 用来约束此列的的值不能重复
非空约束 用来约束此列的值不能为null
主键约束 唯一+非空约束
” 外键约束 主要用于发生里父子关系的表中,约束的是子表的添加(子表中外键的数据,在父表中必须存在) 以及父表的删除”
” 检查约束 mysql中存在,但是不好使”
(默认约束)
(自增约束)
mysql中使用约束的两种方式 1 在建表的时候使用 2 将约束添加到已经创建好的表中
使用第一种 id是主键 name不能为空 sex 默认是男 电话号要求唯一
所以要在id后面添加primary key;就好了
name不能为空 在后面加 not null
sex默认为男 在后面加 default ‘男’;就行了
phone要求唯一加上 unique
第二种
添加约束的关键字 还是alter
alter table st add primary key(id);
非空约束是行级约束 只能通过修改列来完成
alter table st modiey name varchar(20) not null;
给 phone列添加一个唯一约束 并给约束起一个名字 方便根据异常寻找
alter table st add constraint uk_phone UNIQE key(phone);
将sex设置成默认男
alter table st modify sex char(1) default ‘男’;
使用自增来让mysql自己来维护主键
“是在主键后面添加auto_increment,这样主键就能自增长了”
第二种 为已存在的表添加自增
alter table st modify id int(10) auto_increment
外键的使用
再别的表中需要连接父表中的某条数据 需要在后面加上 references 表名中的数据名
不能直接删除父表的内容 要先删除掉相关联的员工 让后去删除部门
删除约束
ALTER TABLE st DROP PRIMARY KEY;
ALTER TABLE st DROP index uk_phone
ALTER TABLE st MODIFY NAME VARCHAR(20) NULL;
ALTER TABLE emp2 DROP FOREIGN KEY emp2_ibfk_1
查询主要分为三部分组成
***
我们查询出来的结果集称之为集合的投影
“select empno,job from emp where empno=7369;”
“select * from (select empno,job from emp where empno=7369);”
第一部分 select 表示查询的意思 在后面需要跟上我们查询的列名 可以使用*来表示列
第二部分 用于指定在那些表中进行查询 这个表可以是一个集合的投影(集合投影需要起一个名字)
第三部分 where用于查询条件 来进行数据的过滤
别名 我们可以给列 表起一些别名 更方便我们去记 在列名或表名之后使用AS 别名即可 AS可以省略不写
select empno AS ‘员工姓名’ JOb ‘职位’ from emp where empno=7369;
对于我们查询出来的列 可以进行一些数值运算 以及函数操作
“select enamel,sal*2 from emp;”
查询所有员工的年薪(13薪)
“select
,sal
13 from emp;”
distinct 可以去重 查出员工职位有哪些
select distinct job from emp;
“在数据库中<,>,<=,>=,!=,<>是存在的”
查询工资大于1000的员工所有信息
select * from emp wheresal>1000;
查询工资不等于1600的员工
select * from emp where sal!=1600;
select * from emp where sal<>1600;
查询没有奖金的员工所有信息 空不能使用=判断 必须使用is null and相当于java中的&&用于多条件并行 or相当于java中的||用于条件多选一
select * from emp where comm is null or comm=0;
查询奖金不等于null的员工 不等于null 必须使用is not null
select * from emp where comm is not null;
多表查询
#笛卡尔积 代表x乘以y的积
交叉连接, 自然连接 ,自连接, 内连接 ,外连接, 全连接, 交并补差(mysql不支持)
交叉连接: 直接在from后面跟表名,会产生笛卡尔积 缺点: 1:查询结果不对 2: 影响数据库性能
隐式交叉
SELECT * from emp,dept
显示交叉连接
SELECT * FROM emp CROSS JOIN dept
自然连接 将两张表中等值的列自动合在一起放在第一排显示并隐藏结果集中的笛卡尔积
SELECT *from emp NATURAL JOIN dept
SELECT * FROM emp JOIN dept ON(emp.DEPTNO=dept.DEPTNO)
显示内连接 只显示符合on后面条件对比的数据
SELECT *FROM emp INNER JOIN dept on emp.deptno=dept.deptno
隐式内连接 不使用 inner join on 关键字 ,直接在where之后对比条件
SELECT * FROM emp,dept where emp.DEPTNO=dept.DEPTNO
左外连接
SELECT * FROM dept d LEFT JOIN emp e ON d.deptno=e.deptno
右外连接
SELECT * FROM dept d RIGHT JOIN emp e ON d.deptno=e.deptno
自连接
SELECT emp1.empno ‘员工编号’,emp1.EMAME ‘员工名字’,emp2.emame ‘老板名字’ FROM emp emp1,emp emp2 where emp1.mgr=emp2.empno
一些关键字
where 后面跟判断条件
like ‘%a%’ 包含a的所有
查询在哪个范围之间用 between这个关键字
ORDER BY可以对列中数据进行排序 asc升序(默认) desc代表降序
mysql常用函数
统计函数
求记录总数 一般用于统计表中有多少条记录
SELECT COUNT(*) from emp;
求和 sum 求出所有员工的总月薪是多少
SELECT SUM(SAL) FROM emp;
最大值求出最大值
SELECT MAX(SAL) FROM emp;
最小值求出最小值
SELECT MIN(SAL) FROM emp;
求平均值AVg 求出平均工资是多少
SELECT AVG(SAL) FROM emp;
#数学函数
#求绝对值
SELECT ABS(-545)
#MOD取余
SELECT 11%5;
SELECT MOD(11,5)
#返回一个不小于x的整数
SELECT CEILING(5.5)
#四舍五入
SELECT ROUND(5.4),ROUND(5.5)
#对小数进行截断操作
SELECT decimal(123.654215,0);
– 字符串函数
– 返回字符串对应ascii码中十进制数字
SELECT ASCII(‘a’)
– 返回字符串的长度
SELECT LENGTH(‘hekect mysql’)
– 返回前面字符串出现的位置(从一开始 如果没有返回0
SELECT LOCATE(‘l’,‘hello’)
– 返回后面 面字符串出现的位置(从一开始 如果没有返回0
SELECT INSTR(‘hello’,‘o’)
– 从左侧开始截取字符串 截取后面参数色的位数
SELECT LEFT(‘hrllo java’,5)
– 从有侧开始截取字符串 截取后面参数色的位数
SELECT right(‘hrllo java’ ,8)
– 指从多少位截取字符串(位置从1开始)
SELECT SUBSTR(‘hello java’,4)
– 去除字符串前后的空格
SELECT trim(’ hello java’)
– 去除左边空格
SELECT LTRIM(’ heloo java’)
– 去除右边边空格
SELECT RTRIM(‘hello java ‘)
– 字符串替换(x,y,z)将x中的y换成z
SELECT REPLACE(‘helloj ava’,‘o’,‘g’)
– 去掉字符串所有的空格
SELECT REPLACE(‘hel loj ava’,’ ‘,’’)
– 将字符串翻倍
SELECT REPEAT(‘hello’,4)
– 反转字符串
SELECT REVERSE(‘hellp’)
SELECT REVERSE(123456789)
– 参数为 x y n z 将字符串x中从y开始的n位换成z
SELECT INSERT(‘hello MySQL’,5,3,‘HELLO’)
– 日期与时间函数
– 返回当前系统时间
SELECT NOW();
– 返回星期的索引
SELECT DAYOFWEEK(NOW())
SELECT WEEKDAY(‘2020-08-18’)+1
– 返回时间中的天数
SELECT DAYOFMONTH(‘2018-8-3’)
– 求出过了当前年的多少天
SELECT DAYOFYEAR(NOW())
– 求出日期中的月份
SELECT MONTH(‘2020-06-8’)
– 求出日期的年份
SELECT YEAR(‘2020-02-02’)
– 求出天数
SELECT DAY(‘2020-2-3’)
– 小时
SELECT HOUR(‘11:20:10’)
– 分钟
SELECT MINUTE(‘11:20:10’)
– 秒
SELECT SECOND(‘11:20:10’)
– 求出季度 1~4
SELECT QUARTER(NOW())
– 求出月份的名称
SELECT MONTHNAME(‘2020-09-05’)
– 求出星期的名称
SELECT DAYNAME(‘2020-04-5’)
– 从时间之中提取年月日
SELECT EXTRACT(YEAR FROM NOW()),EXTRACT(MONTH FROM NOW()),EXTRACT(DAY FROM NOW())
– 向日期中增加时间
SELECT DATE_ADD(‘2020-04-25’,INTERVAL 4 DAY),DATE_ADD(‘2020-04-25’,INTERVAL 2 YEAR)
– 向日期中减少时间
SELECT DATE_SUB(‘2020-04-25’,INTERVAL 4 DAY)
– 获取当前年月日
SELECT CURDATE()
– 获取当前时分秒
SELECT CURRENT_TIME()
– 2005-7-31 到现在相差多少天
SELECT DATEDIFF(NOW(),‘2005-7-31’)
SELECT TO_DAYS(NOW())-TO_DAYS(‘2020-8-23’)
– 系统信息函数
– 返回当前系统的版本
SELECT VERSION();
– 查看当前数据库名称
SELECT DATABASE()
– 返回当前登录的用户名
SELECT USER()
– 查看字符编码格式
SELECT CHARSET(‘as’)
– 加密函数
SELECT MD5(‘1’)
SELECT PASSWORD(‘1’)
– 格式化函数
SELECT FORMAT(123456468,0)
mysql的日期输出格式列出来:
%a 缩写星期名
%b 缩写月名
%c 月,数值
%D 带有英文前缀的月中的天
%d 月的天,数值(00-31)
%e 月的天,数值(0-31)
%f 微秒
%H 小时 (00-23)
%h 小时 (01-12)
%I 小时 (01-12)
%i 分钟,数值(00-59)
%j 年的天 (001-366)
%k 小时 (0-23)
%l 小时 (1-12)
%M 月名
%m 月,数值(00-12)
%p AM 或 PM
%r 时间,12-小时(hh:mm:ss AM 或 PM)
%S 秒(00-59)
%s 秒(00-59)
“%T 时间, 24-小时 (hh:mm:ss)”
%U 周 (00-53) 星期日是一周的第一天
%u 周 (00-53) 星期一是一周的第一天
%V 周 (01-53) 星期日是一周的第一天,与 %X 使用
%v 周 (01-53) 星期一是一周的第一天,与 %x 使用
%W 星期名
“%w 周的天 (0=星期日, 6=星期六)”
%X 年,其中的星期日是周的第一天,4 位,与 %V 使用
%x 年,其中的星期一是周的第一天,4 位,与 %v 使用
%Y 年,4 位
%y 年,2 位
sql的执行顺序
1: FROM 2: ON 3: JOIN 4: WHERE
– 从这里可以开始使用别的别名 也及时第五步开始
– 5: GROUP BY 6: HAVING 7: SELECT 8: DISTINCT 9: ORDER BY
LIMIT 分页
后面跟着一个参数,参数是几就显示几条记录
LIMIT分页后面跟两个参数 前面参数索引从0开始,后面代表显示多少条