1.去重
关键字:distinct
作用:去除select语句查询出来的重复数据
select distinct society from number;
2.where条件子句
运算符 | 语法 | 描述 |
---|---|---|
and && | a=1 and b=2 | 与操作 |
or || | 或操作 | |
not != | 非操作 |
3.模糊查询
运算符 | 语法 | 描述 |
---|---|---|
is null | 如果为null返回值为真 | |
is not null | 如果不为null返回值为真 | |
between | between and | |
like | select * from number where society like “社联”; | like “aaa”; |
in | select name society from number where society in(‘社联’); | in(a1,a2,a3) |
like:select name from number where name like ‘%彪%’ and name like ‘%4%’;
in:查询的字段要是一个具体的值
4.连表查询:join
左连接查询:即使右表中没有匹配的值也会进行查询
select n.name,s.name,n.society from number n
left join society s on n.id=1;
右连接查询:即使左表中没有匹配的值也会进行查询
select distinct n.name,s.name,n.society from number n
right join society s on n.id=1;
inner join查询:如果表中有能匹配的项就直接查询
select distinct n.name,s.name,n.society from number n
inner join society s on n.id=1;
5.自连接(了解即可)
6.分页和排序
1.排序
where>
group by>分类一定要与聚合函数使用
having>
order by>
limit>
升序asc
select * from number order by id asc;
降序desc
select * from number order by id desc;
2.分页
关键字:limit
7.子查询和嵌套查询
子查询:where (select 语句)
由里到外本质上与连接查询差不多。
8.mysql的函数
数学运算符:
select abs(-1);//取绝对值
select ceiling(9.1);//向上取整数
select floor(9.1);//向下取整数
select rand();0-1的随机数
select sign()//括号里面正数输出1,负数输出-1,0输出0;
字符串函数
SELECT CHAR_lENGTH(‘DJDAHD’);//计算字符串长度
select Concat(‘我’,‘爱’);//字符串拼接
select insert(‘我爱你’,1,2,‘超级热爱’)//替换
select upper(‘sdasAA’);//大写替换
select upper(‘aAAA’);//小写字母替换
select instr(‘asdsdas’,‘a’);//返回第一次出现的字串索引
select replace(‘我爱你红红蕾蕾’,‘红红’,‘兰兰’)//替换指定字符串
select substr(‘dusahdu’,4,5);返回指定字符串
Select reverse(“dadad”);//反转
聚合函数
count() | 计数 | |
---|---|---|
sum() | 求和 | |
avg() | 平均值 | |
max() | 最大值 | |
min() | 最小值 |
count():
select count(portrait_path) from number;按照列计算,忽略控制
select count(1) from number;按照行计算,不会忽略空值
select count(*) from number;本质与上面没啥区别
MD5加密
MD5()
9.事务
package com.baidu.jdbc;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class JdbcTest02 {
private static PreparedStatement preparedStatement=null;
private static Connection conn=null;
private static ResultSet rs=null;
public static void main(String[] args) throws Exception {
conn=JdbcUtils.getConnections();
conn.setAutoCommit(false);//关闭自动提交,开启事务
String sql="update test01 set money=money-400 where name=?;";
preparedStatement = conn.prepareStatement(sql);
preparedStatement.setObject(1,"小张");
int i=preparedStatement.executeUpdate();
int x=1/0;
String sql1="update test01 set money=money+400 where name=?;";
preparedStatement=conn.prepareStatement(sql1);
preparedStatement.setString(1,"小刘");
int j=preparedStatement.executeUpdate();
if(i>0&&j>0){
conn.commit();//事务提交
}
conn.rollback();//事务回滚
JdbcUtils.realse(rs,conn,preparedStatement);
}
}
要么都成功,要么都失败;
ACID
原子性:两个动作要么一起成功,要么一起失败
一致性:最终一致性()(例如:1000块钱不可变)
隔离性:转钱的时候不会互相影响
持久性:事务如果没有提交恢复到原状。
隔离导致的问题:
脏读:一个事务读取了另外一个事务未提交的数据
不可重复读:多次读取事务结果不一样
幻读: 在一个事务内读取了别的事务插入的数据
数据库执行事务的流程:
SET autocommit=0//关闭自动提交
Start Transaction//开启事务
commit//提交事务
rollback//回滚如果事务提交失败,回滚到之前的数据
SET autocommit=1//开启自动提交
10.索引
主键索引:primary key
唯一标示,主键不可重复
唯一索引:union key
普通索引:key
全文索引:fulltext
show index from number;//显示表格中的索引
//插入索引
explain:看数据是否走索引(执行计划查看)
索引原则
索引不是越多越好
不要对经常变动的数据添加索引
小数据的表不要添加索引
索引一般增加在常用的查询字段上
11.mysql备份
导出命令:
mysqldump -hlocalhost -uroot -p123 union society_all >D:\a.sql
导入命令:
source d:\a.sql;
12.sql注入问题
package com.baidu.jdbc;
import org.junit.Test;
import java.sql.*;
public class Mysql注入 {
private static String url = "jdbc:mysql://localhost:3306/union?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone =GMT&allowPublicKeyRetrieval=true";
private static String username = "root";
private static String password = "123";
private static ResultSet rs = null;
private static Connection conn = null;
private static Statement stmt = null;
private static PreparedStatement statement=null;
public static void login(String user,String pas) throws Exception {
Class.forName("com.mysql.cj.jdbc.Driver");
conn=DriverManager.getConnection(url,username,password);
stmt=conn.createStatement();
//select * from student_society_union where unionId=' 10001 ' and unionPassword='asdfg0205';
String sql="select * from student_society_union where unionId=' "+user+"+ ' and unionPassword='"+pas+"';";
rs=stmt.executeQuery(sql);
while (rs.next()){
System.out.println(rs.getObject(1));
System.out.println(rs.getObject(2)); System.out.println(rs.getObject(3));
}
}
@Test
public static void main(String[] args) throws Exception {
login(" 'or '1=1 ","' or'1=1");
}
}
13.防止sql注入
private static PreparedStatement preparedStatement=null;
private static ResultSet rs=null;
public static void main(String[] args) throws Exception {
final Connection conn = JdbcUtils.getConnections();
//把sql语句放在缓存中,预编译,不执行
String sql="select * from student_society_union where id=1;";
preparedStatement = conn.prepareStatement(sql);
rs=preparedStatement.executeQuery();
while(rs.next()){
System.out.println(rs.getObject(1));
System.out.println(rs.getObject(2));System.out.println(rs.getObject(3));
}
}
PreparedStatement
直接把传入的参数当作一个字符
如果存在转义字符 如 ' 直接会转义