数据库
基础操作
jdbc 操作
基础步骤
// 注册驱动
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/hxwang?characterEncoding=utf-8";
// 2. 连接数据库,返回数据库的对象
Connection connection = DriverManager.getConnection(url, "root", "root");
// 3. 获取传输器
PreparedStatement preparedStatement = connection.prepareStatement("insert into dept values(?,?,?)");
preparedStatement.setObject(2,dname);
preparedStatement.setObject(3,loc);
preparedStatement.executeUpdate();
preparedStatement.close();
connection.close();
库的操作
创建库
create database 库名 default character set utf-8;
# 防止中文乱码
用命令行执行sql脚本文件
source F:/java/TCGBIV/codes/nacos-mysql.sql
查询库
show databases;
删除库
drop databases 库名;
表的操作
创建表
create table 表名(字段名 字段类型(长度),字段2,字段3....);
查看表
show tables;
修改表
alter table 表名 add column 列名 列的类型;
描述表结构
desc 表名;
删除表
drop table 表名;
数据的操作
查询数据
select * from 表名;
插入数据
insert into 表名 values(根据字段设置值);
修改数据
update 表名 set 字段名=新值
删除数据
delete from 表名;
数据类型
1, 整型:int
2, 小数:double(不精确) / numeric(a,b) / decimal(a,b)–a是数字的位数b是小数位数
3, 时间: date(年月日) time(时分秒) datetime(年月日时分秒) timestamp(时间戳,毫秒数)
4, 字符串: char / varchar
区别:
char 是固定长度,浪费空间char(10)
varchar 是可变长度,节省空间varchar(10)
特殊场景: 数据长度如果就是固定的,优先选char,因为查的快
5, 图片: 如果想存入数据库,只会存文件的磁盘路径D:/abc/1.jpg,不是存文件本身
————————————————
版权声明:本文为CSDN博主「cgblpx」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012932876/article/details/121027616
字段约束
非空约束 not null
主键约束 primary key 非空且唯一
唯一约束 unique
外键约束 FOREIGN KEY (本表的键) REFERENCES 要关联的表名(要关联的表的键)
基本函数
基础函数
lower–全转小写
upper–全转大写
length–求长度
substr–截取子串
#substr截取子串
#SUBSTR(a,b)-a是截取谁b是从哪个字符开始
SELECT ename,SUBSTR(ename,2) FROM 表名;
#SUBSTR(a,b,c)-a是截取谁b是从哪个字符开始c是截取的长度
SELECT ename,SUBSTR(ename,2,2) FROM emp
concat–拼接字符串
#concat(a,b,...)拼串-a是列名b是要拼接的数据
#...是指可以有多个参数
SELECT ename,CONCAT(ename,"hello",1,2) FROM emp
replace–替换
#替换replace(a,b,c)-a是字段名把b换成c
SELECT ename,REPLACE(ename,'a','666') FROM emp
IFNULL - 将NULL 值替换
#ifnull(a,b)-a是字段名b是要换成的值
SELECT comm,IFNULL(comm,100) FROM emp#如果是null就换成100
小数的操作
SELECT comm,ROUND(comm) FROM emp#四舍五入,取整
SELECT comm,ROUND(comm,1) FROM emp#四舍五入,保留1位小数
SELECT comm,CEIL(comm) FROM emp#ceil向上取整
SELECT comm,FLOOR(comm) FROM emp#floor向下取整
时间的函数
SELECT NOW() #当前时间
SELECT YEAR('1999-1-1')
SELECT YEAR( NOW() )#当前年
SELECT MONTH( NOW() ),DAY( NOW() )#当前月,当前日
#hour时 minute分 second秒
SELECT HOUR( NOW() ),MINUTE( NOW() ),SECOND( NOW() )
————————————————
版权声明:本文为CSDN博主「cgblpx」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012932876/article/details/121074062
条件查询
where 精确查询
and 且
or 或
in 条件设计同字段的不同的值可以用in代替or
where 字段 like ‘%a%’; 模糊查询
NULL
#1.null的数据用is /is not关键字来过滤
#练习1:查询没有奖金的员工信息
SELECT * FROM emp WHERE comm IS NULL
#练习2:查询有奖金的员工信息
SELECT * FROM emp WHERE comm IS NOT NULL
BETWEEN … AND…
#练习3:查询工资5000~10000的员工信息
SELECT * FROM emp WHERE
#sal>=5000 and sal<10000
sal BETWEEN 5000 AND 10000 #[5000,10000]
#练习4:查询2019年入职的员工姓名
SELECT ename FROM emp WHERE
#hiredate between '2019-1-1' and '2019-12-31'
YEAR(hiredate)=2019
————————————————
版权声明:本文为CSDN博主「cgblpx」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012932876/article/details/121093744
LIMIT 分页
#练习5:展示前两条员工数据
SELECT * FROM emp LIMIT 2 #只取前n条
SELECT * FROM emp LIMIT 0,2 #从0+1的数据开始,总共展示2条
#练习6:查询岗位是员工的第一条记录
SELECT * FROM emp WHERE job='员工' LIMIT 0,1#limit通常放最后
————————————————
版权声明:本文为CSDN博主「cgblpx」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012932876/article/details/121093744
ORDER BY 排序默认升序
#4.order by排序,按照字典顺序排,默认是升序ASC
#练习7:按照工资排序
SELECT * FROM emp ORDER BY sal DESC #按数值降序
#练习8:按照名字排序
SELECT * FROM emp ORDER BY ename DESC #按字母降序
#练习9:按照岗位排序
SELECT * FROM emp ORDER BY job ASC #按汉字对应的编号升序
#练习10:查询15年到19年入职的员工信息只取前两条并按照工资升序排
SELECT * FROM emp WHERE
YEAR(hiredate) BETWEEN 2015 AND 2019 #区间[2015,2019]
ORDER BY sal #排序,默认的升序
LIMIT 2 #分页,只取前两条,通常放最后
————————————————
版权声明:本文为CSDN博主「cgblpx」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012932876/article/details/121093744
聚合函数
max() 最大值
min() 最小值
sum() 求和
avg() 平均值
count() 求个数
分组
GROUP BY
#分组:使用group by
#练习1:统计每个部门的平均薪资
SELECT AVG(sal),deptno FROM emp
GROUP BY deptno #按照部门分组
#练习2:统计每个部门的最高薪资
SELECT MAX(sal),deptno FROM emp
#口诀1:查询结果中出现了混合列,包括着聚合列和非聚合列,必须分组
GROUP BY deptno
#口诀2:通常按照非聚合列分组
#练习3:统计每年入职的总人数
SELECT YEAR(hiredate),COUNT(1) FROM emp
GROUP BY YEAR(hiredate)
#练习4:统计每个岗位的平均薪资
SELECT AVG(sal),job FROM emp
GROUP BY job
————————————————
版权声明:本文为CSDN博主「cgblpx」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012932876/article/details/121093744
HAVING
把分组后的数据还想继续过滤,使用group by的固定搭配having
#having
#练习5:统计每个岗位的平均薪资,而且只要>=10000的
SELECT AVG(sal) a,job FROM emp
#where AVG(sal)>=10000
#注意:::where里不能用别名,也不能出现聚合函数
GROUP BY job #按照非聚合列分组
HAVING a>=10000 #分组后的过滤,a是别名
#练习6:统计每年入职的人数,而且只要19年的
SELECT YEAR(hiredate) ,COUNT(1) FROM emp
WHERE YEAR(hiredate)=2019
GROUP BY YEAR(hiredate) #分组
#having a=2019 #分组后的过滤
# where比having 高效,因为执行时机要早一些
————————————————
版权声明:本文为CSDN博主「cgblpx」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012932876/article/details/121093744