内连接:
SELECT * FROM employee e INNER JOIN department d
ON e.depno=d.id;
工作中用ON,不用WHRER
外连接(左连接、右连接)
外连接的特点:查询出的结果存在不满足条件的可能。
左连接
是先查询出左表(即以左表为主),然后查询右表,右表中满足条件的显示出来,不满足条件的显示NULL。
右连接
右连接就是先把右表中所有记录都查询出来,然后左表满足条件的显示,不满足显示NULL。
自连接 :自己和自己连接
注意:自连接要起别名
自然连接
大家也都知道,连接查询会产生无用笛卡尔积,我们通常使用主外键关系等式来去除它。而自然连接无需你去给出主外键等式,它会自动找到这一等式:
两张连接的表中名称和类型完全一致的列作为条件,例如emp和dept表都存在deptno列,并且类型一致,所以会被自然连接找到!
当然自然连接还有其他的查找条件的方式,但其他方式都可能存在问题!
SELECT * FROM emp NATURAL JOIN dept;
下面这个等同于自然连接
SELECT * FROM emp AS e INNER JOIN dept AS d USING(deptno);
子查询:
子查询概念:
一个select语句中包含另一个完整的select语句。
子查询就是嵌套查询,即SELECT中包含SELECT,如果一条语句中存在两个,或两个以上SELECT,那么就是子查询语句了。
SELECT depno,MAX(sal) AS 'maxsal' FROM emp GROUP BY depno; SELECT t1.* FROM emp t1,(SELECT depno,MAX(sal) AS 'maxsal' FROM emp GROUP BY depno) t2 WHERE t1.sal=t2.maxsal;
varchard的长度最多255,超过255的话,用text
如果是date类型,只保存年月日
时间日期函数
ADDTIME (date2 ,time_interval ) |
将time_interval加到date2 |
CURRENT_DATE ( ) |
当前日期 |
CURRENT_TIME ( ) |
当前时间 |
CURRENT_TIMESTAMP ( ) |
当前时间戳 |
DATE (datetime ) |
返回datetime的日期部分 |
DATE_ADD (date2 , INTERVAL d_value d_type ) |
在date2中加上日期或时间 |
DATE_SUB (date2 , INTERVAL d_value d_type ) |
在date2上减去一个时间 |
DATEDIFF (date1 ,date2 ) |
两个日期差 |
NOW ( ) |
当前时间 |
YEAR|Month|Day(datetime ) |
年月日 |
数学函数
ABS (number2 ) |
绝对值 |
BIN (decimal_number ) |
十进制转二进制 |
CEILING (number2 ) |
向上取整 |
CONV(number2,from_base,to_base) |
进制转换 |
FLOOR (number2 ) |
向下取整 |
FORMAT (number,decimal_places ) |
保留小数位数 |
HEX (DecimalNumber ) |
转十六进制 |
LEAST (number , number2 [,..]) |
求最小值 |
MOD (numerator ,denominator ) |
求余 |
RAND([seed]) |
RAND([seed]) |
保留小数位数:会四舍五入
JDBC:
DBC规范
掌握四个核心对象:
- DriverManager:用于注册驱动
- Connection: 表示与数据库创建的连接
- Statement: 操作数据库sql语句的对象
- ResultSet: 结果集或一张虚拟表
实现JDBC操作
1、注册驱动
2、创建连接
3、得到执行sql语句的Statement对象
4、执行sql语句,并返回结果
5、处理结果
6关闭资源
package desson10; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; //import com.mysql.jdbc.Driver; /* 实现JDBC操作 1、注册驱动 2、创建连接 3、得到执行sql语句的Statement对象 4、执行sql语句,并返回结果 5、处理结果 6关闭资源 */ public class Demo01 { public static void main(String[] args) throws SQLException, ClassNotFoundException { // TODO Auto-generated method stub //1.注册驱动,使用mysql驱动 //DriverManager.registerDriver(new com.mysql.jdbc.Driver()); //注册了两次驱动 Class.forName("com.mysql.jdbc.Driver"); //2.创建连接 String url="jdbc:mysql://localhost:3306/test1"; String user="root"; String password="xxxxxx"; Connection connection= DriverManager.getConnection(url, user, password); //3.得到执行sql语句的Statement对象 Statement statement= connection.createStatement(); //System.out.println(statement.getClass()); //4.执行sql语句,并返回结果 ResultSet rs=statement.executeQuery("select * from user"); //5.处理结果 while (rs.next()) { //获取五个字段的数据 System.out.print(rs.getObject(1)+" ");//id System.out.print(rs.getObject(2)+" ");//name System.out.print(rs.getObject(3)+" ");//password System.out.print(rs.getObject(4)+" ");//email System.out.print(rs.getObject(5)+" ");//birthday System.out.println(); } //6.关闭资源 //关闭结果集 rs.close(); statement.close(); //关闭连接 connection.close(); } } 结果; 1 zhangsan 123456 zs@sina.com 1980-12-04 2 lisi 123456 lisi@sina.com 1981-12-04 3 wangwu 123456 wangwu@sina.com 1979-12-04
三种连接方式:
//2.创建连接 //2.1 /*String url="jdbc:mysql://localhost:3306/test1"; String user="root"; String password="xxxxxx"; Connection connection= DriverManager.getConnection(url, user, password);*/ //2.2 直接写url //Connection connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/test1?user=root&password=xxxxxx"); //2.3 getConnection(String url, Properties info) String url="jdbc:mysql://localhost:3306/test1"; Properties info=new Properties(); info.setProperty("user", "root"); info.setProperty("password", "xxxxxx"); Connection connection=DriverManager.getConnection(url, info);
接口的方法
boolean next() 将光标从当前位置向下移动一行
int getInt(int colIndex) 以int形式获取ResultSet结果集当前行指定列号值
int getInt(String colLabel) 以int形式获取ResultSet结果集当前行指定列名值
float getFloat(int colIndex) 以float形式获取ResultSet结果集当前行指定列号值
float getFloat(String colLabel) 以float形式获取ResultSet结果集当前行指定列名值
String getString(int colIndex) 以String 形式获取ResultSet结果集当前行指定列号值
String getString(String colLabel) 以String形式获取ResultSet结果集当前行指定列名值
Date getDate(int columnIndex);
Date getDate(String columnName);
void close() 关闭ResultSet 对象
可移动游标的方法
boolean next() 将光标从当前位置向前移一行。
boolean previous() 将光标移动到此 ResultSet 对象的上一行。
boolean absolute(int row) 参数是当前行的索引,从1开始 根据行的索引定位移动的指定索引行。
void afterLast() 将光标移动到末尾,正好位于最后一行之后。
void beforeFirst() 将光标移动到开头,正好位于第一行之前。