1SQL语言基础mySqlWord格式文档下载.docx
《1SQL语言基础mySqlWord格式文档下载.docx》由会员分享,可在线阅读,更多相关《1SQL语言基础mySqlWord格式文档下载.docx(21页珍藏版)》请在冰豆网上搜索。
2.插入部分数据:
3.插入一个查询结果:
4.update/Delete语句:
8
1.更新某一列:
2.更新多列:
9
3.删除表数据:
4.清空表:
5.事务支持:
6.Select简单查询:
10
1.简单查询:
2.对结果排序:
7.条件查询11
1.非null查询11
2.in查询:
11
3.模糊查询:
4.andor查询:
12
5.别名查询:
6.聚集查询:
13
7.常用函数查询:
14
8.分组查询:
9.使用子(组合)查询:
15
1.子查询示例1:
2.子查询示例2:
16
3.外连结查询:
10.sql语言总结:
17
1.sql语句分类:
1.根据性质分类:
2.根据操作对象分类:
2.sql数据类型和关键字:
18
1.sql的数据类型18
2.sql关键字:
19
总结和任务:
一行好SQL,胜过万行程序!
我们以mysql5.0为例,安装好后,从命令行登陆mysql:
在命令行输入mysql–u用户名–p
然后根据提示输入密码,即登陆数据库:
登陆后,可以用showdatabases查看数据库中有哪些库:
其中的:
information_schema
mysql
test
这三个库是mysql安装后自带的,接下来,我们要创建自己的数据库来使用:
OK,我们自己创建的数据库名为netjavablog;
要使用这个数据库,还必须再执行如下命令:
表示我们当前要使用的数据库是netjavaBlog。
OK,准备工作完毕,接下来开始练习sql语句:
如创建用户信息表:
创建成功后,显示表结构:
更新表的定义,使用ALTERTABLE命令:
给表中增加一列:
删除表中一列:
删除整个表:
约束(constraint):
定义插入或处理数据库数据的规则。
主键所在列值是唯一的,用以唯一标识表中的一行数据。
例如,我们定义了BlogInfo表:
然后,修改这个表的id列为主键:
特别注意的是:
主键列必须保持唯一,在本例中,id的值需要由插入程序保证其唯一性----而不是依赖与数据库的自增长字段实现。
外键也是表中的一列,但其值必须在另外一个表的列中存在,外键用以保证表数据引用的完整性。
如果B表的b.aid列引用了A表的id做为外建,A表的id必须是A表的主键。
例如我们创建一个bloginfo表,用以保存用户所发表的日志信息----每一条日志记录都必须对应于userinfo表的一个用户的id.
创建bloginfo表如下:
给bloginfo表的id_user列加上对userinfo表的id列的外键引用:
以上语句执行后,就会bloginfo表加上了一个名为fk_bloginfo_uid的外健引用约束;
并且设定了级联删除---当从userinfo表中删除一个用户时,此用户id对应的在bloginfo表中的记录都会delete!
要取消这个约束,只需执行如下语句即可:
注意:
在mysql中,外键必须是其所在表中的主键且自增长,且引用双方的数据类型必须相同!
唯一性约束用以保证表中的一列(或一组列)数据的唯一性,类似于主键,但于主键有如下区别:
1.一个表只能有一个主键,但可有多个约束;
2.唯一约束列中可含有Null值;
3.唯一约束不能被定义为外键引用;
例如,在用户表中,所有的用户名字应是唯一的:
执行如上语句,就给userinfo表的name列加上了一个名为index_unique的唯一性约束,数据库在检查这个约束时使用HASH算法。
要取消此约束:
索引在数据库中用以加快搜索和排序的速度---如果你查过字典的话;
前面我们创建的主键,唯一约束都是一种索引;
索引可以提升查询速度,这并不意味着表中的索引越多越好,对于插入量大的表,建过多的索引显然不是合适的做法;
如果要经常根据表中某个字段查询,就可以给它建上索引。
以上语句,就给bloginfo表的title列加上了名字index_title的索引,算法使用Btree算法;
如果要取消,执行如下语句:
现在的Userinfo表结构如下:
向表中插入数据,要使用Insert语句,格式为:
Insertinto表名(列名1,列名2,…)values(值1,值2,…)
插入时我们并没有写id列名和值,这个列值是由数据库自增长生成的,所以不需要写。
Userinfo表中的descre列充许不插入值,在sql插入数据时,就可以插入部分数据,如:
但如不插入name列的值,就会出错,因为name列中数据库中设定的是非空约束。
同样,也不能插入重复name列的值,你试下?
可以将另一个select的结果集插入到一张表中,例如数据库中temUser表结构如下:
其中插入了如下值:
要想把temuser中这三个列的所有值插入(复制)到userinfo表中,就可以使用如下语句:
temuser和Userinfo表的三个字段名并不需要一致,但数据类型必须相同!
Truncate与delete的区别是:
前者是物理删除,不支持事务!
即删掉的数据是无法恢复的!
所以在使用truncate时,要特别注意!
事务是指一组sql语句的执行,要么全部成功,要么全部失败!
开启事务,在mysql中使用如下命令:
在此行后执行的sql(对表的CRUD)操作,都只是对当前用户可见,并没有物理的写入数据库。
连结执行多条sql后,再执行如下语句,即所有操作生效:
如果执行中出错或要撒消以前(在starttransaction后)的sql操作,可以使用如下命令让数据恢复到事务开启前状态:
请完成对事务命令使用的测试。
查询时,使用*会返回所有列,当然,你也可以如上示例,指定需要的列。
Orderby列名desc|asc会对结果集进行升序或降序排列,如果要排列的列是字符串呢?
7.条件查询
Select语句后可以跟where子句指定查询条件,where条件中可以指定如下操作符:
说明
关键字
多重条件
And、or
比较条件
=、>
、<
、!
=、!
>
<
、not+比较条件
是否在某一范围
In(<
可选值集>
)、notin(<
)
是否空值
Isnull:
某列为null时为真,isnotnull:
某列非空时为真
模糊匹配
Like‘%/_<
字符串>
’,
%模糊匹配任意内容,例:
a%b表示以a开头,以b结尾的任意长度的字符串。
如acb,addgb,ab等都满足该匹配串;
_模糊匹配某一个字符,例:
a_b表示以a开头,以b结尾的长度为3的任意字符串。
如acb,afb等都满足该匹配串。
当用户要查询的字符串本身就含有%或_时,要使用ESCAPE'
换码字符>
'
短语对通配符进行转义。
1.非null查询
查询userinfo表中所有descre非null的行:
查询所有age为21,22,23的行:
查询所有name列值以三个字符结尾,且前面两个为et的:
如下示例:
查询时,可以为列或列指定别名,如下示例:
在查询时,根据业务需要使用统计函数,可以大大提高效率,一般数据库除了有自己内置的函数外,都支持如下六个常用函数:
函数名
用途
COUNT(*)
计算总行数
SUM(列名)
计算某例值的总和
AVG(列名)
计算某例值的平均值
MAX(列名)
查找某例值的最大值
MIN(列名)
查找某例值的最小值
DISTINCT(列名)
不显示列值重复的行
例如:
查找post表中记录个数:
注意,count统计的是所有行数,不能再同时查询其它列值。
查找pageview最大的的记录:
统计平均viewcount的值:
统计keyword列不重复的有多少行:
函数查询会因数据库而异,具体请参考各数据库说明手册,如下示例:
将name列转为大写:
分组查询可将结果集分成指定的逻辑组,以生成类似报表方式的统计结果,本例中,我们使到到bloginfo表,结构如下:
其中的id_user引用了userinfo表的id做主键;
如果要根据用户id对用户发文张的数量进行排序---即统计用户发文张的排行榜,使用如下语句:
如果要根据用户的名字,进行分组查询,那就要使用到联合查询:
特别注意:
分组查询是最为常用的,最能提升程序效率的一种查询方式,请多多思考,多多练习。
子查询是指多个查询嵌套在一起的查询,这样可以将库中的多个表结合起来得到我们所要的某一查询结果,在示例之前,我们还需要在库中创建一张表,用以存放其它用户对某个用户的文张评论内容的表,即replyInfo表:
其中的id_user引用Userinfo表的id做外键,代表是哪个用户回复的;
Id_blog引用bloginfo表的id做外键,代表是回复的哪篇文张。
查询所有年令在20和25之间的用户的文张:
查询所有年令在20和25之间的用户的回复的id和文张标题,文张用户名:
如查询所有回复用户的名字,回复的内容和用户id,就要连结Replyinfo和Userinfo两个表:
如上示例的为左连结(leftjoin),如果你喜欢,也可以用右连结:
rightouterjoin;
数据库相关的操作都可以通过sql语句完成,sql语句根据其性质可以分为如下几类:
SQL功能
核心动词
数据库定义
CREATE,DROP,ALTER
创建/修改数据库对象,如表,用户,序列、索引、主外键等。
数据查询
SELECT
执行数据查询,
数据操作
INSERT,UPDATE,DELETE
增、删、改操作
数据控制
BRANT,REVOKE
用户权限控制
对于结构查询语言(有时称S