一、MYSQL的安装
1、打开下载的mysql安装文件mysql-5.0.27-win32.zip,双击解压缩,运行“setup.exe”。
![]()
2、选择安装类型,有“Typical(默认)”、“Complete(完全)”、“Custom(用户自定义)”三个选项,选择“Custom”,按“next”键继续。
![]()
3、在“Developer Components(开发者部分)”上左键单击,选择“This feature,
and all subfeatures, will be installed on local hard drive.”,即“此部分,及下属子部分内容,全部安装在本地硬盘上”。在上面的“MySQL Server(mysql服务器)”、“Client Programs(mysql客户端程序)”、“Documentation(文档)”也如此操作,以保证安装所有文件。点选“Change...”,手动指定安装目录。
![]()
4、填上安装目录,我的是“F:\Server\MySQL\MySQL Server 5.0”,也建议不要放在与操作系统同一分区,这样可以防止系统备份还原的时候,数据被清空。按“OK”继续。
![]()
确认一下先前的设置,如果有误,按“Back”返回重做。按“Install”开始安装。
![]()
5、正在安装中,请稍候,直到出现下面的界面
![]()
这里是询问你是否要注册一个mysql.com的账号,或是使用已有的账号登陆mysql.com,一般不需要了,点选“Skip Sign-Up”,按“Next”略过此步骤。继续则完成MYSQL的安装。
二、MYSQL的配置
1、安装完成了,出现如下界面将进入mysql配置向导。
![]()
2、选择配置方式,“Detailed Configuration(手动精确配置)”、“Standard Configuration(标准配置)”,我们选择“Detailed Configuration”,方便熟悉配置过程。
![]()
3、选择服务器类型,“Developer Machine(开发测试类,mysql占用很少资源)”、“Server Machine(服务器类型,mysql占用较多资源)”、“Dedicated MySQL Server Machine(专门的数据库服务器,mysql占用所有可用资源)”
![]()
4、选择mysql数据库的大致用途,“Multifunctional Database(通用多功能型,好)”、“Transactional Database Only(服务器类型,专注于事务处理,一般)”、“Non-Transactional Database Only(非事务处理型,较简单,主要做一些监控、记数用,对MyISAM数据类型的支持仅限于non-transactional),按“Next”继续。
![]()
5、选择网站并发连接数,同时连接的数目,“Decision Support(DSS)/OLAP(20个左右)”、“Online Transaction Processing(OLTP)(500个左右)”、“Manual Setting(手动设置,自己输一个数)”
![]()
6、是否启用TCP/IP连接,设定端口,如果不启用,就只能在自己的机器上访问mysql数据库了,在这个页面上,您还可以选择“启用标准模式”(Enable Strict Mode),这样MySQL就不会允许细小的语法错误。如果是新手,建议您取消标准模式以减少麻烦。但熟悉MySQL以后,尽量使用标准模式,因为它可以降低有害数据进入数据库的可能性。按“Next”继续
![]()
7、就是对mysql默认数据库语言编码进行设置(重要),一般选UTF-8,按 “Next”继续。
![]()
8、选择是否将mysql安装为windows服务,还可以指定Service Name(服务标识名称),是否将mysql的bin目录加入到Windows PATH(加入后,就可以直接使用bin下的文件,而不用指出目录名,比如连接,“mysql.exe -uusername -ppassword;”就可以了,不用指出mysql.exe的完整地址,很方便),我这里全部打上了勾,Service Name不变。按“Next”继续。
![]()
9、询问是否要修改默认root用户(超级管理)的密码。“Enable root access from remote machines(是否允许root用户在其它的机器上登陆,如果要安全,就不要勾上,如果要方便,就勾上它)”。最后“Create An Anonymous Account(新建一个匿名用户,匿名用户可以连接数据库,不能操作数据,包括查询)”,一般就不用勾了,设置完毕,按“Next”继续。(注意在测试时都用户名和密码都改成root)
![]()
10、确认设置无误,按“Execute”使设置生效,即完成MYSQL的安装和配置。
![]()
注意:设置完毕,按“Finish”后有一个比较常见的错误,就是不能“Start service”,一般出现在以前有安装mysql的服务器上,解决的办法,先保证以前安装的mysql服务器彻底卸载掉了;不行的话,检查是否按上面一步所说,之前的密码是否有修改,照上面的操作;如果依然不行,将mysql安装目录下的data文件夹备份,然后删除,在安装完成后,将安装生成的 data文件夹删除,备份的data文件夹移回来,再重启mysql服务就可以了,这种情况下,可能需要将数据库检查一下,然后修复一次,防止数据出错。
进入MySql
mysql -u用户名 -p密码(当然为了不让别人看见你的密码,需要换行隐式输出)
![]()
验证MySql是否安装成功
![]()
我们可以通过命令 \s查看当前mysql的信息
![]()
二、数据库服务器、数据库和表的关系
l所谓安装数据库服务器,只是在机器上装了一个数据库管理程序,这个管理程序可以管理多个数据库,一般开发人员会针对每一个应用创建一个数据库。
l为保存应用中实体的数据,一般会在数据库创建多个表,以保存程序中实体的数据。
l数据库服务器、数据库和表的关系如图所示:
数据在数据库中的存储方式
三、创建数据库
3.1创建数据库
![]()
lCHARACTER SET:指定数据库采用的字符集
lCOLLATE:指定数据库字符集的比较方式
l练习:
•创建一个名称为mydb1的数据库。
•创建一个使用utf-8字符集的mydb2数据库。
•创建一个使用utf-8字符集,并带校对规则的mydb3数据库。
(1)创建一个名字为mydb1的数据库
create database if not exists mydb1;
![]()
(2)创建一个使用utf-8字符集的mydb2数据库。(注意在安装Mysql时已经指定了字符集为utf-8,这里指定的字符集是为单个项目指定字符集)
create database if not exists mydb2 character set utf8;(注意不是utf-8)
![]()
验证创建是否成功
show databases;
![]()
(3)创建一个使用utf-8字符集,并带校对规则的mydb3数据库
在MYSQL 5.1参考手册中此处有对字符集校对规则由说明
![]()
所谓的校对规则就是数据库中的排序规则,这个规则需要查Mysql参考手册,mysql中有很多种校对规则,并且utf-8也有很多种校对规则,但是我们通常用缺省的校对规则
这里是每一种字符集的默认校对规则
![]()
当然我们还可以详细查看UTF-8的所有校对规则
![]()
create database if not exists mydb3 character set utf8 collate utf8_general_ci;
![]()
查看一下
![]()
3.2查看、删除数据库
![]()
l练习:
•查看当前数据库服务器中的所有数据库
•查看前面创建的mydb2数据库的定义信息
•删除前面创建的mydb1数据库
(1)查看当前数据库服务器中的所有数据库(不说了)
(2)查看某个创建库的细节(这里可以看见这个库的字符集是什么)
show create database 创建库的名称
例如:show create database mydb1;
![]()
(3)删除前面创建的mydb1数据库
drop database mydb1;
当然还可以这样
dorp database if exists mydb1;
![]()
3.3修改、备份、恢复数据库(注意修改只能修改字符集或者是校对规则,不能修改数据库的名称)
![]()
l备份数据库表中的数据
mysqldump -u 用户名 -p 数据库名 > 文件名.sql
l恢复数据库
Source 文件名.sql
l练习
l 查看服务器中的数据库,并把其中某一个库的字符集修改为GB2312;
l备份test库中的数据,并恢复
(1)查看服务器中的数据库,并把其中某一个库的字符集修改为GB2312;
alter database mydb2 character set gb2312;
查看一下这个库的信息
![]()
(2)备份库中的数据,并恢复
第一步:创建一个库,并创建一张表
create database t;
use t;
create table a
(
id int
);
insert into a(id) values(1);
![]()
第二步:备份数据库
mysqldump -uroot -p t>c:\t.sql (注意这个不是一个SQL命令,它是一个window命令,所以这里需要退出mysql在cmd中执行这个命令。所以这里结尾不要加分号)(把t数据库中的数据搞到c:\t.sql文件中去)
![]()
此时在c盘中就有一个t.sql的备份文件,这个时候我们就可以放心大胆进入mysql删除原有的数据库了
![]()
然后我们开恢复数据库(注意恢复只能恢复数据,不能恢复数据库的,也就是说只能恢复表,不能恢复数据库,所以我们必须先创建出数据库)
这里有两种恢复方式
第一种恢复数据库的方式
create database t;//创建一个t数据库
use t; //进入数据库
source c:\t.sql //恢复数据,注意不要跟分号
![]()
查看一下
![]()
第二种恢复数据库的方式
mysql -uroot -proot t<c:\t.sql //这个意思是将c:\t.sql中的数据导入到t数据库中去,(注意这个也是一个windows命令,需要退出mysql执行,还要注意一点在导入数据之前,数据库t必须先存在)
![]()
进入mysql查看一下
![]()
![]()
在实际开发中第二种是最常用的,第一种只是将备份的sql脚本再执行了一次而已
四、创建表(基本语句)
![]()
l注意:创建表时,要根据需保存的数据创建相应的列,并根据数据的类型定义相应的列类型。例:user对象
id int
name string
password string
birthday date
4.1MySQL常用数据类型
![]()
BIT(M)这个数据类型只能保存二进制的0和1,其中的M表示能够保存多少位0和1,最多可以保存64位,也就是2的64次方,如果没有指定则是1
TINYINT[UNSIGNED][ZEROFILL]范围是-128到127,无符号则是0到255,后面的UNSIGNED和ZEROFILL都是表示无符号
BOOL,BOOLEAN 布尔值使用0或者1表示真或假,当然也可以用BIT(1)来表示布尔值,因为当bit(1)时只能存0或者1
SMALLINT[UNSIGNED][ZEROFILL] 2的16次方,对应java中的short
INT[UNSIGNED][ZEROFILL] 2的32次方,对应java中的int
BIGINT[UNSIGNED][ZEROFILL] 2的64次方,对应java中的long
FLOAT(M,D)[UNDIGNED][ZEROFILL] M表示显示长度,D指定小数位数
DOUBLE(M,D)[UNSIGNED][ZEROFILL] M指定显示长度,D指定小数位数
Decimal(M,D) 定点数,存储货币等精度要求高的数据(注意这里这个存储货币不能用FLOAT和DOUBLE,不然又可能丢失数据,原因是FLOAT超出8位就会丢失精度,DOUBLE超出16位也会丢失精度,所以存储货币必须用Decimal,比如下面这个例子)
![]()
CHAR(size) 固定长度的字符串,例如char(20),只能是20个字符,所谓固定长度就是哪怕你输入的字符哪怕不满20字符也按照20字符计算,还有一点实际上char最大可以保存255个字符
VARCHAR(size) 可变长度字符串,例如varchar(20),这个是可变长度,所谓可变长度就是你输入几个字符就是几个字符,最多可以输入20个字符,所以开发中大量使用varchar,因为省空间,而且实际上可以保存65535个字符,
TEXT(clob) 存储大文本,而且TEXT还分几种TEXT(在oracle中是clob,而不是TEXT )
有TINYTEXT(2的8次方个字符,也就是255个字节),
TEXT(2的16次方,也就是64K的数据,2的10次方在乘以2的6次方64,2的10次方就是1k,所以是64k的字符),
MEDIUMTEXT(2的24次方,也就是16M的数据,2的10次方为1K,再乘以2的10次方就是1M,1M在乘以2的4次方就是16M),
LONGTEXT(2的32次方,也就是可以存储4个G的数据)
BLOB,LONGBLOB 存储二进制数据的,比如电影或者是照片,根据二进制数据的大小可以选择BLOB的类型
TINYBLOB(2的8次方,256个字节)
BLOB(2的16次方,也就是64K)
MEDIUMBLOB(2的24次方,也就是16M,2的10次方为1K,1K在乘以2的10次方为1M,1M在乘以2的4次方就是16M)
LONGBLOB(2的32次方,也就是4G,可以存电影)
另外可以时间有三种
DATE/DATETIME/TimeStamp //DATE只能保存日期,DATETIME只能保存日期和时间,TimeStamp只能保存当前的时间戳
VARCHAR、BLOB和TEXT类是变长类型。每个类型的存储需求取决于列值的实际长度。
4.2创建表练习
create table employee
(
id int,
nam varchar(20),
sex char(4) //对于性别可以用boolean也可以用bit(1),这里考虑到泰国所以用char(4)
birthday date,
entry_date date,
job varchar(40), //对于职位的名称有很多种,这里用变长长度字符串
salary decimal(10,2), //对于薪水必须用decimal,不要用float或者double,因为怕丢失精度
resume text //简历用text,text大小时64k,足够装下任何简历了,这里还要注意一点,在设计表的最后一列不要加,号了,不然要报错
);
![]()
并且在创建表示可以指定字符集和校对规则
create table employee
(
id int,
name varchar(20),
sex char(4),
birthday date,
entry_date date,
job varchar(40),
salary decimal(10,2),
resume text
)character set utf8 collate utf8_general_ci;
查看一下这个表,可以将表的一些创建细节显示出来
show create table employee;
![]()
这里要区分一下
show tables; //这个是查看库中所有表
![]()
show create table employee; //这个是查看表的创建细节
desc employee; //查看表的结构
![]()
4.3修改表
使用 ALTER TABLE 语句追加, 修改, 或删除列的语法.
![]()
修改表的名称:Rename table 表名 to 新表名
修改表的字符集:alter table student character set utf8;
(1)为上一表增加一个大头贴image,照片用blob这个类型
alter table employee add image blob;
![]()
查看增加表结构
desc employee;
![]()
查看表更为详细的信息(这里可以看见字符集等等信息)
show create database mydb3; //这个是查看库的创建信息
show create table employee; //这个是查看表的创建信息
![]()
(2)将employee表中的job列改为varchar(60)
alter table employee modify job varchar(60);
![]()
查看一下
desc employee;
![]()
(3)删除sex列
alter table employee drop sex;
![]()
查看一下
![]()
(4)修改表名(将employee 改为 users)(注意mysql中数据库名不可以改,但是表名可以改)
rename table employee to users;
![]()
查看一下,employee表已经不存在,存在的只是user这个表
![]()
(5)查看数据库中所有的表
show database; //是显示Mysql中有多少个库
show tables; //查看这个库下有多少表
![]()
(6)修改表的字符集为gb2312
alter table users character set gb2312;
![]()
查看一下这个表的字符集
show create table users;
![]()
(7)修改表中的列的名称(将name修改成username)
alter table users change column name username varchar(40);
![]()
查看一下
desc users;
![]()
(8)删除某个数据库下的某个表
查看一下这个数据库下有多少张表
![]()
删除某个表
drop database xxx; //是删除某个库
drop table a; //删除a这个表
![]()
最后还要注意一下在创建表时,如果打了单引号则会出现结束不来的情况,这是因为,MYSQL任务你自从你打引号开始就是一个字符串,所以结束不了
要想结束,就必须用单引号结束,然后加分号结束
![]()
当然在这种情况下也可以用\c退出
![]()
五、数据库CRUD语句
lInsert语句 (增加数据)
lUpdate语句 (更新数据)
lDelete语句 (删除数据)
lSelect语句 (查找数据)
(1)查看当前操作的是那个库
\s; //这个命令显示当前系统的状态
(2)使用 INSERT 语句向表中插入数据
![]()
l插入的数据应与字段的数据类型相同。
l数据的大小应在列的规定范围内,例如:不能将一个长度为80的字符串加入到长度为40的列中。
l在values中列出的数据位置必须与被加入的列的排列位置相对应。
l字符和日期型数据应包含在单引号中。
l插入空值,不指定或insert into table value(null)
Insert语句练习
l练习:使用insert语句向表中插入三个员工的信息。
![]()
l注意:字符和日期要包含在单引号中。
lshow variables like 'character%';
lset character_set_results=gbk;
代码:
insert into users(id,username,birthday,entry_date,job,salary,resume) values(1,'aa','1980-09-09','1980-09-09','aaa','1000.00','aaaa');
//注意字符串和时间都要加单引号'',如果没有添加数据的则值是null
![]()
查看一下表中的信息
select * from users;
![]()
插入数据的小细节:
(1)在插入时间或则是字符串时都需要加'',其实不管值是什么类型都可以用''引起来,系统会自动转换的,这样可以避免一些问题,例如:
insert into users(id,username,birthday,entry_date,job,salary,resume) values('2','aa','1980-09-09','1980-09-09','aaa','1000.00','aaaa');
![]()
(2)再插入数据的时候可以不指定字段的名称,但是给值时需要和字段的顺序一致,但是这种命令开发中不要用,因为在开发中并不明确你是在哪些字段赋值,
例如:
insert into users values('3','1980-09-08','1980-09-09','aaa','1000.00','aaaa');
![]()
提示错误,因为image这行没有数据,我们只好将image这个字段删除
alter table users drop image;
![]()
然会在插入数据
insert into users values('3','1980-09-08','1980-09-09','aaa','1000.00','aaaa');
![]()
成功插入,查看一下
![]()
(3)插入中文数据
insert into users(id,username,birthday,entry_date,job,salary,resume) values('4','令冲','1980-09-09','19080-09-09','aaa','1000.00','aaaa');
![]()
查看一下发现表中的中文字符为乱码
![]()
然后我们去查看一下系统的所有字符集编码
show variables likes 'character%';
![]()
我们发现客户端要的字符集character_set_client是utf8,回显的是字符集character_set_results也是utf8,然而我们给的中文数据却是gb2312,所以出现了乱码
解决中文字符乱码的问题
要解决中文字符乱码的问题需要设置两个字符集,一客户端character_set_client的字符集为gb2312,二回显character_set_results的字符集gb2312,还需要明白我们输入中文是输入的gb2312的数据
当我们在cmd窗口中输入中文数据时,此时是输入的是gb2312字符集,然后mysl拿着这个gb2312数据向utf-8表中存,结果就会产生乱码,产生乱码就会导致
数据太长存不下去,即使存下去也会是???这种乱码,这个时候我们要解决这个问题,就必须通知mysql,说我这个客户端是gb2312字符集,这个时候mysql
读取到了gb2312字符集的中文时就会去查找gb2312字符集,查到对应的字符集数字之后mysql再把数据转成utf-8的数据存入mysql中
在查询数据时,表中存入的数据时utf-8的数据,但是当前的命令行是gb2312的字符集,所以在查询数据是也会出现非???类型的乱码问题,这个时候我们
就必须通知mysql,要求mysql在将数据库中utf-8的数据取出来的时候,转成gb2312,这样我们才能解决这个问题
set character_set_client=gb2312; //告诉mysql客户端要采用gb2312字符集(注意我们本地输入的字符也是gb2312),然后mysql会去查询gb2312字符集,查出对应的编码,然后转成utf-8存入到mysql
![]()
然后我们又将回显的字符编码设置成gb2312,这个时候中文数据显示正常
set character_set_results=gb2312; //这个回显
![]()
综上所述,解决中文乱码问题需要将客户端character_set_client的字符集和回显character_set_result的字符集设置成gb2312,但是很不幸的是这个设置只能在当前的mysql有效,如果需要永远有效就必须设置MySql配置文件,在MySql目录中的配置文件my.ini中,将客户端修改成gb2312
![]()
之后我们可以查询一下
show variables likes "character";
![]()
但是不建议修改这个,因为在以后的开发中我们会直接用UTF-8的编码
最后对于字符编码的问题需要多加查资料,对于里面的转换有一些麻烦
5.2Update语句
l使用 update语句修改表中数据。
lUPDATE语法可以用新值更新原有表行中的各列。
lSET子句指示要修改哪些列和要给予哪些值。
lWHERE子句指定应更新哪些行。如没有WHERE子句,则更新所有的行。
Update语句练习
(1)将员工的薪水改为5000
update users set salary=5000;
查看一下
(2)将aa的薪水改为3000
update users set salary=3000 where username='aa'; //注意凡是字符串的药加单引号
(3)将名为cc的员工薪水改为4000,job改为ccc
update users set salary=4000,job='ccc' where username='cc';
(4)将令冲的工资在原来的基础上加1000
update users set salary=salary+1000 where username='令冲';
千万注意在做开发的时候修改某个数据一定要加上where这个限定条件,不然就是会将数据库中所有的数据修改了,那是很惨的事情,所以在修改数据的时候一上来就将where条件写好在写前面的数据,这样才能避免悲剧发生
5.3Delete语句
使用 delete语句删除表中数据
l如果不使用where子句,将删除表中所有数据。
lDelete语句不能删除某一列的值(可使用update)
l使用delete语句仅删除记录,不删除表本身。如要删除表,使用drop table语句。
l同insert和update一样,从一个表中删除记录将引起其它表的参照完整性问题,在修改数据库数据时,头脑中应该始终不要忘记这个潜在的问题。(也就是说表与表之间有互相应用的时候,如果要删除这些表,首先必须去掉它们之间的引用关系,不然删不掉)
删除表中数据也可使用TRUNCATE TABLE 语句,它和delete有所不同,参看mysql文档(TRUNCATE TABLE 是摧毁表中的所有数据,delete是一行一行的删除数据,所以当要删除数据量大的表的时候就可以用TRUNCATE TABLE去删除所有数据)
Delete语句练习
(1)删除表中???的记录
delete from users where username='???';
(2)删除表中所有记录
delete from users; 或者用 truncate table users //这个就不做了,一个是删除表所有的数据,一个是摧毁表,还是搞一下吧
5.4Select语句(1)(查询语句很难的,主要是表之间的关系比较麻烦,查询语句是数据库中的最难学的),但是这个笔试题很重,多重查询需要好好去学
lSelect 指定查询哪些列的数据。
lcolumn指定列名。
l*号代表查询所有列。
lFrom指定查询哪张表。
lDISTINCT可选,指显示结果时,是否剔除重复数据
l练习:
l查询表中所有学生的信息。
l查询表中所有学生的姓名和对应的英语成绩。
l过滤表中重复数据。
开始已将删除表了,现在我们从外部导入一张student的表
source c:\student.sql //注意没有分号
查询一下表的内容
现在开始做练习
(1)查询表中所有学生的信息
select * from student;
(2)
l查询表中所有学生的姓名和对应的英语成绩。
select name,english from student;
(3)
过滤表中重复数据。(将两个数学成绩都为90的过滤掉)
select distinct math from student; //这句话会将math中的重复数据过滤掉
但是这个要注意一下,如果你的代码如下
select distinct name,math from student; //这句话的意思是只有name中有相同的数据并且对应的math中也有相同的数据才会过滤,
Select语句(2)
(4)
在select语句中可使用表达式对查询的列进行运算
(5)在select语句中可使用as语句为列做别名
l练习
l在所有学生分数上加10分特长分。
l统计每个学生的总分。
l使用别名表示学生分数。
(1)在所有学生分数上加10分特长分。
select name,(chinese+english+math)+10 from student; //注意哈这个加的10分并没有改变数据库中的值,只是在显示中加了10
(2)
统计每个学生的总分。
select name,(chinese+english+math) from student;
(3)使用别名表示学生分数
select name as 姓名,(chinese+english+math) as 总分 from student;
当然取别名不用as也可以
select name 姓名,(chinese+english+math) 总分 from student;
Select语句(3)
l使用where子句,进行过滤查询。练习:
l查询姓名为wu的学生成绩
l查询英语成绩大于90分的同学
l查询总分大于200分的所有同学
(1)查询姓名为王五的学生成绩
select * from student where name='王五';
(2)查询英语成绩大于90分的同学
select * from student where english>'90';
(3)l查询总分大于200分的所有同学
select * from student where (math+english+chinese)>200;
Select语句(4)
Like语句中,% 代表零个或多个任意字符,_ 代表一个字符,例first_name like ‘_a%’;
l查询英语分数在 80-90之间的同学。
l查询数学分数为89,90,91的同学。
l查询所有姓李的学生成绩。
l查询数学分>80,语文分>80的同学。
(1)查询英语分数在 80-90之间的同学。
select * from student where english>80 and english<90;
![]()
或者用
select * from student where english between 80 and 90;
![]()
验证一下select * from student where english between 80 and 90;这句话包含80分吗
先将表中的id为1的英语成绩设置成80
update student set english=88 where id=1;
![]()
![]()
![]()
再来测试一下 select * from student where english between 80 and 90; //结果包含80
![]()
(2)查询数学分数为89,90,91的同学。
select * from student where math=89 or math =90 or math=91;
或者
select * from student where math in(89,90,91);
![]()
(3)查询所有姓李的学生成绩。
select * from student where name like '李%'; //%表示0个或者多个字符,_表示一个字符
![]()
select * from student where name like '李_';
![]()
(4)
查询数学分>80,语文分>80的同学。
select * from student where math>80 and chinese>80;
Select语句(5)
使用order by 子句排序查询结果
lOrder by 指定排序的列,排序的列即可是表中的列名,也可以是select 语句后指定的列名。
lAsc升序、Desc降序
lORDER BY 子句应位于SELECT语句的结尾。
l练习:
l对数学成绩排序后输出。
l对总分排序后输出,然后再按从高到低的顺序输出
对姓李的学生成绩排序输出
(1)对数学成绩排序后输出。
select name,math from student order by math;
(2)对总分排序后输出,然后再按从高到低的顺序输出
select name,(chinese+math+english) from student order by (chinese+math+english) desc;
(3)
对姓李的学生成绩排序输出
select * from student where name like '李%' order by (chinese+math+english) desc;
处理如何退出的问题,有些时候输入错误,但是却退不出来,这个时候要用到\c退出错误
Select语句(6)
(1)合计函数-count
l练习:
l统计一个班级共有多少学生?
l统计数学成绩大于90的学生有多少个?
l统计总分大于250的人数有多少?
(1)统计一个班级共有多少学生?
select count(*) from student; //count()函数统计表中的总数的
当然也可以这样写,但是这种写法有弊病,当表中的那么有null时,统计的结果就会少于7个,所以当要统计表中的总数时用*号好些
select count(name) from student; //这种写法有弊病,当表中的那么有null时,统计的结果就会少于7个,所以当要统计表中的总数时用*号好些
(2)统计数学成绩大于80的学生有多少个?
select count(*) from student where math>80;
(3)统计总分大于250的人数有多少?
select count(*) from student where (chinese+math+english)>250;
(2)合计函数-SUM
lSum函数返回满足where条件的行的和
l练习:
l统计一个班级数学总成绩?
l统计一个班级语文、英语、数学各科的总成绩
l统计一个班级语文、英语、数学的成绩总和
l统计一个班级语文成绩平均分
l注意:sum仅对数值起作用,否则会报错。
l注意:对多列求和,“,”号不能少。
(1)统计一个班级数学总成绩?
select sum(math) from student; //得到的是数学总成绩
(2)统计一个班级语文、英语、数学各科的总成绩
select sum(chinese),sum(math),sum(english) from student;
(3)统计一个班级语文、英语、数学的成绩总和
select sum(chinese+math+english) from student;
(4)统计一个班级语文成绩平均分
select sum(chinese)/count(chinese) from student; //这里不能用select sum(chinese)/count(*) from student;因为有的学生没有开始语文,就不要算在一起
或者这样:select avg(chinese) from student;
(3)合计函数-AVG
l练习:
l求一个班级数学平均分?
l求一个班级总分平均分
(1)求一个班级数学平均分?
select avg(math) from student;
(2)求一个班级总分平均分
select avg(chinese+math+english) from student;
(4)合计函数-MAX/MIN
lMax/min函数返回满足where条件的一列的最大/最小值
l练习:
l求班级最高分和最低分(数值范围在统计中特别有用)
(1)求班级最高分和最低分
select max(chinese+math+english),min(chinese+math+english) from student;
Select语句(6)
为了演示,现在从新加入一张表
在Mysql里面orders是一个关键字,如果你这样直接的复制到mysql中就会报错
然后我们将order改为orders,在复制到mysql里面去就不会报错了
查看一下
l使用group by 子句对列进行分组
l练习:对订单表中商品归类后,显示每一类商品的总价
(1)对订单表中商品归类后,显示每一类商品的总价
select * from orders group by product; //这个将相同的商品归类后不会把总价加上
select product,sum(price) from orders group by product; //这个将相同的商品归类之后可以把总价加上
l练习:查询购买了几类商品,并且每类总价大于100的商品
lHaving和where均可实现过滤,但在having可以使用合计函数,having通常跟在group by后,它作用于组。
(2)查询购买了几类商品,并且每类总价大于100的商品
select product from orders group by product; //查看购买了几类商品
如果要查询购买了几类商品,并且每类总价大于100的商品,如果以前就会这样写
select product from orders group by product where sum(price)>100; //但是这样写不不行,会出错,因为where后面不能跟合计函数
这个时候就必须用having
select product from orders group by product having sum(price)>100;
现在讲的都是单表操作,多表操作在以后学习Oracal的时候重点掌握
(5)时间日期相关函数
示例:select addtime(‘02:30:30’,‘01:01:01’); 注意:字符串、时间日期的引号问题
select date_add(entry_date,INTERVAL 2 year) from student;//增加两年
select addtime(time,‘1 1-1 10:09:09’) from student; //时间戳上增加,注意年后没有
(1)addtime(data2,time_interval) //在原有的时间基础上加一个时间
select addtime('09:09:09','01:01:01');
(2)current_date() //获取当前的日期
select current_date();
(3)current_time()
select current_time();
(4)current_timestamp() //获取当前的时间戳
select current_timestamp();
(5)date(datetime) //返回一个时间的日期部分
(6)date_add(date2,INTERVALd_value d_type) //某个日期上添加一段时间
select date_add(entry_date,INTERVAL 2 year) from student; //增加两年,INTERVAL是一个常量
(7)date_sub(data2,INTERVAL d_value d_type) //在某个日期上减去一段时间
(8)datediff(date1,date2) //得到两个时间差
(9)now() //获取当前时间
select now();
(10)YEAR|MONTH|Date(datetime) //给一个时间值给你返回年月日
(6)字符串相关函数
(1)charset(str) //查看字符的字符集
select charset("aaaa");
(2)contat(string1,[,....]) //将多个字符串连接起来
(3)instr(string,substring) //从string整个字符串中找substring整个字符串,找到返回位置,没有则返回0
(4)UCASE(string2) //将字符转为大写
(5)LCASE(string2) //将字符转小写
(6)LEFT(string2,length) //从字符string2左边取length个字符
(7)LENGTH(string2) //获取字符的长度
(8)REPLACE(str,search_str,replace_str) //将str字符串中的search_str替换成replace_str
(9)STRCMP(string1,string2) //比较两个字符的大小,比较是按照字典顺序比较的
(10)SUBSTRING(str,position,[length]) //从字符串str中的position位置截取length个字符
(11)LTRIM(string2),RTRIM(string2),trim(string2) //去掉左边的空白,去掉右边的空白,去掉两边的空白
数学相关函数
七。定义表的约束(重中之重,加约束是为了避免非法数据的进入)
l定义主键约束
l primary key:不允许为空,不允许重复
l删除主键:alter table tablename drop primary key ;
l定义主键自动增长
l auto_increment
l定义唯一约束
l unique
l定义非空约束
l not null
l定义外键约束
lconstraint ordersid_FK foreign key(ordersid) references orders(id),
(1)主键约束(为了避免重复数据的插入,我们需要主键)在以后的开发中所有的表都必须有一个主键类,并且这个主键类都有一个主键约束
create table employees
(
id int primary key,
name varchar(40)
);
向这章表插入数据
insert into employees(id,name) values(1,'aa');
此时再向表中插入编号为id为1的数据就会失败
insert into employees(id,name) values(1,'bb');
(2)定义主键自动增长auto_increment
再创建一张表来说明自动增长主键,增加了auto_increment 之后就会自动增加主键了
create table t1
(
id int primary key auto_increment,
name varchar(40)
);
创建好自动增长主键的表后,插入数据时就不用插入id这行了
insert into t1(name) values ('aa');
但在做开发的时候不要让系统去自动增长主键,这样不便于表与表之间的联系
(3)唯一约束unique
创建一个表说明唯一约束
create table t2
(
id int primary key auto_increment,
name varchar(40) unique
);
再向这个表中添加数据
insert into t2(name) values('aaa');
然后再向表中插入相同的数据就会报错
(4)定义非空约束not null
在创建一个表说明非空约束
create table t3
(
id int primary key auto_increment,
name varchar(40) not null
);
然后插入空数据则会报错
insert into t3(name) value(null);
(5)外键约束
多张表对应时需要外键约束,避免错误
添加外键约束需要创建两个表
create table husband
(
id int primary key,
name varchar(40) not null unique
);
create table wife
(
id int primary key,
name varchar(40) not null unique,
husband_id int,
constraint husband_id_FK foreign key(husband_id) references husband(id)
);
//解释:constraint表示定义一了一个约束,husband_id_FK表示定义了一个名称我husband_id_FK的约束,foreign key(husband_id)表示与husband_id有关的外界约束,references husband(id)表示这个约束来自于husband(id)
向丈夫表插入两条数据
insert into husband(id,name) values(1,'aa');
insert into husband(id,name) values(2,'bb');
向妻子表插入两条数据,并且加入外键约束
insert into wife(id,name,husband_id) values(1,'xxx',1); //当插入1时正常,因为1号丈夫有
insert into wife(id,name,husband_id) values(2,'xxx',3); //当插入3时就会报错,因为3号丈夫没有
(6)另外还有check这个约束,这个check约束Mysql只是声明出来了,但没有真正去支持
现在我们在做一个表来说明
create teble t4
(
id int primary key auto increment,
name varchar(40) not null,
age int check>0 //加年龄必须为正数,但是在mysql中即使你加了check约束,虽然语法没有错,但mysql实际上并没有执行这个约束,也就是说你还是可以存入一个负数,所以说check这个约束虽然mysql声明了,但没有真正去支持它
);
八。表的设计(学习数据库中最重要的部分)
通常我们设计数据表需要联系多张表,比如我要设计一个部门的数据库,部分表下就必须涉及到员工表,所以设计表示非常有必要的
(1)设计一个部门管理系统,这部门管理对象需要的表
这个时候表就是一对多的关系,一个部门下有对应多个员工表,就应该将各自的数据存入到各自的表中,在多对一的表中加外键
(2)多对多的关系,当设计的数据表示多对多的关系时(比如学生对老师,老师对学生就是多对多的关系)
首先我们在做表单关系时不要管表单之间的关系,首先我就直接的设计出单个的对象的表,比如我们不管老师和学生之间的关系,我们就直接先设计出老师表和学生表,最后才考虑表与表的关系,当时多对多的关系时,我们可以设计一个中间表
mysql的代码如下:
create table teacher
(
id int primary key,
name varchar(40),
salary decimal(10,2)
);
create table student
(
id int primary key,
name varchar(40)
);
create table teacher_student
(
teacher_id int,
student_id int,
primary key(teacher_id,student_id), //通常在创建任何一张表都需要有一个主键约束以避免数据重复,在有些表中无法选定那个属性为主键时,我们可以使用联合约束就是将几个属性合起来作为主键约束,例如这里的primary key(teacher_id,student_id)
constraint teacher_id_FK foreign key(teacher_id) references teacher(id), //为teacher_id做外键约束
constraint student_id_FK foreign key(student_id) references studeng(id) //为student_id做外键约束
);
(3)一对一的关系,比如一个男人只能有一个女人,一个女人只能有一个男人,还比如一个身份证只能有一个人对应
但是这个一对一的关系有一个主从关系,主可以离开从,从不能离开主
下面我们设计一个省份证管理系统来说明
设计这些表时首先同样不要考虑表之间的关系,首先把单独对象的基本属性的表设计出来之后,在考虑表之间的关系
对于一对一的关系除了要加外键约束之外,还要加唯一约束,避免重复,比如身份证只有唯一的一个,没有重复,还要加非空约束
省份证必须有数据,这里的省份证的id本来就有一个主键约束,有主键约束就表示有唯一约束和非空约束,所以这里就没有必要单独设立外键列,我们可以把省份证的id作为外键列同时也作为主键列
一对一存在数据库中就应该这样去设计数据表,将从属关系的表中的id作为即作为外键也作为主键列,不用单独设立外键列
mysql代码如下:
create table person
(
id int primary key,
name varchar(40)
);
create table idcard
(
id int primary key,
city varchar(100),
constraint id_FK foreign key(id) references person(id)
);
综上所述:在设计表时,首先无论表与表的关系先建立好各个对象的基本属性的表,然后再分情况来讨论关系
如果是一对多的关系则在多的那张表上加外键,如果是多对多的关系则建立中间表去描述关系,如果是一对一的关系则将从属表的主键列作为外键列
最后在注意一下,在开发中有一对多的关系表中,往往有的人将两张表设计成一张表,这样是为了提高性能的
因为在Mysql查询中,多查询一张表性能就会下降一些的,多表查询就会引起性能下降,虽然这样设计表会出现数据冗余,但另一方面也会提升性能的,但是我们在设计中一般还是按照标准设计,只有在大数据访问量的时候我们可以用这样冗余的设计表,这样可以提高性能
最后还有一种数据结构(树状结构)比如网上商城中有商品-笔记本,手机,相机-然后又是各种的手机,各种相机,各种笔记本
这个又是一种数据结构树状结构
对于这种数据关系,我们可以将他们装在一张表里面,但是在这种表中为了说明他们之间的关系就必须建立一个关系类指定商品的父类是哪个编号,同时这个关系列也需要约束它来自哪个id,我们可以将他的约束指向这个表的id,这中执行叫做自连接,这样的表成为自连接表,或者叫做无限极分裂表(树状表),下面就是无限极分裂表和他的对象
Mysql的代码如下
create table categoies
(
id int primary key,
name varchar(40),
parent_id int,
constraint parent_id_FK foreign key(parent_id) references categoies(id)
);
然后再设计无限极分裂表时要如何设计他的对象,总之在设计他的对象的时候一定要用面向对象的思想去设计
这个无限制分裂中的对象具有id,name,还有记住它的父类的属性,还有记录他的崽儿的属性
Category
private int id;
private String name;
private Category parent; //用于记住它的父类是谁,返回的还是Category
private Set<Category> chidren = new HashSet(); //用于记住它的崽儿时哪些,