1 简介:
SQL(英文全称:Structured Query Language)是结构化查询语言,专门用来访问和处理数据库的编程语言。能够让我们以编程的形式,操作数据库里面的数据。
2 SQL语句特点
不区分大小写
3 SQL的主要内容
主句:select、insert into、update 、delete
子句:where(and 和 or) 、order by 、group by 、limit、join...on
4 增删改查
4.1 添加数据
添加数据语法:
INSERT INTO 表名[( 字段名1,字段名2,... )] VALUES ('value1','value2',.... )
-- 如果value的值是字符串则必须加 引号
-- 添加数据:insert into 表名[(字段名1,字段名2...)]values('值1','值2'...)
-- insert into class(banhao,banji,teacher)values(6,'python开发','王老师')
-- 等价于上面的sql语句:
-- insert into class values(9,'python开发3','王老师')
-- insert into class(banji,teacher)values('go语言开发','李老师')
4.2 删除数据
删除数据语法:
DELETE FROM 表名 [WHERE 条件]
-- 注意:不加条件全删除,很危险
-- 删除数据:delete from 表名 [where 条件]
-- 注意:如果省略了where条件时会把表中所有数据给删除掉,要慎重使用
-- 删除班号为7的班级数据:
-- delete from class where banhao=7
-- delete from students
4.3 更新数据
更新(修改)数据语法:
UPDATE 表名 SET column1 = value1,column2 = value2 ,... [WHERE 条件]
-- 更新数据:update 表名 set 要修改的字段名1='值',要修改的字段名2='值'... [where 条件]
-- 注意:如果省略了where条件时会把表中所有数据给修改掉,要慎重使用
-- 修改班号为8的班级名称为web开发2班,班主任为张老师:
update class set banji='web开发2班',teacher='张老师' where banhao='8'
4.4 单表查询数据
单表查询数据的语法:
select */字段名/函数/字符串 from 表名 [where 条件 group by 字段名 order by 字段名 asc/desc limit m,n]
*: 代表所有的字段
group by :分组查询
4.5 其它子句
4.5.1 where 条件
运算符 | 描述 |
---|---|
= | 等于 |
!= 或者 <> | 不等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
[not] BETWEEN | 在某个范围内 |
[not] LIKE | 搜索某种模式 |
AND、OR | 交集、并集 |
语法:
主句 WHERE column = VALUE
主句 WHERE column BETWEEN VALUE1 AND VALUE2 -- 两边的区间是包含的
主句 WHERE column LIKE 'a%' -- 在某个列中查询以a为开头的数据 主句 WHERE column LIKE '%a' -- 在某个列中查询以a为开头的数据 主句 WHERE column LIKE '%a%' -- 在某个列中查询以a为开头的数据
-- 查询所有的学生信息:
-- select * from xsb
-- 查询所有学生的姓名、年龄、所在系:
-- select '姓名为:',xm,age,'系名为:',szx from xsb
-- 查询学生个数:count(*/某个字段名)
-- as:起别名
-- select count(*) from xsb
-- select count(xh) as m from xsb
-- 查询计算机系、数学系的学生姓名、年龄、所在系:
-- 或: or、||
-- select xm,age,szx from xsb where szx='计算机系' || szx='数学系'
-- select xm,age,szx from xsb where szx='计算机系' or szx='数学系'
-- in():在...里面
-- 等价于上面的sql:
-- select xm,age,szx from xsb where szx in('计算机系','数学系')
-- 查询成绩大于等于85并且小于等于95的成绩信息:
-- 且:and、&&
-- select * from cjb where cj>=85 and cj<=95
-- select * from cjb where cj>=85 && cj<=95
-- between...and:
-- 等价于上面的sql:
-- select * from cjb where cj between 85 and 95
-- select * from cjb where cj not between 85 and 95
-- 不等于:!=、<>
-- 查询不为计算机系的学生姓名、所在系:
-- select xm,szx from xsb where szx!='计算机系'
-- select xm,szx from xsb where szx<>'计算机系'
-- 模糊查询:like
-- 通配符:%表示零个或n个任意字符 _表示任意一个字符
-- 查询姓王的学生姓名、性别、年龄:
-- select xm,age,sex from xsb where xm like '王%'
-- select xm,age,sex from xsb where xm like '王_'
-- 查询姓名中含有力的学生姓名、年龄:
-- select xm,age from xsb where xm like '%力%'
-- select xm,age from xsb where xm not like '%力%'
4.5.2 order by排序
语法:
主句 ORDER BY column [ ASC | DESC ]
-- ASC 升序 默认升序
-- DESC 倒序
-- order by :按某个字段排序
-- asc:升序,如果省略则默认为asc
-- desc:降序
-- 查询c01、c02这两门课程的成绩信息,并按成绩降序排序,只显示成绩最高的三个:
-- select * from cjb where kch='c01' || kch='c02'
-- select * from cjb where kch in('c01','c02') order by cj desc limit 3
-- 查询除c06外的每门课程的学习人数,并按学习人数降序排序:
-- select count(xh) as m ,kch from cjb where kch!='c06' group by kch order by m desc
-- 查询除表演系外的学生姓名、年龄、所在系,先按所在系升序排序,如果为同一个系则按年龄降序排序:
select xm,age,szx from xsb where szx<>'表演系' order by szx asc,age desc
4.5.3 group by分组查询、聚合查询
SELECT *[,聚合函数] FROM 表名 [GROUP BY 字段]
count(*): 总个数
min(字段名):最小值
max(字段名):最大值
avg(字段名):求平均值
sum(字段名) :求和(累加)
-- group by :分组查询
-- 查询男生、女生分别有多少人:
-- select count(*),sex from xsb group by sex
-- 查询除c06这门课程外的每门课程的总分数:
-- select sum(cj),kch from cjb where kch<>'c06' group by kch
-- 查询除表演系外的每个系的人数:
-- select count(*),szx from xsb where szx<>'表演系' group by szx
-- 查询学号不为9531102的每个学生的平均分数:
select avg(cj),xh from cjb where xh<>'9531102' group by xh
4.5.4 limit
SELECT * FROM 表名 [ LIMIT [start,]size ]
size:取几条
start: 下标,从哪几个位置开始取,默认的位置编号是从零
-- limit m,n:
-- m:位置编号、默认从零开始
-- n:要查询的个数/条数
-- 查询前三个学生信息:
-- select * from xsb limit 0,3
-- 等价于上面的sql:如果省略m的值,则默认从第一条记录开始查询
-- select * from xsb limit 3
-- select * from xsb limit 1,3
-- select * from xsb limit 3,5
-- limit m,n:通常用于实现分页
-- 计算总页数:总页数=向上取整(总记录个数/每页要显示的条数)
-- 计算游标位置:游标位置(m)=(第几页-1)*条数
-- 每页要显示4个学生,第一页要显示的学生信息:
-- select * from xsb limit 0,4
-- 每页要显示4个学生,第二页要显示的学生信息:
-- select * from xsb limit 4,4
-- 每页要显示4个学生,第三页要显示的学生信息:
-- select * from xsb limit 8,4
-- order by :按某个字段排序
-- asc:升序,如果省略则默认为asc
-- desc:降序
-- 查询c01、c02这两门课程的成绩信息,并按成绩降序排序,只显示成绩最高的三个:
-- select * from cjb where kch='c01' || kch='c02'
-- select * from cjb where kch in('c01','c02') order by cj desc limit 3
-- 查询除c06外的每门课程的学习人数,并按学习人数降序排序:
-- select count(xh) as m ,kch from cjb where kch!='c06' group by kch order by m desc
-- 查询除表演系外的学生姓名、年龄、所在系,先按所在系升序排序,如果为同一个系则按年龄降序排序:
select xm,age,szx from xsb where szx<>'表演系' order by szx asc,age desc
4.5.5 join联表查询
联表查询的语法:
全联接inner join的特点:要关联的表必须满足on条件时才会出现在查询结果集中
在联接left join的特点:left join左边的表不管是否满足on条件都会出现在查询结果集中,left join右边的表满足on条件时在查询结果集中会有具体的数据,否则以null来显示
SELECT * FROM 表1 inner JOIN 表2 ON 连接条件 [where 条件 group by 字段名 order by 字段名 asc/desc limit m,n] -- 全连接。 只有on后面的条件成立才会连接。
SELECT * FROM 表1 left join 表2 ON 连接条件 [where 条件 group by 字段名 order by 字段名 asc/desc limit m,n] -- 左连接 以左表为基准,左表的数据都会显示
-- 查询学生的学号、姓名、年龄、所在系、成绩:
-- 全联接inner join的特点:要关联的表必须满足on条件时才会出现在查询结果集中
-- select * from xsb as x inner join cjb as c on x.xh=c.xh inner join kcb as k on c.kch=k.kch
-- 在联接left join的特点:left join左边的表不管是否满足on条件都会出现在查询结果集中,left join右边的表满足on
-- 条件时在查询结果集中会有具体的数据,否则以null来显示
select x.xh,xm,age,szx,cj from xsb as x left join cjb as c on x.xh=c.xh
-- 查询计算机系、数学的学生姓名、年龄、所在系、成绩、课程名,并按成绩降序排序,
select xm,age,szx,kcm,cj from xsb as x left join cjb as c on x.xh=c.xh left join kcb as k on c.kch=k.kch
where szx in('计算机系','数学系') order by cj desc