SQL学习笔记(一)
逻辑删除
所谓的逻辑删除其实并不是真正的删除,而是在表中将对应的是否删除标识或者字段做修改操作。在逻辑上数据是被删除的,但数据本身依然存在库中
例如
update students3 set isdelete=0
update students3 set isdelete=1 where id=1
select *from students3 where isdelete=0
1.设计表,给表添加一个字段isdelete,1代表删除,0代表没有被删除
2.把所有的数据isdelete改为0
3.要删除某一条数据时更新isdelete为1
4.当要查询数据时,只查询isdelete=0的数据
数据操作-查询
创建数据
create table students(
studentNo varchar(10) primary key,
name varchar(10),
sex varchar(1),
hometown varchar(20),
age tinyint(4),
class varchar(10),
card varchar(20)
)
插入数据
insert into students values
('001','王昭君','女','北京','20', '1班','340322199001247654'),
('002','诸葛亮','男','上海','19','2班','340322199002242354'),
('003','张飞','男','南京','24','3班','340322199003247654'),
('004','白起','男','安徽','22','4班','340322199005247654'),
('005','大乔','女','天津','19','3班', '340322199004247654'),
('006','孙尚香','女','河北','18','1班','340322199006247654'),
('007','百里玄策','男','南京','24','3班','340322199007247654'),
('008','小乔','女','河南','15','3班','340322199008247654'),
('009','百里守约','男', '湖南', '21','3班','340322199009247654'),
('010','妲己','女','广东','26','2班','340322199010247654'),
('011','礼拜','男','北京','30','4班','340322199011247654'),
('012','孙膑','男', '新疆','26','4班','340322199012247654');
查询所有列:select * from students
查询指定字段:select 列1,列2,… from 表名
使用as给字段起别名
select name as 姓名,sex as 性别,hometown as 家乡 from students
不会影响这个表(查询是不会影响表中的数据的),也可以给表起别名
去重distinct:重复的数据只显示一条
格式:select distinct 列1, … from 表名;
条件查询
比较运算符
等于:=
大于:>
大于等于:>=
小于:<
小于等于:<=
不等于:!=或<>
例1
例2:查询20岁以下的学生
Select * from students where age<20;
例3:查询家乡不在北京的学生
Select * from students where hometown!= '北京';select * from students where hometown<>'北京'
逻辑运算 and or not
模糊查询
like、%表示任意多个任意字符、_表示一个任意字符
范围查询
n表示一个非连续的范围内
例1:查询家乡是北京或上海或广东的学生
select * from students where hometow='北京' or hometow= '上海' or hometow=''广东)
select * from students where hometown in('北京', '上海', ''广东)
Between…and…表示在一个连续的范围内
例2:查询年龄为18至20的学生。
select * from students whereage>18 and age<20
select * from students whereage between 18 and 20
空判断null
is null 是空,没有填写,''是空字符串,有填写
select * from students where card is null
is not null 判非空
select * from students where card is not null
排序
asc 升序,从小到大;desc 降序,从大到小
例1:查询所有学生信息,按照年龄从小到大排序。
Select * from students order by age
例2:查询所有学生信息,按年龄从大到小排序,年龄相同,再按学号从小到大排序
Select * from students order by age desc,studentNo asc
默认升序asc,可省略不写
例:查询所有学生信息,按照学生姓名顺序排序
select * from students order by convert(name using gbk)
因为选的是utf-8编码,姓名是中文需要改编码后进行排序
聚合函数,一般用来统计数据,聚合函数不能在where中使用
Count()表示计算总行数,括号中写与列名,结果是相同的
Max(列)表示求此列最大值
Min(列)表示求此列最小值
Sum(列)表示求此列的和
Avg(列)表示求此列的平均值
分组
语法:select 列1,列2,聚合…from 表名group by 列1,列2…
例1:查询各种性别的人数。
Select sex,count() from students group by sex;
例2:查询各种年龄的人数。
Select age,count() from students group up age;
group by 也有去重的作用
分组过滤
语法:select 列1,列2,聚合... from 表名 group by 列1,列2,列3,…having 列1,…聚合…
having必须跟在group by 后
先过滤再分组或先分组再过滤
Where是对from后面指定的表进行数据筛选,属于对原始数据的筛选
Having是对group by的结果进行筛选
分页(获取部分行)
语法:select * from 表名limit start,count
从start开始,获取count条数据,索引从0开始