mysql-查询语句

mysql查询语句

基本查询语句

1.* 所有字段
2.部分字段,也可以字段别名(as 可以省略),还可以对字段运算
3.去除查询的重复数据DISTINCT,切记,数据库的数据没有删除
4.where 条件筛选,and 并且,or 或者,in 多个值,between 起始 and 终止
is NULL 为NULL的,IS NOT NULL < > <> =
5.模糊查询 like 符号:% 任意个字符(0或多个) _任意1个字符
6.Order by 字段名 ASC|DESC 排序,ASC升序,可以省略,DESC降序
7.IFNULL(字段名,默认值) 用在查询的字段中,处理null值

8.字符串查询语法: SELECT 字符串函数 ([参数列表])
字符串函数 说明
CONCAT(str1,str2,str…) 将 多个字符串连接
INSERT(str,pos,len,newStr) 将str 中指定 pos 位置开始 len 长度的内容替换为 newStr
LOWER(str) 将指定字符串转换为小写
UPPER(str) 将指定字符串转换为大写
SUBSTR(str,num,len) 将str 字符串指定num位置开始截取 len 个内容

select * from t_student;
DELETE from t_student;
#TRUNCATE删除数据,同时删除自增器
TRUNCATE TABLE t_student;
#字段可以运算
select id-8 from t_student;
#为字段别名
select sex as '性别',birthday shengri from t_student;
#去除查询的重复数据
select DISTINCT sex from t_student;
#排序,asc 升序,可以省略,desc 降序
SELECT * from t_student order by birthday desc;
SELECT * from t_student order by sex desc,id desc;
#条件
select * from t_student where sex='女';
# 条件 and 并且,同时满足,or 或者 满足其一就可以
select * from t_student where sex='女' or id>1;
# 不等于
select * from t_student where id <>2;
# in 值为其中的一些 not没有,不属于
select * from t_student where sex not in ('男');
# in 不连续
select * from t_student where id in (1,3,4);
#BETWEEN 起始值 and 终止值 连续
select * from t_student where id BETWEEN 1 and 3;
select * from t_student where id >=1 and id <=3;
# null 查询 is NULL 或者 IS NOT NULL
select * from t_student where birthday is not null;
# IFnULL(字段,为null的默认值)
select id,name,sex,ctime,IFNULL(birthday,now()) birthday from t_student;
#模糊查询 查询王开头的 %任意个(0或多个字符) _表示1个字符
select * from t_student where name like '王%';
select * from t_student where name like '王__';
#模糊查询 查询以鱼结尾的
select * from t_student where name like '%鱼';
#模糊查询 包含小
select * from t_student where name like '%小%';

#CASE 分支判断,类似于Java中的switch
select id,name,
(case 
when sex='女' then '招商银行'
else '建设银行' END) sex from t_student;

select YEAR(now());
# 日期函数 计算年龄
select id,name,IFNULL((YEAR(now())-year(birthday)),0) age from t_student;
# 计算相差的天数
select DATEDIFF(now(),birthday) from t_student;

#字符串函数 拼接
select CONCAT('我','们下课','吧');
# 获取字符串的长度
select LENGTH('下课');
#字符串函数 截取 1.要截取的字符串 2.起始索引,从1开始 3.长度
select SUBSTR(name,2,1) from t_student;

查询进阶:

1.聚合函数
count计数、max最大、min最小、sum求和、avg平均值
2.分组
group by 字段名 一般做统计时需要
3.having 条件查询
对分组后的数据进行条件筛选,可以使用聚合函数
4.限定查询 limit
可以实现分页查询,或者查询指定数量的数据
limit 数量
limit 行索引(0开始),数量

#聚合函数 统计使用 求和sum,平均值avg,max最大, min最小 ,条数count
select max(id),min(id) from t_student;
select count(*),avg(id),sum(id) from t_student;
#分组 GROUP BY 字段,查询各种性别的人数
select sex,count(*) from t_student GROUP BY sex;
#查询性别的人数,人数超过id平均值
#havig 分组后的数据 筛选还可以使用聚合函数
select sex,count(*) from t_student GROUP BY sex HAVING count(*)>avg(id);

select * from t_student;
select count(1),count(*) from t_student;

#查询每种性别年龄最大的
select max(IFNULL(DATEDIFF(now(),birthday),0)),sex from t_student GROUP BY sex;
#查询id 最大的前2条
select * from t_student order by id desc limit 2;
#查询id降序排列,从行索引1开始,查询3条
select * from t_student order by id desc limit 1,3;
#分页查询 ,每页显示4条,请查询第二页的数据
select * from t_student order by id desc limit 4,4;

Mysql自带的函数:

1.字符串函数
length长度、substr(要截取的字符串,起始索引1开始,截取长度)、concat拼接字符串
2.日期函数
now()获取当前日期时间,year()获取日期中的年,datediff(第一个日期,第二个日期)计算相差的天数

SQL提升:

1.子查询
把一个查询结果作为另一个查询条件或子表
2.合并结果集
union 要求查询语句的字段数量一致

五、联合查询:
1.笛卡尔积查询
select * from 表名1,表名2;
查询的结果为2张表数量的乘积
2.等值查询
select * from 表名1,表名2 where 条件字段;
获取2个表的交集,性能低
3.内连接 查询-常用
select *|字段名 from 表名1 inner join 表名2 on 表名1.字段名=表名2.字段;
获取2个表的交集
4.左外连接查询-常用
select *|字段名 from 表名1 left join 表名2 on 表名1.字段名=表名2.字段;
5.右外连接查询-常用
select *|字段名 from 表名1 right join 表名2 on 表名1.字段名=表名2.字段;
6.全连接查询-Mysql不支持
select *|字段名 from 表名1 full join 表名2 on 表名1.字段名=表名2.字段

#子查询 把一个查询语句的结果(单列)作为另一个的查询条件 一般配合in使用
select * from t_student where id > (select avg(id)from t_student);
select * from t_student where id in (select max(id)from t_student) and sex='女';

select * from t_student where id > ANY(select avg(id)from t_student);
select * from t_student where id > ALL(select avg(id)from t_student);
#子查询,子表 需要起别名
select s1.* from (select id,name,sex from t_student where sex='女') s1;
#查询数据库的表
select * from 
show tables;
#UNION 合并结果集,要求2个查询的字段数量一样
select job_id id from jobs UNION select id from t_student;
select job_id id,job_title from jobs UNION ALL select id,name from t_student ;
#笛卡尔积查询
select * from jobs,t_student;
#等值查询,区两张表的交集 性能低
select * from employees e,departments d where e.department_id=d.department_id ;

#内连接查询 2个表的交集
select * from employees e inner join departments d on e.department_id=d.department_id ;
create table t_score(

SQL 语句编写顺序

SELECT 列名 FROM 表名 WHERE 条件 GROUP BY 分组 HAVING 过滤条件 ORDER BY 排序列(asc|desc)LIMIT 起始行,总条数

SQL 语句执行顺序

1.FROM :指定数据来源表
2.WHERE : 对查询数据做第一次过滤
3.GROUP BY : 分组
4.HAVING : 对分组后的数据第二次过滤
5.SELECT : 查询各字段的值
6.ORDER BY : 排序
7.LIMIT : 限定查询结果

事务【重点】

10.1 模拟转账

生活当中转账是转账方账户扣钱,收账方账户加钱。我们用数据库操作来模拟现实转账。

1.事务
事务:实现多个SQL语句,同时成功或失败
使用:如果一次性操作多个SQL语句(DML类型),需要开启事务
特性:ACID
A:原子性,事务无法再分隔,是最小的单位,整体
C:一致性,事务可以保证一致性,要么成功,要么失败
I:隔离性,事务与事务之间,需要保持隔离性
D:持久性,事务操作的数据,最终也是真正存储到磁盘
命令:
commit:提交事务,成功
rollback:回滚事务,失败
JDBC验证事务

2.DCL用户控制语言
创建用户(create)和授权(grant)和撤销权限(revoke)

把讲过的练习,验证,记忆

3.Idea
Idea 下载 破解

10.2 事务的概念

事务是一个原子操作。是一个最小执行单元。可以由一个或多个SQL语句组成,在同一个事务当中,所有的SQL语句都成功执行时,整个事务成功,有一个SQL语句执行失败,整个事务都执行失败。

10.3 事务的边界

● 开始:连接到数据库,执行一条DML语句。 上一个事务结束后,又输入了一条DML语句,即事务的开始
● 结束:
1). 提交:
a. 显示提交:commit;
b. 隐式提交:一条创建、删除的语句,正常退出(客户端退出连接);
2). 回滚:
a. 显示回滚:rollback;
b. 隐式回滚:非正常退出(断电、宕机),执行了创建、删除的语句,但是失败了,会为这个无效的语句执行回滚。

10.4 事务的原理

数据库会为每一个客户端都维护一个空间独立的缓存区(回滚段),一个事务中所有的增删改语句的执行结果都会缓存在回滚段中,只有当事务中所有SQL 语句均正常结束(commit),才会将回滚段中的数据同步到数据库。否则无论因为哪种原因失败,整个事务将回滚(rollback)。

10.5 事务的特性

● Atomicity(原子性)

表示一个事务内的所有操作是一个整体,要么全部成功,要么全部失败

● Consistency(一致性)

表示一个事务内有一个操作失败时,所有的更改过的数据都必须回滚到修改前状态

● Isolation(隔离性)

事务查看数据操作时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。

● Durability(持久性)

持久性事务完成之后,它对于系统的影响是永久性的。● 开始:连接到数据库,执行一条DML语句。 上一个事务结束后,又输入了一条DML语句,即事务的开始

10.6 事务应用

应用环境:基于增删改语句的操作结果(均返回操作后受影响的行数),可通过程序逻辑手动控制事务提交或回滚

以后凡是同时操作2个以及以上的DML类型的语句的时候,需要开启事务

事务完成转账

#A 账户给 B 账户转账。
#1.开启事务
START TRANSACTION;|setAutoCommit=0;#禁止自动提交 setAutoCommit=1;#开启自动提交
#2.事务内数据操作语句
UPDATE ACCOUNT SET MONEY = MONEY-1000 WHERE ID = 1;
UPDATE ACCOUNT SET MONEY = MONEY+1000 WHERE ID = 2;
#3.事务内语句都成功了,执行 COMMIT;
COMMIT;
#4.事务内如果出现错误,执行 ROLLBACK;
ROLLBACK;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值