数据库概述
数据库:文件系统,通过命令SQL去操作这个文件系统
数据库的作用:储存数据,数据的仓库,带有访问权限,限制不同的人可以有不同的操作
mysql:开源免费,适用于中小型企业的免费数据库,SUN收购mysql,oracle收购SUN,java
mariadb: 由mysql创始人做出的mysql开源版本的分支
oracle: 甲骨文公司,商业收费软件,适用于大型电商网站。
db2: IBM公司,thinkpad 解决方案:软件和硬件,服务器架构,银行系统大多采用db2
sqlserver: windows里面,图形化工具比较好
sybase: 被淘汰的数据库
NOSQL非关系型数据库key:value
mongodb
redis
关系型数据库:
主要用来描述实体与实体之间的关系
实在的实物:员工与部门
E-R关系图:实体-联系图
实体:方框
属性:椭圆
关系:菱形
Mysql:数据库服务器
服务器:一台电脑,安装相关的服务器软件,这些软件会监听不同的端口,根据用户访问的不同端口,提供不同的服务
Mysql的安装与卸载:
卸载:控制面板,删除mysql安装目录下的所有文件,mysql数据存放文件,Program Data(隐藏文件)中的mysql
安装:服务器配置:Include bin directory to windows path 端口号:3306 密码:root
SQL:structure Query Language: 结构化查询语言
Mysql的SQL语句
DDL:数据定义语言:定义数据库,数据表的结构 create(创建);drop(删除);alter(修改)
DML:数据操纵语言,主要是用来操作数据 insert(插入);update(更新);delete(删除)
DCL:数据可控制语言,定义访问权限,定义访问权限,安全设置 grant
DQL:数据查询语言,select(查询);from(字句);where(字句)
数据库的CRUD的操作
登陆数据库服务器:mysql -uroot -proot -p后面接密码 -u后面接用户名
创建数据库:
create database 数据库的名字;
创建数据库时指定字符集和较对规则:
create database 数据库名字 character set 字符集(utf8,gbk);
create database 数据库名字 character set 字符集 collate 校对规则;
例:create database datatest character set utf8 collate uft8_bin;
查看数据库
查看数据库定义的语句:
show create database 数据库的名字
查看所有的数据库:show databases;
information_schema
mysql
performance_shcema
修改数据库的操作
修改数据的字符集;
alter database 数据库的名字 character set 字符集;
删除数据库
drop database 数据库名字;
其他数据库操作的命令
切换数据库
use 数据库名字;
查看当前正在使用的数据库
select database();
表的CRUD的操作
创建表
create database 数据库的名字
create table 表名(
列名 列的类型 约束
列名 列的类型 约束);
列的类型
java
int
char/String
double
float
boolean
date
sql
int
char/varchar(char:固定长度,varchar:可变长度,char(3),varchar(3):3个字符)
double
float
boolean
date:YYYY-MM-DD time:hh-mm-ss
text:存放文本
存放二进制
blob:datetime:YYYY-MM-DD hh-mm-ss(默认为空) timestamp:YYYY-MM-DD hh-mm-ss(默认使用当前时间)
列的约束
主键约束:primary key
唯一约束:unique
非空约束:not null
create table student( $id int primary key, $name varchar(31), sex int, age int );
查看表
查看所有的表格
show tables;
查看表的创建过程
show create table 表名;
查看表的结构
desc 表名;
修改表
添加列(add) alter table 表名 add 列名 列的类型 列的约束
例:alter table student add grade int not null
修改列(modify) alter table 表名 modify 列名 列的类型
例:alter table student modify sex varchar(2);
修改列名(change) alter table 表名 change 原列名 现列名 列的类型
例:alter table student change sex gender varchar(2);
删除列(drop) alter table 表名 drop 列名
例:alter table student drop gender;
修改表名(rename) rename table 原表名 to 现表名
修改表的字符集(alter) alter table 表名 character set 字符集
删除表
drop table 表名;
SQL完成对表中数据的CRUD的操作
插入数据
insert into 表名(列名,列名,列名) values(值,值,值)
例: insert into student($id,$name,sex,age) values(12,'skdjf',234,34);
简单写法:insert into student values(2,'wangwang',87,87);(必须是插入全部列,插入部分列不能省略)
批量插入:insert into 表名 values(值,值,值,...),(值,值,值,...),(值,值,值,...)...;
insert into 表名(列名,列名,列名) values(值,值,值,...),(值,值,值,...),(值,值,值,...)...;
例: insert into student values(7, 'ksdjf', 8, 9),(8, 'sdjf', 9, 10),(9, 'jdk',34, 234),(10, 'fjdk', 478, 89);
查看表中的数据:select * from student;
命令行输入中文乱码的问题
暂停mysql的服务
在mysql安装路径中找到my.ini配置文件
在57行的编码方式改为gbk
保存文件并退出
启动mysql服务
删除记录
delete from 表名 [where 条件]
delete from student:没有指定条件,删除表中全部的数据
例:delete 删除数据和truncate输出数据有什么差别
delete:DML 一条一条删除表中的数据
truncate:DDL 先删除表再重建表
执行效率:数据少delete高效,数据多truncate高效
更新表记录
update 表名 set 列名=列的值,列名=列的值 [where 条件]
例:update student set $name='xiaojingzi' where $id=5;
update 表名 set 列名=列的值 表中所有的数据全部被更新
查询记录
select [distinct] [*] [列名,列名] from 表名 [where 条件]
distinct:去除重复的数据
案例分析:
商品分类:1. 分类的ID,2. 分类的名称,3. 分类的描述
create table category( cid int primary key auto_increment, cname varchar(10), cdesc varchar(10) ); insert into category values(null, '手机数码','质量可靠'); insert into category values(null, '鞋靴箱包','一个字,贵'); insert into category values(null, '酸奶饼干','好吃又好喝'); insert into category values(null, '馋嘴零食','瓜子,花生,饼干'); select * from category; select canme,cdesc from category;
所有商品:1. 商品的ID,2. 商品的名称,3. 商品的价格,4.生产日期,5. 商品分类的ID
create table product( pid int primary key auto_increment, pname varchar(10), price double, pdate timestamp, cno int ); insert into product values(null, '小米mix4', 998, null, 1); insert into product values(null, '锤子', 2998, null, 1); insert into product values(null, '阿迪王', 298, null, 2); insert into product values(null, '老村长', 28, null, 2); insert into product values(null, '金酒', 88, null, 3); insert into product values(null, '小熊饼干', 8, null, 3); insert into product values(null, '卫龙', 0.1, null, 4); insert into product values(null, '旺旺', 0.3, null, 4); --简单查询:select * from product; --查询商品名称和价格: select pname,price from product; --别名查询 as 可以省略 --表别名:select p.pname,p.price from product as p;(用在多表查询) select p.pname,p.price from product as p; --列别名: select pname as 商品名称.price as 商品价格 from product select pname as 商品名称,price as 商品价格 from product;(不需要引号) --查询商品所有的价格 select price from product; --去重:select distinct price from product; --select 运算查询:只是再查询结果上做运算 select *,price*1.5 as 打折价 from product; --条件查询[where关键字] --指定条件,确定要操作的记录 --查询商品价格大于60元的所有商品信息: select * from product where pirce > 60 --where 后的条件写法 --关键运算符: > >=, <, <=, =, !=, <> -- <>:不等于:标准的sql语法 -- !-:不等于:非标准sql语法 --逻辑运算:and, or, not; --查询商品的价格在100-10000之间的商品 select * from product where price > 10 and price < 10000; select * from product where price between 10 and 10000; --like:模糊查询 -- _:代表一个字符 -- %:代表多个字符 --查询名字中带有小字的所有商品 select * from product where pname like '%小%'; --查询第二个名字是米的所有商品 select * from product where pname like '_米%'; --in:在某个范围内获取值 --查询商品的分类ID在1,3里面的商品 select * from product where cno in (1, 3); --排序查询:order by 关键字 --asc:ascend 升序 --desc:descend 降序 --查询所有商品,按照价格进行排序 select * from product order by price desc; --查询带有小字的商品按照价格排序 select * from product where pname like '%小%' order by price asc; --聚合函数 -- sum():求和 -- avg():求均值 -- count():统计数量 -- max():最大值 -- min():最小值 -- 获得所有商品价格的总和 select sum(price) as 价格的总和 from product; --获得所有商品的均值 select avg(price) as 价格的均值 from product; --获得所有商品的个数 select count(*) as 商品的个数 from product; -- 注意:where后面不能接聚合函数 select * product where price>ave(price); --查询商品价格大于平均价格的商品 select * from product where price > (select avg(price) from product); --分组:group by --根据cno字段分组,分组后统计商品的个数 select cno,count(*) from product group by cno; --根据cno字段分组,分组统计每组商品的平均价格,并且商品平均价格大于60 select cno,avg(price) from product group by cno having avg(price) > 60; --having 关键字,可以接聚合函数,出现在分组之后,分组后过滤 --where 关键字,不能接聚合函数,出现在分组之前 -- 填写顺序:s...f...w...g...h...o select ... from ... where ... group by ... having ... order by ... -- 执行顺序: f...w...g...h...s...o from...where...group by...having...select...order by
SQL创建多表以及多表之间的关系
外键约束:foreign key
例:alter table product add foreign key(cno) references category(cid);
delete from category where cid = 4;// 删除失败
首先得去product 删除cno为5的商品
建数据库的原则:通常情况下,一个项目或者应用建立一个数据库
多表之间的建表原则
一对多:商品和分类
建表原则:在多的一方添加一个外键,指向一的主键
多对多:老师和学生,学生和课程
建表原则:多建一张中间表,中间表至少要有两个外键,这两个外键分别指向原来的两张表
一对一:班级和班长,公民的身份证,国家和国旗
建表原则:方案一:将一对一的情况,当作是一对多的情况进行粗粒
方案二:直接将两个表合并成一张表
方案三:将两张表的主键建立连接,让两张表的主键相等
实际用途:用的不多(拆表操作)
网上商城案例分析:
1. 用户表(用户ID,密码,手机号)
create table user( uid int primary key auto_increment, username varchar(31), password varchar(31), phone varchar(31) ); insert into user values(1, 'zhangsan', '123', '13547855478');
2. 订单表(订单编号,总价,订单时间,地址,外键用户ID)
create table orders( oid int primary key auto_increment, sum int, otime timestamp, address varchar(100), uno int, foreign key(uno) references user(uid) ); insert into orders values(1, 200, null, 'sichuanUniversity', 1); insert into orders values(2, 200, null, 'hahaUniversity', 1);
3. 商品表(商品ID,商品名称, 商品价格, 外键cno)
create table product( pid int primary key auto_increment, pname varchar(10), price double, cno int, foreign key(cno) references category(cid) ); insert into product values(null, '小米mix4', 998, 1); insert into product values(null, '锤子', 2998, 1); insert into product values(null, '阿迪王', 298, 2); insert into product values(null, '老村长', 28, 2); insert into product values(null, '金酒', 88, 3); insert into product values(null, '小熊饼干', 8, 3); insert into product values(null, '卫龙', 0.1, 4); insert into product values(null, '旺旺', 0.3, 4);
4. 订单项:中间表(订单ID,商品ID,商品数量,订单项总价)
create table oderitem( ono int, pno int, foreign key(ono) references orders(oid), foreign key(pno) references product(pid), ocount int, subsum double ); --给一号订单添加商品 insert into oderitem values(1, 9, 100, 99800); insert into oderitem values(1, 10, 100, 299800); --给二号订单添加商品 insert into oderitem values(2, 11, 3, 900); insert into oderitem values(2, 12, 3, 90);
5. 商品分类表(分类ID,分类名称,分类描述)
create table category( cid int primary key auto_increment, cname varchar(15), cdesc varchar(100) ); insert into category values(null, '手机数码','质量可靠'); insert into category values(null, '鞋靴箱包','一个字,贵'); insert into category values(null, '酸奶饼干','好吃又好喝'); insert into category values(null, '馋嘴零食','瓜子,花生,饼干');
多表之间的查询
-- 交叉连接查询 笛卡儿积 select * from product select * from category; -- 笛卡尔积 select * from product,category; -- 查询的结果没有意义 -- 过滤出有意义的数据 select * from product as p,category as c where p.cno = c.cid; --内连接查询 --隐式内连接查询:先查询后过滤 select * from product p, category c where p.cno = c.cid; --显式内连接查询:带着条件去查询,效率更高 select * from product p inner join category c on p.cno = c.cid; 两种方法的查询结果一致 --外连接 --左外连接:将左表中的所有数据都查询出来,如果右表中没有对应数据,就用Null代替 select * from product p left outer join category c on p.cno = c.cid; --右外连接:将右表中的所有数据都查询出来,如果左表中没有对应数据,就用Null代替 select * from product p right outer join category c on p.cno = c.cid; --分页查询 --每页数据为10,起始索引为0,第一页0,第二页5,从0开始,只会显示5条数据 select * from product limit 0, 5; --子查询: --查询出分类名称为手机数码的所有商品 select * from product where cno = (select cid from category where cname = '手机数码'); --查询出(商品名称,商品分类名称)信息 --左连接 select p.pname,c.cname from product as p left outer join category c on p.cno = c.cid; --子查询 select pname , (select cname from category where cno = cid) as 商品分类名称 from product;