一、数据库概述
-
1.数据库:存储数据的仓库
层次式数据库,网络式数据库,关心型数据库
常见的关系型数据库:SqlServer Oracle MySql DB2 ···
-
2.MySql数据库的安装与配置
安装的路径不要有中文和空格
默认的端口3306不要去改,保持默认即可 -
3.登陆或退出MySql客户端命令
登陆:mysql -uroot -p123 -h localhost;
-u:后面的root是用户名,这里使用的是超级管理员root;
-p:后面的123是密码,这是在安装MySQL时就已经指定的密码;
-h:后面给出的localhost是服务器主机名,它是可以省略的,例如:mysql -u root -p 123;
退出:quit或exit;扩展:通过命令启动、停止、删除服务(mysql5.5)
启动:net start 服务名称 关闭:net stop 服务名称 删除:sc delete 服务名称 (如果服务名中间有空格,就需要前后加引导)
-
4.MySql常见的概念
数据库服务器(mysql)软件
数据库 jd db_jd taobao db_taobao db_taobao
数据库表 User tb_user Product tb_prod prders
表记录 User user=new User(“张三”);
二、SQL语言
SQL是操作关系型数据库通用的语言(mysql,Oracle,sqlserver)
SQL是非过程性语言
SQL是一个标准,各个数据库厂商都根据该标准提供了实现。
数据库厂商为了增强数据库的功能,添加了一些非标准的SQL,称之为数据库的"方言"。
CRUD
三、利用sql语句来操作数据库
-
1.创建数据库
语法:CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [,create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name | [DEFAULT] COLLATE collation_name
其中charset_name是为数据库指定的默认字符集
Collate是为数据库指定的默认校对规则
(校对规则是在字符集内用于比较字符的一套规则,可以控制select查询时where条件大小写是否敏感的规则。)练习:
//创建一个名称为mydbl的数据库。 create database mydb1; //创建一个使用gbk字符集的mydb2数据库 create databse mydb2 character set gbk;
-
2.查看数据库
语法://显示所有数据库 show databases; //显示数据库创建语句: show create database db_name
练习:
//~查看当前数据库服务器中的所有数据库 show databases; //~查看前面创建的mydb2数据库的定义信息 shou create database mydb2;
-
3.修改数据库
语法:ALTER DATABASE db_name [alter_specification [,alter_specification] ...] alter_specification: [DEFAULT] CHARACTER SET charset_name | [DEFAULT] COLLATE collation_name
练习:
//~查看服务器中的数据库,并把mydb2库的字符集改为utf8 alter database mydb2 character set utf8;
-
4.删除数据库
语法:DROP DATABASE [IF EXISTS] db_name
练习:
//~删除前面创建的ydb1数据库 DROP DATABASE mydb1;
-
5.选择数据库
语法://选择数据库 use db_name; //查询当前选择的数据:select database(); selecr database(); //没有退出数据库的命令,如果想退出当前数据库进入另一个数据,直接use另一个数据库就可以了
四、利用sql语句来操作数据库表
0.MySQL中常见的数据类型
(1)字符串类型
a)char(n)定长字符串
stuid char(10) 255
b)varchar(n)不定长字符串
username varchar(10)
255(5.0以后)65535
(2)数值类型
TINYINT:占用1个字节,相对于java中的byte
SMALLINT:占用2个字节,相对于java中的short
INT:占用4个字节,相对于java中的int
BIGINT:占用8个字节,相对于java中的long
FLOAT:4字节单精度浮点类型,相对于java中的float
DOUBLE:8字节双精度浮点类型,相对于java中的double
(3)大数据类型
BLOB:
大二进制类型,可以存入二进制类型的数据,通过这个字段,可以通过字段,可以将图片、音频、视频等数据以二进制的形式存入数据库。最大为4GB。
TEXT:
大文本,被声明为这种类型的字段,可以保存大量的字符数据,最大为4GB。
注意:text属于mysql的方言,在其他数据库中为blob类型
(4)日期类型
DATE:日期 2015-11-05
TIME:时间 格式'HH:MM:SS' 19:19:19
DATETIME:日期时间 2015-11-05 19:19:19 年份范围:1000~9999
TIMESTAMP:时间戳 2015-11-05 19:19:19 年份范围:1970~2037
**DATETIME和TIMESTAMP的区别?
*DATETIME和TIMESTAMP显示的结果是一样的,都是固定的"YYYY-MM-DD HH:MM:SS"的格式
*DATETIME支持的范围是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。TIMESTAMP的显示范围是'1970-01-01 00:00:00'到2037年,且其实际的存储值为1970年到当前时间的毫秒数。
*在建表时,列为TIMESEAMP的日期类型可以设置一个默认值,而DATETIME不行。
*在更新表时,可以设置TIMESTAMP类型的列自动更新时间为当前时间。
(5)逻辑型
bit 0/1 0/1
1.字段的约束
主键约束:primary key值必须唯一且不能为空 auto_increment 自定增长
唯一约束:unique 值必须唯一
非空约束:not null 值不能为空
外键约束
2.新增表
语法:
create table table_name(
field1 datatype,
field2 datatype,
field3 datatype
)[character set 字符集][collate 校队规则];
field:指定列名 datatype:指定列类型
注意:创建表时,要根据需保存的数据创建相应的列,并根据数据的类型定义相应的列类型。
创建表时,一般不需要指定字符串编码和校对规则,和数据保持一致即可。
练习:创建employee表
create table employee(
id int,
name varchar(20),
gender char(6),
birthday date,
entry_date date,
job varchar(200),
salary double,
resume text
);
=====================================
create table employee2(
id int primary key auto_increment,
name varchar(20) unique,
gender char(6) not null,
birthday date,
entry_date date,
job varchar(200),
salart double,
resume text
);
3.查看表
查看表结构
desc tabName;
查看当前所有表:
show tables
查看当前数据库建表语句
show create table tabName;
4.修改表
语法:
修改指定表的字符集
ALTER TABLE tabname convert to character set utf8;
增加列:
alter table tabname add(colum datatype [default expr][,column datatype]...);
修改列:
alter table tabname modify(column datatype[default expr][, column datatype]...);
删除列:
alter table tabname drop(column);
修改表名:
alter table old_tabname rename to new_tabname;
或
rename table old_tabname to new_tabname;
修改列名称:
alter table tabname change [column] old_col_name new_col_name datatype
修改列的顺序
alter table tabname modify col_name1 datatype after col_name2;
修改表的字符集
alter table tabname character set character_name;
练习:
在上面员工表的基础上增加一个image列。
alter table employee add image blob;
修改job列,使其长度为60。
alter table employee drop gender;
表名改为usesr
alter table employee rename to user
或
rename table user to employee;
列名name修改为uername
alter table employee change name username varchar(20) ;
将image插入到id列的后面
alter table employee modify image blob after id;
修改表的字符集为GBK
alter table employee character set gbk;
5.删除表
语法:
drop table tabname;
练习:
删除user表
drop table user;
五、利用sql语句来操作数据库表记录
1.INSERT
语法:
insert into tabname[(column[,column...])] values(value[,value...]);
注意:插入的数据应与字段的数据类型相同
数据的大小应在列的规定范围内
在value中列出的数据位置必须与被加入的列的排列位置相对应
在字符串和日期格式的数据要用单引号引起来
如果要插入所有字段可以省写列列表,直接按表中字段顺序写值列表
练习:
向员工表中插入三条数据
insert into employee(id,name,gender,birthday,entry_date,job,salary,resume) values(null,'刘备','男','1888-01-01'.'2016-10-10','大BOSS',9999999,'打野型英雄,防御高');
insert into employee values(null,'张飞','男','1887-02-03','2016-10-12','金牌打手',9000,'辅助型英雄,防御也高');
insert into employee values(null,'关羽','男','1886-02-03','2016-10-12','金牌代言人',8000,'战士,移动速度快,有马'),(null,'貂蝉','女','1896-02-03','2016-10-13','程序员鼓励师',16000,'法师,伤害高');
**乱码问题:
**乱码问题:客户端发送的数据是GBK的,而服务器使用的utf-8的编码来处理客户端发来的数据,两端使用的编码不一致导致乱码。
**解决方法1:在客户端可以通过set names gbk;通知服务器使用指定码表来处理客户端发送的数据。这种方式只对当前cmd命令窗口有效,每次新开的窗口都要设置一次。
**解决方式2:可以通过修改MySQL安装目录下的my,ini文件(57行)中的配置,来指定服务器端使用的码表。这种方式一劳永逸。(注意:配置完成后需要重启服务器!!);
2.UPDATE
语法:
update tab_name set col_name1=expr1[,col_name2=expr2 ...][where where_definition]
update语法可以用新值更新原有表行中的各列。
set字句指示要修改哪些列和要给与哪些值。
where字句指定应更新哪些行。如没有where字句,则更新所有的行。
练习:
将所有的员工薪水改为5000元。
update employee set salary=5000;
将姓名为'貂蝉'的员工薪水修改为3000元。
update employee set salary=3000 where name='貂蝉';
将姓名为刘备的员工薪水休怪为4000元
update employee set salary=4000 where name='刘备';
将关羽的薪水在原有的基础上增加1000元。
update employee set salary =salary+1000 where name='关羽';
3.DELETE
语法:
delete from tab_name[where where_definition]
where用来筛选要删除的记录,如果不使用where字句,将删除表中的所有数据。
delete语句不能删除某一列的值(可使用update)
delete是一条条删除记录,truncate是摧毁整表再重建相同结构的表,truecate效率更高。
练习:
删除表中名称为关羽的记录
delete from employee where name='关羽';
删除表中所有记录
delete from employee;
使用truncate 删除表中记录
truncate table employee;
4.SELECT
(1)基本的查询
语法:
select [distinct] *|{column1,column2,column3...} from table_name;
select 指定查询哪些列的数据。
column指定列名。
*号代表查询所有列。
from指定查询哪张表
DISTINCT可选,指显示结果时,是否剔除重复数据
练习:
create table exam(
id int primary key auto_increment,
name varchar(20) not null,
chainese double,
math double,
english double
);
insert into exam values(null,'关羽',85,76,70);
insert into exam values(null,'张飞',70,75,70);
insert into exam values(null,'赵云',90,65,95);
insert into exam values(null,'张三丰',82,79,null);
ifnull()函数,可以为存在null值的列提供一个默认的值
例:ifnull(english,0)english为列名,0是默认值
查询表中所有学生的信息
select * from exam;
查询表中所有学生的信息。
select * fron exam;
查询表中所有学生的姓名和对应的英语成绩
select name,english from exam;
过滤表中重复数据
在所有学生分数上加10分特长分显示。
select name,chanese+10 as 中文总分,math+10 as 数学总分,english+10 as 英语总分 from exam;
select name,chinese+10 as 中文总分,math+10 as 数学总分,ifnull(english,0)+10 as 英语总分 from exam;
统计每个学生的总分。
select name,chinese+math+ifnull(english,0) as 总分 from exam;
使用别名表示学生总分。
select name,chinese+math+ifnull(english,0) 总分 from exam;
(2)使用where字句的查询
语法:
select *|列名 from tablename [where where_definition]
练习:
查询姓名为关羽的学生成绩
select * from exam where name='关羽';
查询英语成绩大于90分的同学
select * from exam where english>90;
查询总分大于230分的所有同学
select name,chinese+math+ifnull(english,0)总分 from exam where chinese+math9ifnull(english,0)>230;
###在where字句中不能使用别名和聚合函数!!!
查询语文分数在80~100之间的同学。
select * from exam where chinese>=80 and chinese<=100;
或
select * from exam wherechinese between 80 and 100;
查询数据分数为75,76,77的同学。再查询分数不在这个范围内的同学
select * from exam where math in(75,76,77);
select * from exam where math not in(75,76,77);
#################################
查询所有姓张的学生成绩。
%:表示零个或多个字符 张% %三
_:表示单个字符 张_ 张_
like:模糊查询 %三%
select * from exam where name like '张_';
select * from exam where name like '张_';
select * from exam where name like '张%';
查询数学分>70,语文分>80的同学
select * from exam where math>70 and chinese>80;
查询英语成绩为null的同学的记录
select * from exam where math english is null;
###
select * from exam where english is not null;
(3)排序查询
语法:
select column1,column2,column3..from table order by column asc|desc;
Order by 指定排序的列,排序的列即可是表中的列名,也可以是select语句后指定的列名。
Asc 升序(默认)、Desc降序
ORDER BY 字句应位于SELECT语句的结尾。
练习:
对英语成绩排序后输出
select english from exam ordey by english;
对总分排序按从高到底的顺序输出
select math+chinese+ifnull(english,0) 总分 from exam order by math+chinese+ifnull(english,0) desc;
select math+chinese+ifnull(english,0) 总分 from exam order by 总分 desc;
对姓张的学生成绩排序输出
select math+chinese+ifnull(english,0) 总分 from exam where name like '张%' order by 总分;
(4)聚合函数
语法:
求符合条件的记录中指定列的记录数
select count(列名) ... from tablename[where where_definition]
求符合条件的记录中指定列的和值
select sum(列名)... from tablename[where where_definition]
求符合条件的记录中指定列的平均值
selectt avg(列名)... from tablename[where where_definition]
求符合条件的记录中指定类的最大值
select max(列名)... from tablename [where where_definition]
求符合条件的记录中指定类的最小值
select min(列名)... from tablename [where where_definition]
练习:
统计一个班级共有多少学生?
select count(id) as 总人数 from exam;
统计数学成绩大于75的学生有多少个?
select count(*) as 总人数 from exam where math>75
434