数据库的单表查询,熟悉SQL语句
回顾MYSQL
回顾JDBC
今日学习目标:
使用SQL语句完成单表的增删改查
使用JDBC通过java代码完成单表的增删改查
创建数据库:create 数据库名;
删除数据库:drop database 数据库名;
查看数据库:show databases;
创建数据库并进行设置编码格式:create database 数据库名 character set gbk;
显示数据库结构:show create database 数据库名;
使用库:use 数据库名;
查看当前正在操作的库:select database();
二:对数据库表的操作
创建表语句:
create table user(
uid int(32) primary key auto_increment,
uname varchar(32),
upassword varchar(32)
);
查询表:show tables;
查看表结构:desc 表名;
删除表:drop table 表名;
修改表:
1.添加一列:alter table 表名 add 字段名 类型(长度) [约束]
2.修改列的类型(长度、约束)
alter table 表名 modify 要修改的字段名 类型(长度) [约束]
3.修改列的名字:
alter table 表名 change 旧列名 新列名类型(长度)、[约束]
4.删除表的列
alter table 表名 drop 列名
.
5.修改表名:
rename table 表名 to 新表名;
6.修改表的字符集:
alter table 表名 character set 编码:
查看当前表的编码:show create table user_tb;
三、对数据库中表记录的操作_插入和修改操作:
插入语法:
insert into 表名(列1,列2,列3...) values (值1,值2,值3...)--向表中插入某些列
insert into 表名 values(值1,值2,值3...)--向表中插入所有列
注意:1.参数和值前后长度保持一致 2.值如果是字符串和时间,则加上单引号。
注意:出现乱码时,在MySQL配置文件my.ini中修改下列属性
方式一:
[mysql]
57 行:default-character-set=gbk
方式二:set names gbk;
更新语法:
update 表名 set 字段名=值,字段名=值 ...;(它会将该列的所有值改变)
update 表名 set 字段名=值,字段名=值 ... where 条件;(只会修改条件满足的那一列)
删除语法:
delete from 表名 [where 条件];
面试题:删除表中所有记录使用delete from 表名;还是用truncate table 表名;
删除方式:
delete 一条一条删除,不清空auto_increment记录数(自动递增:主键)
注意:删除后不会重置id。
不带条件删除(全部删除):
truncate 直接将表删除,重新建一样的表,auto_increment 将置为零,从新开始:
事务方面:
delete 删除的数据,如果在一个事务中可以找回。
truncate 删除的数据找不回来。
查询语法:
select [distinct] * | 列名1,列名2 ... from 表 [where 条件];
1.查询所有商品使用表别名:
语法:select * from product as p;(as可以省略)
2.查询商品名,使用列别名:
语法:select pname as name from product;(as可以省略)
3.去掉重复值(按照名字)
select distinct(pname )from product;
4.将所有商品价格+10进行显示
select pname,price+10 from product;
5.查询名字中含有‘士’字的商品信息:(模糊查询:like语句中,%代表零个或多个任意字符,_代表一个字符)
6.查询id是3,6,9的商品:
7.查询名字含有士字并且price小于100:(and:多个条件并列查询)
8.or的使用:(或查询)
9.聚合函数:
9.1:获取所有商品价格总和:
9.2:获取所有商品的平均价格:
9.3:获取所有商品个数:
10.排序:
10.1:查询所有的商品,按价格进行排序:(升序:asc 降序:desc)
10.2:查询商品名称有“士”的商品信息,并且按照价格降序排列:(order by 要放在where条件之后)
11:分组
11.1:添加分类id:用来进行分组使用;
11.2:分组:先将所有数据初始化为1:
再将需要分组区分的重新按条件查询并设置为2:
然后根据需求查询需要的组:
11.3:分组查询商品个数:(可用来查询当前系统教师,学生,超级管理员的个数)
13.4:根据cid分组,分组统计每组商品的平均价格,并且平均大于20000元;
查询(顺序)总结:
select *| 字段... ()一般在的后面的内容都是要查询的内容
from 表
where 查询条件
group by 分组字段(注:分组后带有条件,只能使用having)
having分组条件
order by 排序字段 asc|desc(升|降) (注:该字段必须放在最后)
JDBC:Java DataBase Connectivity:java数据库连接,SUN公司推出的java访问数据库的标准规范(接口)。
JDBC开发步骤:
1.注册驱动 2.获得连接 3.获得语句执行者 4.执行SQL语句 5.处理结果
数据库驱动:class.forName("com.mysql.jdbc.Driver");
数据库连接:Connection con = DriverManager.getConnetion("jdbc:mysql://localhost:3306/mydb1","root","1107");
扩展参数:jdbc:mysql://localhost:3306/mydb1?useUnicode=true&characterEncoding=UTF8
useUnicode参数:指定这个连接数据库的过程中,使用的字节集是Unicode字节集;
characterEncoding参数:指定Java程序连接数据库的过程中,使用的字节集编码为UTF-8编码,注意:mysql指定UTF-8编码是
给出的是UTF-8,而不是UTF8;
3.获得执行语句
String sql = “insert into user(id,password) values (null,'123')”;
Statement 语句执行者 :Statement stmt = con.createStatement();
防止使用‘or’关键字,攻击服务器:
// 4.创建预处理对象
PreparedStatement pstmt = conn.prepareStatement(sql);
// 5.设置参数(给占位符)
pstmt.setString(1, username);
pstmt.setString(2, password);
// 6.执行查询操作
ResultSet rs = pstmt.executeQuery();
int executeUpdate(String sql); -- 执行 inert update delete 语句 (DML语句)
ResultSet executeQuery(String sql); --执行select语句 (DQL语句)
boolean execute(String sql);--执行select返回true 执行其他的语句返回false,
ResultSet实际上是一张二维的表格,它内部有一个“行光标”,光标默认位置在"第一行的上方",这里可以调用rs的对象的next()方法把“行光标”向下移动一行,当第一次调用next()方法时,“行光标”就到了第一行记录的位置,这是就可以使用ResultSet提供的getXXX(int col)方法来获取指定的列的数据了。
rs.next(); rs.getInt(1);//此时getXXX,XXX根据数据类型改变。
释放资源:关闭顺序(先得到的后关闭,后得到的先关闭)
rs.close(); stmt.close(); con.close();
核心代码:
package cn.itheima.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.junit.Test;
public class TestLogin {
@Test
public void testLogin() {
try {
String username = "老王";
String password = "456";
login(username, password);
} catch (Exception e) {
e.printStackTrace();
}
}
public void login(String username, String password) throws ClassNotFoundException, SQLException {
// 1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.获取连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/web08?useUnicode=true&characterEncoding=UTF8", "root", "1107");
// 3.创建执行sql语句的对象:注意:除了Driver是jdbc下面的包,其他都是sql中的包
Statement stmt = conn.createStatement();
// 4.书写一个sql语句
String sql = "select uname,upwd from user where " + "uname ='" + username + "' and upwd='" + password + "'";
// 5.执行sql语句
ResultSet rs = stmt.executeQuery(sql);
// 6.对结果集进行处理
if (rs.next()) {
System.out.println("登录成功!");
System.out.println("用户名:" + username + "密码:" + password);
System.out.println(sql);
} else {
System.out.println("查无此人!");
}
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
}
public void login1(String username, String password) throws ClassNotFoundException, SQLException {
// 1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.获取连接
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/web08?useUnicode=true&characterEncoding=UTF8", "root", "1107");
// 3.先编写sql语句
String sql = "select * from user where uname = ? and upwd=?";
// 4.创建预处理对象
PreparedStatement pstmt = conn.prepareStatement(sql);
// 5.设置参数(给占位符)
pstmt.setString(1, username);
pstmt.setString(2, password);
// 6.执行查询操作
ResultSet rs = pstmt.executeQuery();
// 7.对结果集进行处理
if (rs.next()) {
System.out.println("登录成功!");
System.out.println("用户名:" + username + "密码:" + password);
System.out.println(sql);
} else {
System.out.println("查无此人!");
}
if (rs != null) {
rs.close();
}
if (pstmt != null) {
pstmt.close();
}
if (conn != null) {
conn.close();
}
}
}
分页查询关键字limit(2,2)第一个参数为起始位置,第二个参数表示每页显示的数据数量。
起始位置计算:(要查询第几页-1)*第二个参数 = 起始位置。
每页显示三条记录,查询第三页数据:如下:
上一篇: 数据库:sql语句