概述
数据的操作永远离不开增删改查四个字,也就是DML数据操作语言:涉及增删改,DQL语言:数据查询语言 关键字select
DQL语言:数据查询语言
D:Data Q:Quevy L:Language 关键字:select
数据库三范式:
第一范式:1NF是对属性的原子性约束,要求字段具有原子性,不可再分解;(只要是关系型数据库都满足1NF)
第二范式:2NF是在满足第一范式的前提下,非主键字段不能出现部分依赖主键;解决:消除复合主键就可避免出现部分以来,可增加单列关键字。
第三范式:3NF是在满足第二范式的前提下,非主键字段不能出现传递依赖,比如某个字段a依赖于主键,而一些字段依赖字段a,这就是传递依赖。解决:将一个实体信息的数据放在一个表内实现。
查询:select
select 字段名1,字段名2,字段名3... from 表名 也可以用表名.字段名 用于区分不同的表拥有相同的表名
取别名:
关键字 AS
select * from 表名 as 表别名; --as可以省略,但最好加上
select 表别名.列名,列名, .... from 表名 as 表别名
示例:selesc r.stuId,SubjectNo from result as r;
修改列名名称:
select 表别名.列名 as 列别名,列名 as 列别名 from 表名 as 表别名;
示例:-- select r.stuId as '学生编号',score 成绩 from result as r;
去重:distinct
格式:select distinct 字段名 from 表名;
示例:select distinct stuId from result; ------相同的学号只取一次
注!:distinct 只能在开头,不能再中间
select score,distinct stuId from result; ------语句不成立
排序:order by
示例:select distinct stuId from result order by stuId;------会把学生编号升序排列
----降序排列:select distinct stuId from result order by stuId desc;
注:降序排列关键字 desc 但只会让紧跟着desc 的列名的值降序
---嵌套语句进行增加行键
select 表别名.*,@a:=@a+1 from 表名 表别名(select @a:=0) s; --s是(select @a:=0)这个临时表的表别名,作用:给数据结果加编号
模糊查询:关键字 like(像)
(1)当想查询学生姓名中包含字符a,就需要使用到模糊查询,模糊查询的话使用关键字是like(像)需要使用通配符 '_' '%' '[ ]' '[^]'
(2)%:表示任意 0 个或多个字符。可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示。
_:表示任意单个字符。匹配单个任意字符,它常用来限制表达式的字符长度语句。
[ ]:表示括号内所列字符中的一个(类似正则表达式)。指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。
[^] :表示不在括号所列之内的单个字符。其取值和 [] 相同,但它要求所匹配对象为指定字符以外的任一个字符。
通配符:_
查询名字由五个字母构成的 学生记录
Select *from stu where sname like ‘_____’;
查询名字由五个字母构成的,并且第五个字符是i 学生记录
Select *from stu where sname like ‘___i’;
通配符: %
查询名字以‘z’开头的学生记录
Select *from stu where sname like ‘z%’;
查询名字中第二个字符是i的学生记录
Select *from stu where sname like ‘_i’;
查询名字中包含a的学生记录
select *from stu where sname like ‘%a%’;
注:当查询字符串内包含 '_' 或 '%' 时 需要使用转义符 \
in:
子查询:嵌套查询,在select查询内还有一层 select查询,把原本需要两步骤查询得出的数据合并成一条语句,节省空间,提高效率
子查询的分类: 1. 从子查询返回的结果的条目数:单行子查询 VS 多行子查询
2.子查询是否被执行多次: 相关子查询 VS 不相关子查询
select * from result where stuId not in
(select stuId from student);--筛选不在学生表范围内的学生成绩
联合查询:
联合查询分类
内连接(inner Join 或 Join)
外连接(outer Join)
左外连接(left outer Join 或 left Join)
右外连接(right outer Join 或 right Join)
全外连接(full outer Join 或 full Join)
交叉连接 (cross Join)
结果集链接 (union 和 union all)
联合查询效率较高.以下例子来说明联合查询的好处
t1表结构(用户名,密码) userid int username varchar(20) password varchar(20)
1 jack jackpwd
2 owen owenpwd
t3表结构(用户积分,等级) userid int jf int dj int
1 20 3
3 50 6
第一:内联(inner join)
如果想把用户信息,积分,等级都列出来.那么一般会这样写
select * from t1 ,t3 where t1.userid = t3.userid 其实这样的结果等同于select * from t1 inner join t3 on t1.userid=t3.userid
就是把两个表中都存在userid的行拼成一行.这是内联.但后者的效率会比前者高很多.建议用后者的写法.
运行结果:userid username password userid jf dj
1 jack jacjpwd 1 20 3
第二:左联(left outer join)显示左表中的所有行
select * from t1 left outer join t3 on t1.userid=t3.userid
运行结果:userid username password userid jf dj
1 jack jackpwd 1 20 3
2 owen owenpwd NULL NULL NULL
第三:右联(right outer join)显示右表中的所有行
select * from t1 right outer join t3 on t1.userid=t3.userid
运行结果:userid username password userid jf dj
1 jack jackpwd 1 20 3
Null Null Null 3 50 6
第四:全联(full outer join)显示两边表中所有行
select * from t1 full outer join t3 on t1.userid=t3.userid
运行结果:userid username password userid jf dj
1 jack jackpwd 1 20 3
2 owen owenpwd NULL NULL NULL
Null Null Null 3 50 6