一,SQL概述
1:SQL是怎么回事?
答:SQL就是指结构化查询语句乙:SQL赋予了我们访问数据库的功能丙:SQL是ANSI(美国国家标准化组织)标准的计算机语言
2:SQL可以实现哪些功能?
·面向数据库进行查询·将数据库内的数据取出来·将新纪录插入数据库
·对数据库内的数据进行更新·删除数据库内的记录·建立数据库·建立表格
●建立存储过程●建立视图●设置表格,存储过程以及视图权限
DBMS3:
RDBMS就是指关系型的数据库管理系统
RDBMS作为SQL的基础一样是现代一切数据库系统(例如MSSQLServer,IBMDB2,Oracle,MySQL和MicrosoftAccess等)的基础
RDBMS的数据存储于一个数据库对象内,该数据库对象名为表
表就是一个有关数据项集合。他包括列和行
二,SQL语法
注:SQL是大小写不灵敏的!!!
例1如果你想把一个复杂的SQL语句用简单的分号表示出来
有些数据库系统需要在每一条SQL命令末端都用一个分号
使用分号时,需要先将这些数据库系统中所有的SQL语句都写到服务器上,然后再把它们组合起来,形成一条完整的链
若采用MSAccess与SQLServer2000,不需要在每一条SQL语句后都用分号,当然有些数据库需要一定要用分号
2:SQLDML和DDL
可将SQL划分为数据操作语言和数据库定义语言两部分
SQL(结构化查询语句)是一种语法,它适合执行查询在通常情况下,SQL是一个用来处理数据的程序代码;而在一些特殊环境中,SQL又能提供对用户输入进行解释和管理的功能。因此,它被广泛地应用到各种应用程序里SQL语言中的数据是由用户定义的,而这些数据又是通过对其进行操作来实现的,因此它可以被用来存储和管理数据,例如删除记录等,同时也提供了一些新的功能以支持各种不同的语法查询与更新组成SQL中DML的一部分:select,update,delete,insertinto数据库定义语言的DDL部分为我们提供了创建或者删除表格的功能。我们还能定义索引(键)、指定表间连接和事假表间限制:
Createdatabase、alertdatabase、createtable、alerttable、droptable、createindex、dropindex.
三、Select
User表上有以下信息
在user表中查询user_name字段以及user_age字段中的全部数据
Selectuser_name,user_agefromuser.
查询user表中所有字段数据并将列名以*形式显示
Choose*fromusers.
四、Distinct
Distinct在选择全部值时,不存在重复数据
使用一般查询查询全部
Choose*fromusers.
Pleaseselectseparateuser_name,user_age.
注:无法存在user_id是因为两个Mary中user_id不同,加起来也算不上是同一个数据
五、Where
1:询问user_id是否等于1
Choose*fromtheuserwhereuser_id=1.
2:查询user_age>;等于12个数据
Select*fromuserwhereuser_age>;=12.
3:查询user_age不是12个数据
Choose*fromtheuserwhereuser_age<;>;12.
六,AND与OR等
And与or将where子语句的两种或两种以上的条件组合这是个很有用的方法,但它有许多缺点。首先是组合困难,其次是不适合处理多条件问题。我们知道:条件可以分为两大类:一是独立存在的;二是相互联系的若要求两条件均成立,则是采用and,若仅要求两条件之一成立,则是or
Pleaseselect*fromtheuserwhereuser_name="mary"anduser_age=12.
应当指出,SQL用单引号包围文本值,若为数值,就无需引号
Select*fromuserwhereuser_name="mary"oruser_age=13.
将and与or相结合,用圆括号构成一个复杂表达式
七、Orderby
1:将规定的列升序排列
Pleaseselect*fromtheuserorderbyuser_name.
2:按user~id的逆顺序
Select*fromuserordersperDESCuser_id.
2:user_id按升序顺序排列
SEEK*FROMuserorderbyuser_idASC,user_ageDESC.
3:user_id按升序顺序排列,user_age
SEEK*FROMuserorderbyuser_ageDESC,user_idASC.
注:条件优先级在前!!
八、Insert
User表
插入一行数据user_id为2user_name为tom,user_age为12
注:若每项内容均插入,则无需前列!!
Insertintouservalues(2,"tom",12)
新增插入行的数据仅需要user_name是eva
Insertintouser(user_name)values("eva")
注:由于ID的设置是自增的,user_id并不是null的
九、Update
修正user_id是6、user_age是14
Updateusersetuser_age=14whereuser_id=6.
修改user_id为1的数据user_name为ann,user_age为11
Updateusersetuser_name="ann",user_age=11whereuser_id=1.
十、Delete
User表的数据信息都是这样的
删去user_age是12的信息
Deletefromuserwhereuser_age=12.
将表格中的数据全部删除
RemovingtheUser
第2章SQL高级教程
一、Top
使用Top子句来返回待返回记录个数,但是并非所有数据库均支持该子句
SQLServer
Selectthetop5*fromthelistofusers.
2:MySQL
ChoosefromUserRestriction5*.
3:TheOracle
Select*fromuserwhereROWNUM<;=5.
二、Like
User表中初始数据是这样
1:查找从li开始的信息
Select*fromuserwhereuser_namelike"li%".
2:查找ry末尾的信息
Select*fromuserwhereuser_namelike"%ry".
3:查找包含a的信息
Select*fromuserwhereuser_namelike"%a%".
4:查找第2个字母为a,第4个字母为y的信息
Select*fromuserwhereuser_namelike"_a_y".
三,通配符
当从数据库查找数据时,SQL通配符可代替一个或者更多字符如果你希望能把查询语句转换成另一种形式,就需要知道它是用什么语言编写的。通常,SQL通配符被用作数据项之间相互转换和连接的工具。但是这种方法并不通用SQL通配符和like运算符是必需的
1:_代替某一字符
查找第2个字母为a,第4个字母为y的信息
Select*fromuserwhereuser_namelike"_a_y".
2:%代替1个以上的字符
找到ry末尾的信息
Select*fromuserwhereuser_namelike"%ry".
3:[]字符列内任何单个字符
查找从a或l开始的信息
Select*fromuserwhereuser_namelike"[al]%".
查找不以a或l为起始点的信息
Select*fromuserwhereuser_namelike"[!al]%".
四,In
只需数据符合in中的条件
发现user_age为12或13个数据
Choose*fromtheuserwheretheuser_agein(12,13)
发现user_name就是Harry,Mary提供了资料
Select*fromuserwhereuser_nameIN("mary","harry")
五、Between
在2个数值间选择数据
查询年龄介于12岁及14岁的资料
Select*fromuserwhereuser_agebetween12-14.
查询字母介于Alice与John间的资料
Select*fromuserwhereuser_namebetween"alice"AND"john".
六、Aliases
规定别名
假定我们的两个表为user与Room每个表都代表一个字母,它们的值在表中对应于相应的数值。如果某个字母出现了变化,那么这个变化就表示该字母被赋予新意义我们把它们分别定为u、r
1:不用别名
Selectroom.room_name,user.user_name,user.user_agefromuser,roomWhereuser.user_age=12androom.room_id=1.
2:用别名
用别名时直接把别名跟着用,不用as就行
Selectr.room_name,u.user_name,u.user_agefromuserasu,roomasrWhereu.user_age=12andr.room_id=1.
七、Join
数据库内各表之间可通过按键进行连接,主键为一列,其中各行取值唯一,而表中各主键取值唯一,从而实现了各表之间数据相互交叉绑定,而无需重复各表全部数据
下面是表user与表Room之间的信息
1:引用2个表格
查找与Roomofboy关联中的用户信息
Selectu.user_name,u.user_age,r.room_namefromuserasu,roomasr.
Whereu.room_id=r.room_idandr.room_name="roomofboy".
2:用关键字join将两个表格联系起来
Selectu.user_name,u.user_age,r.room_name
fromuserasu.
Addtheroomasr.
onu.room_id=r.room_idandr.room_name="roomofboy".
八、Innerjoin
Innerjoin和join的使用是相同的
Selectu.user_name,u.user_age,r.room_name
fromuserasu.
innerjointheroomliker.
onu.room_id=r.room_idandr.room_name="roomofboy".
九、Leftjoin
注:左连接主要是左连接表,即显示左连接表全部数据,而不管其条件是否满足
1:左边是user
Selectu.user_name,u.user_age,r.room_name
fromuserasu.
Leftjoinroomasr.
onu.room_id=r.room_idandr.room_name="roomofboy".
2:左边是Room
Selectu.user_name,u.user_age,r.room_name
Fromroomliker.
Leftjoinuserasu.
onu.room_id=r.room_idandr.room_name="roomofboy".
十、Rightjoin
注:左连接主要由右连接表组成,即列出左连接表全部数据,而不管其条件是否满足
1:右边是Room
Selectu.user_name,u.user_age,r.room_name
fromuserasu.
Rightjoinroomasr.
onu.room_id=r.room_idandr.room_name="roomofboy".
2:user是右
Selectu.user_name,u.user_age,r.room_name
fromthechamberasr.
Adduserutotheright.
onu.room_id=r.room_idandr.room_name="roomofboy".
十一、Fulljoin
1:左边是user
Select*fromtheuser"sfullyconnectedroom.
2:左边是Room
Select*Addusersfromfullrooms.
注:SQL错误码为1054、说明找不到相应字段名,错误码为1064、说明用户在录入SQL语句时存在语法错误
十二,Union
Union操作符是用来将两个或更多SELECT语句结果集合融合在一起
注意UNION内select语句一定要有同样多的一列如果不具备这样的条件,就会导致Select不能正确地显示在屏幕上。为了避免这类错误,你可以用以下方法来解决:首先选择要使用的列。然后再进行排序列的数目是根据不同的数据类型而定的同时每条select语句的列次也要一致
以下为Room表及color表资料
Chooseroom_name.
Unionist
Choosecolor_namefromcolor.
默认union会选择不同的数值,若要出现同一个数值则用unionall
Chooseroom_name.
Unionistall
Choosecolor_namefromcolor.
十三、CreateDB
建立数据库mysqltest
Createdatabasemysqltest
十四、Createtable
Createtablesqltest(
Id.
(45)varchardesignation.
Ageint.
Salaryfloat.
TimeDate,
十五、Constraints
使用SQL约束来约束添加到表中的数据类型
常见约束:notnoll、unique、primarykey、foreignkey、check、default
十六、Notnull
Notnull限制强制列不会接收NULL的值在此情况下,可以通过修改字段名来实现对该格式的转换。由于没有改变字段的长度,因此,这种方法是简单可行的Notnull限制强制字段中总是包含一个数值,即如果没有给字段增加一个数值,则不可能插入一个新字段或更新一条记录
使用方法,字段后加notnull
十七、Unique
Unique限制唯一标识数据库的每个记录Primarykey限制具有自动unique限制这意味着所有的数据都被存储在同一个表中。当我们要访问某个数据库时,只需输入相应的索引文件就可以了。因此,查询效率得到很大提高应该指出,在每一张表中都可能存在多个unique限制,但是只可能存在一个primarykey限制
1:MySQL的使用,unique(字段名)
2:SQLServer、Oracle、MSAccess在字段后面加
3:用constraint进行命名约束
4:在已创建的表格后,需加上约束
THEALTERTABLEsqltestUNIQUEADD(Age)
5:对已建立的表格加上约束和名称
ALTERTABLEsqltestADDconstraintunique_nameUNIQUE(Age,salary)
6:取消约束
SQL
当不命名约束(上age约束)时,直接用字段名
ALTERTABLEsqltestDROPINDEXage.
删去之后
当约束中存在名称时,则直接用名称
ALTERtablesqltestdropindexunique_name.
删去之后
SQLServer、Oracle、MSAccess.
ALTERtable表名dropconstraint约束名
十八、Primarykey
Primarykey限制唯一标识数据库表中的每条记录。组件必须含有唯一值组件列中不可能含有NULL值为了解决这个问题,提出了一种新的基于JAVA语言的可扩展的表结构:在该结构中,js函数是指针,而不是数组;数据元素可以被动态地插入或删除各表应有1个主键且各表只可使用1个
1:使用MySQL
2:在SQLServer、Oracle和MSAccess中的用法
3:对已成功建立的表格建立primarykey限制
ThesqltestAlterarrayaddsaprimary(id)key
4:在已成功创建的表格中加入主键约束并定义若干列
TablesqltestAlteraddconstraintpk_nameprimarykey(id,name)
5:取消MySQL上的主键
ALTERTABLEsqltestDROPPRIMARYKEY.
删去之后
6:在SQLServer、Oracle、MSAccess中撤销主键
Altertable表名dropconstraint主键名
十九、Foreignkey
所谓外键是指一张表上的外键对着另外一张表上主键
User表
Room表
user表中的room_id列是指向Room表中id列的这是因为我们可以将外键分为两类:第一类为合法外键,第二类为非法外键。当外键存在于两个或者多个表中时,我们要注意区分它们的不同情况Room表中id列为主键,user表中room_id列为外键使用外键约束来阻止破坏表间连接的操作。外键约束还可以阻止非法数据被插入到外键列中,因为它必须成为它所指向表的一个值
二十,Check
使用Check约束来约束列的取值范围当需要确定一个或多个表中是否存在有相同值时,Check约束可以被用来解决这个问题。对于一组给定的记录,可以用两个不同的方法来实现Check约束若为单个列定check限制,则改为只能指定一个值若为表定了check限制,则该限制将限制具体列中的值
对已成功创建的表格加上check约束
ALTERTABLEUSERADDCHECK(age>;10)
二十一,Default
使用Default约束将默认值插入列宗中默认值可以是一个或多个数值,但它们都不是固定不变的若未指定其它数值,则在所有新记录中加入默认值
使用方法:
在表格已存在时加入默认值
ALTERTABLEsqltestALTERNAMESETDEFAULT"tom".
取消默认值
二十二、Createindex
索引,您可在表格中建立索引,一面更快、更有效的进行数据查询但对于大多数人来说,索引的建立是一件相当复杂而又困难的事情。因为索引本身并不容易建立。需要花费大量时间和精力才能得到一个完整且正确的索引用户看不到索引,只能用于加快查找,查询速度
注:更新含有索引的表格所需时间要多于更新无索引表格所需时间,而索引本身又要不断更新,所以最理想的情况是只在经常查找到的列上建立索引
1:建立索引
CREATEINDEXindex_nameONcolor(color_id)
2:建立唯一的索引,两行不可能有同一个索引值
INDEXOFCREATEUNIQUEbook_indexONbook(book_id)
3:当索引不只一列时,您可将这些列名置于括号内,并以逗号分隔
INDEXCREATEindex_bankON(bank_id,bank_name)
二十三,Drop
利用DROP语句可删除索引,表,数据库
1:去掉索引
Dropindex_nameovercolor.
删去后
2:删除表格
DROPTABLEcolorcopy
删去后
3:清空表
TRUNCATETABLEcolor
删去后
4:删除数据库
DROPDATABASEmysqltest
删去后
二十四,Alert
1:增加一列
Altertableusersaddpayfloats.
2:删去列子
Altertableuserdropcolumnroom_id.
二十五、Increment
定义主键自增
二十六,维
视图,是根据SQL语句显示结果集的可视化表视图由一组元素组成:行(x,y);列号(t).其中:X代表数据项,Y代表属性值,T表示变量名称。图1为视图实例视图中含有行和列,如同一张真正的表格视图的字段是从一个或者更多数据库的实际表中抽取出来的字段。我们可以在视图上加上SQL函数,where和join语句。我们把数据提交出去,那么这些就从某一张表上抽取出来了应当指出,数据库内的构造与设计不受视图中函数,where,join语句等因素的影响
1:从user表到Room表生成视图的字段
CREATEVIEWview_testAS.
SELECTuser.user_name,user.user_age,room.room_name
FromUser,Room
WHEREuser.user_age>;10
2:查询视图
Select*fromview_test.
3:取消视图
VisionsDROPview_test
二十七,Date
二十八,Nulls
默认情况下,NULL值可存储在表中但是如果表中有一个不支持0的字段名时,我们就需要把它删除。对于这个问题,可以通过修改数据来解决如果表中的某一列是任选的,则当我们不希望对该列进行添加值改列时,就可以插入该记录或对其进行更新,即这个字段用一个NULL值来保存注意NULL与0不相等且无法比较
1:查询NULL值
select*fromtheuserwherethewageiszero.
2:询问非NULL的值
Select*fromtheuserwherethewageisnonzero.
二十九,数据类型
MySQL分为文本,数字和日期3类
三十,服务器
第3章SQL函数
一、SQLfunctions
SQL中,有几种基本函数类型与类型,函数基本类型如下:
合计函数(Aggregatefunction)和Scalar函数
Aggregate函数是指函数操作针对一系列值返回单个值
在Scalar函数中,运算是针对某单个值,根据输入值返回单个值
二、Avg()
求取平均年龄
Chooseavg(user_age)fromtheuser.
求出比平均年龄大的使用者
Select*fromuserwhereuser_age>;(Selectavg(user_age)fromuser)
三、Count()
返回列中值(NULL除外)个数
注:可用as为count()起别名
Selectcount(user_id)fromuser.
Pleaseselectthecount(salary)oftheuser.
返回值多少不等
Selectcount(distinctuser_name)fromuser.
查询全部列项
Selectcount(*)fromuser.
四、Max()
返回的最大值、NULL没有被列入计算
Choosemax(price)asmax_pricefromthecommodity.
五、Min()
返回最小值并将NULL排除于计算之外
Choosemin(salary)poor_manfromtheuser.
六、Sum()
返回列值之和
Selecttheamount(salary)fromtheuser.
七、GroupBy
用于将合计函数组合以将结果集按一个或更多的列分组
SELECTcname,SUM(price)FROMGROUPGROUPcommoditybycname.
八、Having
之所以给SQL添加having子句,是因为where无法配合合计函数但是,如果我们把then,wish等语句也作为一个整体来处理的话,则会得到更简洁的结果。这就是本文要讨论的问题使用方法与where相同
SELECTcname,SUM(price)FROMproduct.
GROUPBYthename
HAVINGSUM(price)>;20
九、Ucase()
将函数字段中的数值变换成大写
SELECTUCASE(user_name)FROMuser.
十、Lcase()
把函数字段变成小写的
Choosethelcase(user_name)oftheuser.
十一,Mid()
对文本字段的字符进行抽取
Choosemid(user_name,2,2)fromtheuser.
十二。Round()
Round函数将数值字段舍分成规定小数位数
Choosetheround(salary,2)oftheuser.
十三,Now(?)
回到当前时刻
SELECTNOW()FROMuser.
例:
在emp表中搜索
select*fromemp
在emp表中搜索sal
choosea.SALofempa
在emp表中搜索ename
choosea.enameofempa
--emp表的sal*10
selecta.SAL*10fromempa
在emp表中,sal为均值
choosingavg(a.sal)ofempa
在emp表中sal之和
choosessum(a.sal)ofempa
--emp表的sal的max
choosesmax(a.sal)ofempa
--emp表的sal的min
choosesmin(a.sal)ofempa
在emp表中sal小于1000时提供资料
select*fromempwheresal<;1000
A信息包含在空格(ename)
chooseenameofempwhereenameas"%A%"
在emp里ename里没有A这个消息
select*fromempwhereenamenotlike"%A%"
系统时间查询
selectsysdatefromduplicate
按计薪资低于5,000者之和
selectsum(sal)fromempwheresal<;5000
按计工资不得超过平均工资
selectsum(sal)fromempwheresal<;(selectavg(sal)fromemp)
按4000以下职工平均工资计
selectavg((selectsum(sal)fromempwheresal<;4000))fromemp
多询问工资在100000以下雇员的名字,以及sal
chooseename,salofempwheresal<;100000
在第20号部门,雇员最高工资与最低工资一起算
selectmax(sal),min(sal)fromempwheredeptno=20
在20号部询问薪水超过1000和所有雇员情况
Choose*fromempwheresal>;1000anddeptno=20
谋求最高工资之雇员之雇员名称及部门名称
selectename,deptno,salfromempwheresal=(selectmax(sal)fromemp)
凡职工工资在5000以下、部门平均工资在1000以上的部门标号,均按照部门平均工资降序排列
selectdeptnofromempwheresal<;5000groupbydeptnohavingavg(sal)>;1000
choosesalfromtheorderempbydescsal
Orderby***desc.
图1查找表emp
select*fromemp
据用户姓名Smiths”找到自己的科室
selectdeptnofromempwhereename="SMITH"
多问各部门最高工资人名
selecte.ename,e.deptno,e.salfrom(selectdeptnoasdid,max(sal)asmfromempgroupbydeptno)s,empe,deptdwheree.sal=s.mands.did=e.deptnoandd.deptno=e.deptno
在询问了Jones”后,第一位入职
select*fromempwherehiredate=(selectmin(hiredate)fromempwherehiredate>;(selecthiredatefromempwhereename="JONES"))
图5、寻找薪资最高部门名称,以及薪资最低部门名称与薪资
selectd.dname,e.salfromempe,deptdwheree.deptno=d.deptnoandsal=(selectmax(m)from(selectdeptno,max(sal)asmfromempegroupbydeptno)s)
unionization
selectd.dname,e.salfromempe,deptdwheree.deptno=d.deptnoandsal=(selectmin(m)from(selectdeptno,min(sal)asmfromempegroupbydeptno)s)
创建表时
Createadeskstudent(
StudentIdnumber(6),--学号
LoginPwdvarchar(20),--密码
StudentNamevarchar(50),--姓名
Sexchar(2),--性别
GradeldNumber(6),--所在年级
Phonenumber(15),--联系电话
Addressvarchar2(255),--现住址
BornDateDate,--出生日期
Emilevarchar2(50)--电子邮件
补充资料
insertintostudentvalues(1001,"123456","赵六","男",1507,120,"成都","23-5月-1995","@10422")
insertintostudentvalues(1002,"123456","王五","女",1507,110,"成都","23-5月-1995","@10422")
insertintostudentvalues(1003,"123456","张三","男",1507,120,"成都","23-5月-1995","@10422")
insertintostudentvalues(1004,"123456","李四","女",1507,110,"成都","23-5月-1995","@10422")
我就递交了
commit
一问这个表格
Choosefromamongstudents*
据情况订正
updatestudentsetstudentname="孙七",loginpwd="666666"wherestudentid=1001
Choosefromamongstudents*
按要求删去
deletefromstudentwherestudentid=1002
Choosefromamongstudents*
字段的添加
ALTERTABLE表名ADD(列名数据类型〔DEFAULT默认值〕、列名数据类型[DEFAUL默认值]、.)
表被删了
droppupilfromtable
图B卷建立了一个表空间
creatingtablespacedatafilemytestspace"e:week3.dbf"size2M
我想建立一个用户
createzhangsanuseridentifiedbyzhangsandefaultmytestspacetablespace.
temporarytablespacetemp
创建人物和授权
createrolefang
grantcreatetabletofang
grantedfanguntozhangsan
grantdbatozhangsan
创建表时
createtableteacher(
tidnumberprimary.
tnamevarchar2(50).
tdatedate.
wordaddressvarchar2(100)
Choosefromamongteachers*
创建序列
createsequenceteachers_sequenceminvalue1maxvalue100(最小值,最大值)cycle(循环)incrementby1(步长值)startwith1(从1开始)
insertintoteachervalues(teachers_sequence.nextval,"小李","01-1月-1999","成都")
insertintoteachervalues(teachers_sequence.nextval,"小张",to_date("1982-1-1","yyyy-mm-dd"),"成都")
面试题目等,希望能对国内一些知名的一线大厂提供一定程度上的学习内容和借鉴作用,做到有备无患通过对这些问题进行深入讨论后,我们可以得出以下结论:SPRing是一种高效的学习方法,它可以帮助你提高学习效率,快速地找到适合自身情况的学习策略最后与您分享Spring系列学习笔记与面试题,内容包括spring面试题,springcloud面试题,springboot面试题,spR教程笔记,spR教程教程笔记,最新阿里巴巴开发手册(63页PDF小结),2022Java面试手册等