Posted on 2009-11-30 14:39
長城 阅读(858)
评论(0) 编辑 收藏
方老师今日讲解数据库入门,主要内容是对数据库操作的SQL语句,仅涉及单表操作。内容虽然枯燥,但也学习了很多知识。
什么是SQL?structred query language(结构化查询语言),在数据库中它是通用的。我之前并未深入使用数据库。对此还有些模糊,但今日的学习让我有了深入了解。其实我也应该早就想到,对数据的一些操作通过SQL语句就可以完成,程序直接拿结果就可以了。
方老师以MySQL5.0数据库,给我们做了讲解。是为了下一课学习JDBC做准备。前面的对数据库的简介和MySQL5.0的安装及配置,我就不写出来了。下面是用户、服务器、数据库和表的关系图:
在配置数据库时选中:,或手动将MySQL安装目录添加到Windows环境变量Path中。使用控制台连接MySQL数据库:mysql –u 用户名 –p 密码。
下面是常用的SQL语句,只针对单表使用,有关语句的具体信息请查询MySQL的手册:
一、数据库相关SQL语句:
1. 创建数据库:
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [create_specification [, create_specification] ...]
其中create_specification是:
[DEFAULT] CHARACTER SET charset_name | [DEFAULT] COLLATE collation_name
例,创建一个名为“ccdb”,字符集为UTF-8的数据库:
create database ccdb character set utf8;
|
2. 查看、删除数据库:
显示数据库:
SHOW CREATE {DATABASE | SCHEMA} db_name
例,查看服务器中所有的数据库:
显示数据库创建语句:
SHOW {DATABASES | SCHEMAS} [LIKE 'pattern']
例,查看创建的“ccdb”数据库的创建语句:
删除数据库:
DROP {DATABASE | SCHEMA} [IF EXISTS] db_name
例,删除创建的数据库“ccdb”:
|
3. 修改数据库:
ALTER {DATABASE | SCHEMA} [db_name] alter_specification [, alter_specification] ...
其中alter_specification是:
[DEFAULT] CHARACTER SET charset_name | [DEFAULT] COLLATE collation_name
例,更改数据库“ccdb”的字符编码为“gbk”:
|
二、数据表相关SQL语句:
1. 创建表:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] [table_options] [select_statement]
或
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(] LIKE old_tbl_name [)];
其中create_definition、table_options等,请查看手册。
例,在数据库“ccdb”中创建一个“user”表:
在创建表之前,必须选择当前库。否则服务器不知道在哪个数据库中创建表,或者当前已经有被选择的其他数据库,就会创建到别的库。
|
MySQL常用数据类型(拿方老师的,嘿嘿):
分类
|
数据类型
|
说明
|
数值类型
|
BIT
TINYINT [UNSIGNED] [ZEROFILL]
BOOL,BOOLEAN
SMALLINT [UNSIGNED] [ZEROFILL]
INT [UNSIGNED] [ZEROFILL]
BIGINT [UNSIGNED] [ZEROFILL]
FLOAT[(M,D)][UNSIGNED] [ZEROFILL]
DOUBLE[(M,D)][UNSIGNED] [ZEROFILL]
|
范围为从1到64。
带符号的范围是-128到127。无符号0到255。
使用0或1表示真或假
2的16次方
2的32次方
2的64次方
M指定长度,d指定小数位数
表示比float精度更大的小数
|
文本类型
|
CHAR(size)
VARCHAR(size)
BLOB LONGBLOB
TEXT LONGTEXT
|
固定长度字符串
可变长度字符串
二进制数据
大文本
|
时间日期
|
DATE/DATETIME/TimeStamp
|
日期类型(YYYY-MM-DD) (YYYY-MM-DD HH:MM:SS),TimeStamp表示时间戳,它可用于自动记录insert、update操作的时间
|
2. 修改表:
ALTER [IGNORE] TABLE tbl_name alter_specification [, alter_specification] ...
其中alter_specification,请查看手册。
修改表“user”名为“userinfo”:
修改表“userinfo”的字符集为“gb2313”,并将字符集校对设置为与“gb2313”相应的校对:
可以在控制台输入:SHOW CHARACTER SET;,列出可用的字符集。也可以在手册中查找“Character sets”,查找手册中的字符集列表。
可以在控制台输入:SHOW COLLATION LIKE 'gb%';,查看以gb开头的所有字符集。
先将表“userinfo”恢复名称为“user”,查看表“user”:
查看表“user”的结构:
添加列“photo”:
修改列“sex”属性-类型为“bit”:
修改列“email”名称为“address”:
删除列“address”:
|
3. 数据库CURD语句:
Insert语句:
INSERT INTO tbl_name (col1,col2) VALUES(15,col1*2);
例,向“user”表中插入一条新数据:
Update语句:
UPDATE tbl_name SET col_name1=expr1 [, col_name2=expr2 ...] [WHERE where_definition]
例,将“sex”为1的人的“name”修改为“changcheng”:
Delete语句:
delete from tbl_name [WHERE where_definition]
例,删除刚才添加的新记录:
如果没有后边的where条件,则删除表中所有的数据。
truncate table tbl_name;是删除表,然后立即创建一个新表。
|
4. Select查询语句(因为它是重点,所以单独拿出来):
1. 基本select语句:
SELECT [DISTINCT] *|{column1, column2. column3..} FROM table;
例,我们新创建了一个sutdent表,查看表中的所有记录:
例,查询表中所有学生姓名和他的数学成绩:
例,过滤表中的重复数据(distinct):
2. 在select语句中可使用表达式对查询的列进行运算:
SELECT *|{column1|expression, column2|expression,..} FROM table;
例,将所有学习的数学加上10分:
例,统计学生的总分:
3. 在select语句中可使用as语句:
SELECT column as 别名 from 表名;
例,修改统计学生总分的列名:
4. 在select语句中加上where条件,进行过滤查询:
例,查询总分大于260分的学生:
5. where经常使用的运算符:
比较运算符
|
> < <= >= = <>
|
大于、小于、大于(小于)等于、不等于
|
BETWEEN ...AND...
|
显示在某一区间的值
|
IN(set)
|
显示在in列表中的值,例:in(100,200)
|
LIKE ‘pattern’
|
模糊查询,Like语句中,% 代表零个或多个字符,_ 代表一个字符,例first_name like ‘_a%’;
|
IS NULL
|
判断是否为空
|
逻辑运算符
|
and
|
多个条件同时成立
|
or
|
多个条件任一成立
|
not
|
不成立,例:where not(salary>100);
|
例,查询数学成绩在80-90之间的学生:
例,查询数据成绩为90、80、78的学生:
例,查询所有名字以“a”开头的学生的数学成绩:
6. 使用order by 子句排序查询结果:
SELECT column1, column2. column3.. FROM table order by column asc|desc
|
5. 合计函数:
1. Count返回满足where子句条件的行的总数:
Select count(*)|count(列名) from tablename [WHERE where_definition]
例,查询共有多少学生:
例,查询总分大于250分的人数:
2. Sum函数返回满足where条件的行的和:
Select sum(列名){,sum(列名)…} from tablename [WHERE where_definition]
注意:sum仅对数值起作用,否则会报错。
例,统计本班数学成绩的平均分:
例,统计各科总成绩:
3. AVG函数返回满足where条件的一列的平均值:
Select avg(列名){,avg(列名)…} from tablename [WHERE where_definition]
例,求数学的平均分:
例,求总平均分:
4. Max/min函数返回满足where条件的一列的最大/最小值:
Select max(列名) from tablename [WHERE where_definition]
例,查询数学成线最高分和最低分:
|
6. 分组与过滤:
1. 使用group by 子句对列进行分组:
SELECT column1, column2. column3.. FROM table group by column
例,按照ID分组并对数据成绩求和:
2. 使用having 子句过滤:
SELECT column1, column2,column3 ... FROM table group by column having ...
Having和where均可实现过滤,但在having可以使用合计函数,having通常跟在group by后,它作用于组。
例,按id分组,查询数学成绩组总和大于100的组:
例,查询数据成绩>=90的学生:
|
7. 时间日期相关函数:
ADDTIME (date2 ,time_interval )
|
将time_interval加到date2
|
CURRENT_DATE ( )
|
当前日期
|
CURRENT_TIME ( )
|
当前时间
|
CURRENT_TIMESTAMP ( )
|
当前时间戳
|
DATE (datetime )
|
返回datetime的日期部分
|
DATE_ADD (date2 , INTERVAL d_value d_type )
|
在date2中加上日期或时间
|
DATE_SUB (date2 , INTERVAL d_value d_type )
|
在date2上减去一个时间
|
DATEDIFF (date1 ,date2 )
|
两个日期差
|
NOW ( )
|
当前时间
|
YEAR|Month|DATE (datetime )
|
年月日
|
8. 字符串相关函数:
CHARSET(str)
|
返回字串字符集
|
CONCAT (string2 [,... ])
|
连接字串
|
INSTR (string ,substring )
|
返回substring在string中出现的位置,没有返回0
|
UCASE (string2 )
|
转换成大写
|
LCASE (string2 )
|
转换成小写
|
LEFT (string2 ,length )
|
从string2中的左边起取length个字符
|
LENGTH (string )
|
string长度
|
REPLACE (str ,search_str ,replace_str )
|
在str中用replace_str替换search_str
|
STRCMP (string1 ,string2 )
|
逐字符比较两字串大小,
|
SUBSTRING (str , position [,length ])
|
从str的position开始,取length个字符
|
LTRIM (string2 ) RTRIM (string2 )
|
去除前端空格或后端空格
|
9. 数学相关函数:
ABS (number2 )
|
绝对值
|
BIN (decimal_number )
|
十进制转二进制
|
CEILING (number2 )
|
向上取整
|
CONV(number2,from_base,to_base)
|
进制转换
|
FLOOR (number2 )
|
向下取整
|
FORMAT (number,decimal_places )
|
保留小数位数
|
HEX (DecimalNumber )
|
转十六进制
|
LEAST (number , number2 [,..])
|
求最小值
|
MOD (numerator ,denominator )
|
求余
|
RAND([seed])
|
RAND([seed])
|
10. 定义表的约束:
1. 定义主键:
Primary key,在预定义主键的列后边加上此属性。
例,创建student表时,将id设为主键:
删除、添加主键属性:
2. 定义非空约束:
not null,在预定义主键的列后边加上此属性:
例,将name列设置为非空:
此时,当向表中添加新数据时,name必须指定值。可以使用“is null”判断某一记录的值是否为空。
3. 定义列值自动增长:
Auto_increment,在预定义主键的列后边加上此属性:
例,定义id为主键且自动增长:
4. 定义外键约束:
这个是今天课程中,唯一涉及到两个表的SQL语句操作。
constraint ordersid_FK foreign key(ordersid) references orders(id),在预定义外键的列后边加上此属性:
例,定义一个classes表,然后再定义一个students表:
创建classes表:
创建students表:
当向students表中添加一条记录时,如果指定的class_id值在classes表中不存在,添加就会失败!如果对应的classes表中的id值被修改了,那么也需要手动修改students表中的class_id值。
|
如果创建库和表,以及对它们的操作过多的话,逐条手动键入SQL语句是一件痛苦的事。SQL的脚本文件(*..sql)可以为我们解决这一难题。Sql文本文件中保存的是我们要手动键入所有的SQL语句,使用source filename语句,导入sql脚本文件。比如:“source C:\test.sql”。
OK,终于搞完了!也当做练习了,不过是按照老方的PPT一步步来的,有点侵权的感觉。不过我想没问题的,老方对此会很高兴的。
SQL语句本身并不复杂,做为程序员并不需要完全掌握数据库。数据库的优化上全由DBA来做。我们需要掌握对数据库的增、删、改、查这些SQL语句即可!
今日的课程没有多深的理论与实践,主要就是讲解SQL语句。同学们学习效果很好!