1.SQL简介
中文名称:结构化查询语言
作用:是一种定义、操作、管理关系数据库的句法。大多数关系型数据库都支持。
结构化查询语言的工业标准由ANSI(美国国家标准学会,ISO的成员之一)维护。
组成:
DDL:数据定义语言
DML:数据操作语言
DCL:数据控制语言
DQL:数据查询语言(sql最难的部分就是查询)
数据库管理软件 可以帮我们隔离具体的物理数据存储的方式,通过逻辑结构,来操作物理数据。
即我们操作的都是 二维表,所有的数据都是以二维表的形式存在。
一个数据库管理软件中,可以存在多个数据库;一个数据库类中可以有多个二维表。
通过二维数据表,将数据库的数据组织起来
数据库管理系统:用于管理数据的软件和工具。
数据库系统:上层应用,数据库管理系统,数据,DBA(database administer)
数据库管理软件 工作过程 简介,见图:
常用的数据库(软件)
Oracle(只做数据库和数据服务) / DB2(IBM)/ informix(专注于数据库中的事务处理)
/ Sybase(发明了一个power desgin,辅助软件)/ SQLServer2000,2005 /
MySQL(开源免费) / Access(office中) / SQLite(Android)等
MySQL 的安装和配置:
5.5版本要设置两个目录:服务的安装目录,数据的安装目录(Innodb)
此目录需要记住
还要记住root的账号密码。
见教程。
数据库服务器、数据库软件、数据库和表的关系:
1.所谓安装数据库服务器,只是在机器上装了一个数据库管理程序,这个管理程序可以管理多个数据库,一般开发人员会针对每 一个应用创建一个数据库。
为保存应用中实体的数据,一般会在数据库创建多个表,以保存程序中实体的数据。
2.一个user对象的数据,在表中可能就是一行数据记录(bean类),一行中有多列。
表与表之间的区别就在于:表结构的不同,即每个表所对应的数据的 属性的 个数/属性名/类型等不同
DDL语言就是用来定义表的结构的(增加、删除一列或者一行)。
MySQL常见数据类型:
在整数类型中,我们要注意bit类型,bit类型,是指位类型,bit(M),表示数据用多少个二进制位来表示
DDL语言
Data Definition Language
概述:
作用:
用于描述数据库中要存储的现实世界实体的语言。即创建数据库和表的结构 管理数据库和表的结构。
创建/管理 :数据库(的操作) 和 表结构(增删改查).
常用关键字:
CREATE ALTER DROP
使用流程:
1.进入数据库:cmd 打开DOS窗口,输入mysql -uroot -p密码
2.会跳转到 mysql>
对数据的操作:
3.查看数据库软件中所有数据库: show databases;
4.创建一个数据库mydb1 : create database mydb1;
创建时加入额外信息:
//创建使用指定字符集的数据库:
create database mydb1 character set gbk;
//创建一个带有校对规则的指定字符集的数据库:
create database mydb1 character set gbk collate gbk_chinese_ci;
5.查看数据库:
show databases ; ——查看当前服务中有哪些数据库。
show create database mydb2; —— 查看之前创建的数据库的基本信息
6.修改数据库:
对数据库的修改:
只能修改 字符集 和 校对集。
alter database mydb2 character set utf8;
7.删除数据库:
drop database mydb3; ——删除之前创建的数据库。
对表的操作:
首先表长什么样子?
------------------------------------------------------
Field | type | Null | Key | Default | Extra |
id | int(11) | YES | | NULL | |
name |varchar(30) | YES | | NULL | |
------------------------------------------------------
基本语法:create table
1.创建数据表:
先创建一个数据库
create database sql01;
use sql01; 进入这个数据表
显示当前处在哪个数据库: select database();
1. 向表中添加数据:
create table t_employee(id int, name varchar(10),gender varchar(3), birthday date, entry_data date,
resume text);
2.加入到数据表中
insert into t_employee value(97);
select keng from t_employee; 默认的取出方法
//取出一个a;
select keng+0 form t_employee;
//取出一个97;
select oct(keng) form t_employee;取出97的八进制表示
select hex(keng) from t_employee;取出97的十六进制表示
显示表:
****显示全表:desc t_employee;
显示数据表中添加的所有项目的信息:
2.修改表结构:alter table ....
添加一列:add
alter table t_employee add 列名 类型;
alter table t_employee add image blog;
修改一列的长度为60:modify
alter table t_employee modify Field列的属性名 varchar(60)
(只能修改列的数据类型,不能修改其列名Field)
eg. alter table t_employee modify name int;
删除某一列:drop
later table t_employee drop image;
修改表名:rename
rename table t_employee to user;(重新命名表,为user)
查看一个数据库中有多少张表:
show tables;
设置表的字符集:character set gbk;
alter table user character set gbk;
(一般直接设置set names gbk;就行了)
修改列名:change
alter table user change 列名 新列名 新数据类型;
alter table user change name username varchar(20);
设置默认值:default
alter table 表名 modify 列名 对应的类型 default '修改的默认值';
alter table user modify username varchar(20) default ''; //设置username的Type属性为空串
DML语言和DQL语言:
这两个语言需要放在一起配合使用:
作用:操作表中数据。(DQL专门进行数据查询)
1.DML:Data Manipulation Language
作用:
用于向数据库表中插入、删除、修改数据。
常用关键字:
INSERT 、UPDATE 、 DELETE(insert,update,delete)
在修改表结构的时候,修改的是某一列。而表中的数据是以行为单位的。
DML 则是以行为单位进行数据修改。
DML语句基本操作:
插入数据:insert
可以选择在一行中的某几个位置插入数据,其他位置会自动补null;
数据类型要相同,长度不能超过原本的长度。
字符串和日期型数据应该包含在单引号中。
可以插入null;
语句:insert into table(column1,column2,...) value(value1 , value2,....)
eg. create table employee(id int,name varchar(20),sex bit,birthday date,...);
//创建所有属性列,并给每个属性列创建值,
insert into employee(id,name,sex,birthday,...)values(1,'zs',0,'2000-01-01');
//如果所有数据都要初始化的话,可以简便写法:
**insert into employee(id,name,sex,birthday,...)values(1,'王五',1,'1999-01-01');
插入时还可以:
insert into employee values(1,'lisi',1,'1999-01-01'),(2,'zs','1999-02-03'),(...);
(不过这样是默认对这一行的每一个属性列都进行插入)
但是————会报错,因为编码的问题,见后面,这里需要设置 set names gbk; 就可以解决这个问题了;
修改(更新)表中数据:update
将id 修改:(所有行/特定行)
1.update employee set id=10; —— (没有where指定行)则会修改 id 所在列的所有元素,都改为10;
2.update employee set id=10 where name='zs'; ——指定了行(where),修改其原本的id为10;
(where 某行的属性键值对)
类比:java中的name.equals("zs")
3.在原有基础上加减
update employee set id=id+10 where name='zs';
删除表中数据:delete
删除的单位是:行
delete from employee where id=1; //删除定位的行
delete from employee; //不使用where,直接删除这个表中所有数据
它只能删除表中数据,不能删除表本身,如果要删除表,要使用drop table
DQL语句:
1. select语句:
基本select语句:
查询表中所有列:select * from 表名;
(*相当于一个通配符,可以选择某几行属性来输出,select name,id,.. from student;)
查询表中某些属性列的值: select 属性列1,属性列2 * from 表名;
在查询时 过滤 表中重复数据:select distinct * from 表名;
可对 列通过 表达式进行运算:
select name,math+10 from 表名; //对math列的所有值都加了10
查询成绩的总分:
select name,chinese+english+mash from 表名;
但是列的名字叫:chinese+english+mash
可以通过起别名的方式: as 别名
select name,chinese+english+mash as score from 表名;
查询某个姓名为李的信息:
select * from 表名 where name like'李%';
在where中经常使用的操作符:
1.like : 模糊查询
Like语句中,pattern 为 % 代表零个或多个任意字符,_ 代表一个字符,
例first_name like ‘_a%’;
2.between and : 表示数据在某一个区间范围内(闭区间)。
select * from 表名 where id between 80 and 100;
3.isnull: 如果表中数据有null时,那么在向找到某个属性值是否为null,不能通过=null,而是isnull;
select * from 表名 where id isnull;
4.in(set) 表示判断属性值是否在集合中存在。
select * from 表名 where math in(55,77,100);找出具有这几个元素的行。
5.逻辑运算符: and / or / not
and : 表示多个条件同时成立
or: 表示其中一个条件成立的;
not : 不成立(where not(salary > 1000))
(select name from student where math not in(50,70));
—— 表示math的成绩不是50和70的学生的姓名;
6.关系运算符:< > = <= .. 不等于:<>
查询的过程:
通过筛选满足条件的数据,然后将这些数据放在一张临时表中,显示出来。
重命名也是在临时表中进行重命名。
eg. select name,math+chinese from 表名 as score where score>100;//这样找不到socre
那么就要用到 order by :
select name,math+chinese as score from 表名 order by socre;
基本语法:select * from table where ... order by column1 desc(ASC是默认,升序,DESC为降序), column2 asc(desc), column3 asc(desc)...;
(实现同一个表下的多种排序)
mysql的中文乱码:
查看所有地方的字符编码:show variables like 'character%'
确定字符编码的地方一共有六处:client——>connection——>数据库服务器内部(database/)——>results
内部字符集不会出错,则只需要关注 client、connection、results
但是还需要注意:客户端(console命令行)只支持GBK,编码模式。
****做法:
set names gbk;(将client/connection/result的编码格式改为gbk)只要这三个编码一致,就不会出现乱码
查看mysql所使用的字符集:show variables like 'character';
set character_set_result=utf8;设置某一个的字符集:中文就会出现乱码;
(转换流程见下图):
约束
概述:
约束作用:(1)定义规则
(2)确保完整性:包括数据的精确性、可靠性。以确保数据不会出错,或者尽量减少出错。
约束的类型:
(1)非空约束
(2)主键约束
(3)外键约束(右外键约束)(左外键约束)
(4)唯一约束
(5)检查约束
1.数据完整性约束:
数据完整性是为了保证插入到数据中的数据是正确的,它防止了用户输入的错误。
1.实体完整性(唯一性)
规定表中的一行记录在表中是唯一的实体,通过表的 主键 来约束。
主键:一个或多个 可以唯一表示 一个实体的属性或属性集合。(如果不能在本列中唯一,则不是主键)
tid(主键) name age (name也可能重名,所以不能作为主键)
1 'zx' 18
2 'lisi' 18
设置主键约束:
1.primary :
primary id int primary key;
主键有两层含义:
1.实体存在:
不能给主键设置为null,因为这样就表示这个记录不存在,那么就没有意义。
2.实体在表中唯一:
如果没有设置主键约束,那么可以随意向表中添加 重复记录。
如果设置了主键,那么表中如果再插入同样的记录,则不会插入成功。
2.域完整性约束:
指数据库表的列(即字段)必须符合某种 特定的数据类型 或 约束
not null; //非空约束 : 字段名 数据类型 not null;
unique; // 唯一性约束 :字段名 数据类型 unique;
设置了某列的两个约束 not null unique的时候,那么相当于给此列变成主键;
***一个表中可以有多个unique声明,但是只能有一个主键primary key 声明。
3.参照完整性约束(外键):
在显示生活当中,存在很多实体,实体之间存在着联系。
在数据库中通过表的实体数据的引用 在关系表中表示他们之间的关系。
在一个数据库中:
有两个实体表(主键表)(学生表,选课表),和一张关系表(选课表),可以表示不同学生的选课的信息。
在关系表中,如果,一个学生选择了一个不存在的课程,或者一个不存在的学生,选择了一个存在的课程,这些都是不合理的数据。
在参照完整性中,你所引入的必须是存在的实体数据。
课程表(sid) | 学生表(tid) | (关系表)选课表
classid(主键) name | studentid(主键) name age | classid studentid score
1 java | 1 'zs' 18 | 1 2 100
2 c++ | 2 'lisi' 20 | 1 1 80
3(这就是一个不存在的数据项)
也就是说在进行inter into 关系表 values(3,1,90);将无法插入,因为3无法在对应的主键中找到列表项。
但是insert into 关系表 values(1,1,100);可以插入。
添加参照完整性约束的语法:
(学生表 :create table st(sid int premary key;)
课程表 :create table coures(tid int )
create table cs(ssid int,ttid int,score int,
constraint sid_st_fk foreign key(ssid) reference st(sid); //引用了外界的sid,
constraint tid_course_fk foreign key(ttid) reference course(tid);
)
外键约束的语法:
constraint 外键名 foreign key(字段名1,字段名2..) reference 主表名(主键列1,主键列2,...);
外键名:定义的外键约束的名称,一个表中不能有相同的外键名;
字段名:表示子表需要添加外键约束的字段列;
主表名:表示被子表外键所依赖的表的名称(主键所在的表);
主键列:表示主表中定义的 主键列或列组合;
什么是外键?
首先它是表中的一个字段,,它可以不是本表的主键,但对应另外一个表的主键。
作用:外键用来保证数据引用的完整性
2.多表设计
主键可以是一个组合(所有设置了主键的属性就是主属性,主属性不能为null)
多对多关系:
例如学生选课:
一个学生可以选择多门课;多门课可以被多个同学选择
现在要存储选课学生的数据:
tid(主键) | name | pointdis(主键) | name | age
1 | java | 2 | zs | 18
1 | c | 1 | zs | 18
2 | c | 2 | lisi | 20
有几个异常:
插入异常
有些学生还没有选课,那么他在选课表中没有数据,那么就加入不进
删除异常:
删除几个选课信息之后,发现某些课程没了
更新异常:
修改一个名字,需要修改相关的所有学生的姓名(同一个数据需要修改很多次)
解决方案:将所有数据分散到不同的表当中,那么修改相应的主键属性就可以达到目的了。
(消除数据的冗余)
将 多对多的关系:
放入多张表中存储:三张表中两张实体表,一张关系表
一对多的关系:
例如:一个学生和所在的省份
一个省可以包含多个学生,一个学生只能选择一个省份
两种存法:
1.也是三张表,省份一张表,学生一张表,关系一张表
2.两张表:一张存省份(多的实体),一张存学生(一的实体),并有一个外界引用 prevince_id
一对一的关系:
一表即可。
多表设计的规范:
范式等。