条件查询
语法格式:
select 5
字段,字段...
from 1
表名
where 2
条件
group by 3
分组
having 4
条件
order by 6
字段 排序方式;
limit 7
......
between…and…
select ename,sal from emp where sal between 1100 and 3000;
select ename from emp where ename between 'A' and 'B';
is null 、is not null
and和or的优先级
in的使用
//查询工作岗位是SALESMAN和SALESMAN的员工
select ename,job form emp where sal in ('SALESMAN','MANAGER');
//查询工作岗位不是SALESMAN和SALESMAN的员工
select ename,job form emp where sal not in ('SALESMAN','MANAGER');
模糊查询like
//查询名字中带o字母的
select ename from emp where ename like '%o%';
//查询名字中第二个字母是A的
select ename from emp where ename like '_A%';
//查询名字中带下划线的
select ename from emp where ename like '%\_%';
排序
//默认升序
select eanme , sal from emp order by sal;
//升序
select ename , sal from emp order by sal asc;
//降序
select ename ,sal from emp order by sal desc;
//按照工资的降序排列,当工资相同的时候在按照名字的升序排列
select ename ,sal from emp order by sal desc,ename asc;
//根据第几个字段排序
select ename,sal from emp order by 3 desc;
//随机根据某个字段排序
select ename,sal from emp order by rand() ;//select rand()返回0-1中的一个小数,这里自动取第一个数字,字段数不够则为1
ifnull()
//所有数据库都是这样规定的,只要有NULL参与的运算结果一定的null
//如果comm为空就当做0来计算
ifnull(comm,0)
多行处理函数,会自动忽略null
当一条语句中有group by 的话,select 后面只能跟分组函数和参与分组的字段
distinct去重
//去除重复的job
select distinct job from emp;
//联合去重,放在字段最前面
select distinct deptno ,job from emp;
//统计岗位的数量
select count(distinct job) from emp;
等值连接
//查询每个员工的部门,要求显示员工名和部门名
select
e.ename,d.dname
from
emp e
join
dept d
on
e.deptno = d.deptno;
非等值连接
//查询每个员工的薪资等级
select
e.ename,s.grade
from
emp e
inner join //inner可以省略
salgrade s
on
e.sal between s.losal and s.hisal ;
自连接
//找出每个员工的上级领导
select
e1.eanme as '员工',e2.ename as '领导'
from
emp e1
inner join
emp e2
on
e1.mgr = e2.empno;
外连接
//找出每个员工的上级领导(包括老板)
select
e1.ename as '员工',e2.ename as '领导'
from
emp e1
left outer join //outer可以省略
emp e2
on
e1.mgr = e2.empno;
where子句中使用查询
//查询高于平均工资的员工信息
select
*
from
emp
where
sal > (select avg(sal) from emp);
from 后嵌套子查询
//找出每个部门平均薪水的薪资等级
select
t.deptno ,s.grade
from
(select deptno , avg(sal) as avgsal from emp group by deptno) t
join
salgrade s
on
t.avgsal between s.losal and s.hisal;
select 后嵌套子查询
//找出每个员工所在的部门名称,要求显示员工名和部门名
select
//通过e.ename 的信息去后面的子查询里去查
e.eanme,(select d.dname from dept d where e.deptno = d.deptno) as dname
from
emp e;
union(可以将查询结果集相加)
select ename,job from emp where job = 'MANAGER'
union
select ename,job from emp where job = 'SALESMAN';
limit
//取出工资前5名的员工
select
ename,sal
from
emp
order by
sal desc
limit 0,5;
//取出工资排名在第4到第9名的员工
select ename,sal from emp
order by sal desc limit 3,6;
insert语句插入数据
//字段的数量和值的数量相同,并且数据类型要对应相同。
insert into 表名
//字段可以忽略不写,但是后面的value对数量和顺序都有要求
(字段名1,字段名2,字段名)
values
//可以插入多行数据
(值1,值2,值3),
(值1,值2,值3),
(值1,值2,值3);
//当一条insert语句执行成功之后,表格当中必然会多一行记录
//即使多的这一行记录当中的某些字段的NULL,后期也没有办法在执行insert语句插入数据了,只能使用update进行更新
将查询结果插入到一张表中
//有表结构的要求
insert into 表名 select语句
修改表中的数据
//没有where就是修改所有记录
update 表名 set 字段名1=值2,字段名2=值2....where 条件;
删除数据
//没有where就是删除所有记录
delete from 表名 where 条件;
//删除大表
truncate table 表名; //表被截断,不可回滚,永久丢失
建表语句
create table 表名(
//默认为null(可以不写,也可以修改默认值)
字段名1 数据类型 default null,
字段名2 数据类型,
字段名3 数据类型,
......
);
MySQL当中字段的数据类型
1. int 整数型
2. bigint 长整型(java中的long)
3. float 浮点型 (java中的flaot和double)
4. char 定长字符串(java中的String)
5. varchar 可变长字符串 255个字符(java中的StringBuffer和StringBuilder)
6. data 日期类型(java中java.sql.Data类型)
7. BLOB 二进制大对象(图片,视频等)
8. CLOB 字符大对象(存储大文本)
删除表
//如果该表存在就删除
drop table if exists 表名;
复制表
//将查询结果当作表创建出来
create table 表名 as select语句;
常见约束
非空约束 not null
drop table if exists t_user;
create table t_user(
id int,
username varchar(255) not null,//只能加到字段后面
password varchar(255)
);
唯一性约束(不能重复但是可以为null)
drop table if exists t_user;
create table t_user(
id int,
username varchar(255) unique//列级约束
);
drop table if exists t_user;
create table t_user(
id int,
username varchar(255),
usercode varchar(255),
//两个字段联合不重复(看作一个字段),表级约束
unique(username,usercode)
);
主键约束
drop table if exists t_user;
create table t_user(
//主键,不能为null,也不能重复
id int primary key,//列级约束
username varchar(255),
email varchar(255)
);
drop table if exists t_user;
create table t_user(
id int ,
username varchar(255),
email varchar(255),
primary key (id)//表级约束
);
主键分类
主键自增
drop table if exists t_user;
create table t_user(
//id字段自动维护一个自增的数字,从1开始,以1递增
id int primary key auto_increment,
);
外键约束
drop table if exists t_student;
drop table if exists t_class;
create table t_class(
cno int,
cname varchar(255),
primary key(cno)
);
create table t_student(
sno int,
sname varchar(255),
classno int,
primary key(sno),
//以t_class表中的cno字段为约束
foreign key(classno) references t_classs(cno)
);
和事务相关的只有DML语句(insert delete update)
四大特征:ACID
隔离性级别
关闭musql自动提交
start transaction;
设置全局的事务隔离级别
set global transaction isolation level 级别;
查看隔离级别
select @@global.tx_isolation;
提交事务
commit;
回滚事务
rollback;
什么时候考虑给字段添加索引
主键和具有uniqe约束的字段会自动添加索引
查看sql语句的执行计划
explain sql语句;
添加索引
//给emp表中的sal字段创建索引
create index emp_sal_index on emp(sal);
索引底层采用的数据结构是:B+Tree
索引的分类
什么时候失效
模糊查询的时候,第一个通配符使用的是%,这个时候索引会失效
创建和删除
//创建,以DQL语句创建视图
create view myview as select empno ,ename from emp;
//删除
drop view myview;
对试图增删改查会影响到原表数据
视图可以隐藏表的实现细节
source 文件
select ename,job,sal
from emp
where ename='zhangsan'
//当前事务没有结束的时候,其他事务不能修改eame为张三 这条数据(会等待当前事务提交)
for update;
六个步骤
注册驱动
//第一中方式
java.sql.Driver driver = new com.mysql.jdbc.Driver();
DriverManager.registerDriver(driver);
//第二种方式 通过类加载的方式注册驱动(静态代码块执行完成驱动的注册)
Class.forName("com.mysql.jdbc.Driver");
获取连接
/*
url:统一资源定位符,包括协议、IP、PORT、资源名
url:jdbc:mysql://127.0.0.1:3306/wangxiangqian
jdbc:mysql:// 协议
127.0.0.1 IP地址
3306 mysql数据库端口号
wangxiangqian 具体数据库实例名
*/
Connection conn = DriverManager.getConnection(url,user,password);
获取数据库操作对象
//第一种方式
Statement stmt = conn.createStatement();
//第二种方式
//预编译的数据库操作对象,预先对sql语句框架进行编译,然后再传值(避免了sql注入现象)
//?不能用单引号括起来
String sql = "select * from t_user where loginName = ? and loginPwd = ?"
PreparedStatement ps = conn.prepareStatement(sql);
//给占位符?传值,下标从1开始
ps.setString(1,loginName);
ps.setString(2,loginPwd);
//执行sql语句,获取结果集
ResultSet rs = ps.executeQuery();
执行SQL语句
String sql = "insert into dept(deptno,dname,loc) values(50,'人事部','北京')";
//专门执行DML语句,返回值是影响记录条数
int count = stmt.executeUpdate(sql);
String sql = "select empno,ename,sal from emp "
//执行查询语句,返回查询结果集
ResultSet rs = stmt.executeQuery(sql);
处理查询结果集
while(rs.next()){
//不管数据库中是什么类型,都以String的形式取出
String s = rs.getString(列的下标);//JDBC中的下标从1开始
//以列的名字获取数据,sql语句中的名字
int i = rs.getInt(列的名字);
}
释放资源
//从小到大依次关闭
if(rs!=null){
rs.close();
}
if(stmt!=null){
stmt.close();
}
if(conn!=null){
conn.close();
}
PreparedStatement和Statement比较
JDBC事务机制
//获取连接后,将自动提交机制修改为手动提交
conn.setAutoCommit(false);//开启事务
//提交事务
conn.commit();
//回滚事务
conn.rollback();