您的位置:首页 > 数据库 > MySQL

MYSQL数据库学习笔记1

2016-08-17 01:37 295 查看

数据库概念

数据库是一种对大量信息进行管理的一种方法.
数据库系统从结构上看,也是可以分为三层的: 物理层:数据实际如何存储 逻辑层:存储的是什么数据,以及数据间是什么关系 试图层:提供给用户的部分数据

关系数据库

目前关于数据库模型最主流的有两种,
一种叫做关系型数据库,这是目前应用最多的一种数据库模型.
简单来说,关系数据库,就是由一张张二维的表及表间的关系所组成的一种数据库.
关系数据库中有那么几个常见的概念: 关系: 可以理解为一张二维的表,每个关系都有一个关系名,就是传说中的表名 元组: 表中的一行,在数据库中被称为记录 属性: 表中的一列,也就是所谓的字段 域: 属性的取值范围 关键字: 一组可以唯一标识元组的属性,数据库中的主键,可以是一个或多个字段组成. 关系模式: 对关系的一个描述,关系名(属性1,属性2,属性3…),也就是数据库中的表结构. 关系型数据库最大的优点就是易于理解,并且可以通过SQL语句来进行方便的操作.
但是关系数据库也遇到的很多瓶颈:
高并发读写时,磁盘IO是个很大问题. 海量数据的读写效率,对于关系型数据库而言,一张包含海量数据的表,查询效率是相对较低的. 扩展性和可用性问题:在基于web或者app的环境中,横向扩展是很难的,没有办法在保证不间断的服务的情况下,添加更多的节点来扩展性能和负载能力.
这一段我不是很确定对不对,没有做过这方面的运维,不是很清楚.
第二个就是,非关系型数据库NoSQL
NoSQL最早在1998年被Carlo Strozzi提出(我比较孤陋寡闻,不太清楚他是谁…),他的设计初衷是一个没有sql语言的,轻量级开关的关系型数据库. 但是在发展中渐渐跑偏了. 现在的NoSQL表示,非关系型的,分布式的,一般不保证ACID原则的(Atomic原子性,Consistency一致性,Isolation隔离性,Durability持久性)数据存储系统. 现在有一种非关系型数据库,以key-Value对的形式来存储数据,结构不固定,每个元组都可以有不一样的字段. 每个元组也可以根据需要添加新的键值对. 这样可以避免多表联查,只需要根据id取出相应的value就可以了. (不是很理解这些大神的逻辑,暂时没有精力也没啥太大的兴趣深入了解…) 本段内容引用了NovaWong的<关系型数据库和非关系型数据库>,如有侵权,请联系我删除.
原文地址:

常见数据库软件

Oracle :甲骨文公司的数据库产品,大型的收费的数据库。 SQLServer :微软公司的数据库产品,中型的收费的数据库。 MySQL :是开源的,免费的数据库产品。在5.x版本是免费的,6.x是收费的。 DB2 :IBM公司的数据库产品,大型的收费的数据库。 SyBASE :已退出了历史舞台,PowerDigener(数据库建模工具)

SQL

SQL是Structured Query Language的缩写,是一种操作关系型数据库的语言.

SQL的概念

是一种结构化的查询语言 非过程性语言,语句之间没有特别的关联,一条语句就有一个结果. Oracle为自己的数据库弄了个PL/SQL 语句,用于对SQL进行增强 MYSQL等厂家,整出了一个T-SQL对SQL进行增强.

SQL语言分类

DDL 数据定义语言
创建数据库,创建表 DML 数据操作语言(重点)
插入数据(insert) 修改数据(upadte) 删除数据(delete) DCL 数据控制语言 DQL 数据查询语言(重点)

数据库操作

创建数据库

语法:
create database DBname

create database 数据库名称 character set 编码 collate 校对规则
数据登录:
mysql -p root -u


4000
看数据库的定义

show databases;

show create database 数据库名字;

删除数据库

drop database 数据库名字;

修改数据库

alter database 数据库名称 character set 编码 collate 校对规则;
切换到某个数据库
use 数据库名字

查询当前使用的数据库
select database();

创建表

数据类型

字符串类型:
CHAR和VARCHAR
varchar 长度是可变的. varchar(8) 仅仅表示长度小于8,不足8时不需要不全 char 长度不可变, char(8) 必须是8 ,不足8时需要补全. 大数据类型:(一般不用)
BLOB:二进制文件 TEXT:字符 数值类型:
TINYINT,SMALLINT,INT,BIGINT,FLOAT,DOUBLE 逻辑类型:
BIT 日期类型:
DATE
只有日期,没有时分秒 TIME
只有时分秒 DATETIME
手动录入 TIMESTAMP
不传入数据,默认选择当前系统时间, 除了字符串类型之外,其他类型都有默认长度. 比如int类型默认长度11. 通过desc可以查看表结构.
mysql> desc employee;
+------------+--------------+------+-----+---------+-------+
| Field      | Type         | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| id         | int(11)      | YES  |     | NULL    |       |
| name       | varchar(20)  | YES  |     | NULL    |       |
| gender     | varchar(10)  | YES  |     | NULL    |       |
| birthday   | date         | YES  |     | NULL    |       |
| entry_date | date         | YES  |     | NULL    |       |
| job        | varchar(100) | YES  |     | NULL    |       |
| salary     | double       | YES  |     | NULL    |       |
| resume     | text         | YES  |     | NULL    |       |
+------------+--------------+------+-----+---------+-------+
8 rows in set (0.02 sec)
[/code]

约束

主键约束

可以用于唯一标记该记录的字段

通过
pramary key
来声明主键

主键默认唯一,非空
唯一约束

值是唯一的

使用
unique
声明
非空约束

使用
not null
声明

修改表

添加字段:
alter table 表名 add 字段 类型(长度) 约束


删除字段:
alter table 表名 drop 字段


修改字段:
alter table 表名 modify 字段 类型(长度) 约束


修改字段名称:
alter table 表名 change 旧字段 新字段 类型(长度) 约束


修改表名:
rename table 表名 to 新表名


修改字符集:
alter table 表名 character set utf8

表的增删查改

添加记录

insert into user values(1,'美美','1990-10-10','2011-01-01','hr',19000,'aaaa','aaabb');


insert into 表名 (字段1,字段2,字段3..) values(值1,值2,值3...); 有几列就插入多少的值。


修改记录

update 表名 set 字段=值,字段=值 [where子句]


update user set salary=1000 where id=1;


删除记录

delete from 表名 [where子句]


truncate 表名
清空表

delete 和truncate的区别.

delete是逐条删除数据,而truncate是直接删除整个表之后再创建一个空表

查询

select * from stu;


select id,math from stu;


常用的符号

> < <= >= = <>,大于小于,大于等于,小于等于,等于,不等于

in(set),在某个集合中的值

like ‘张pattern’ 模糊查询

is null 是否为空
select * from user where username in ('小泽','小红');
select * from user where username like '小%';
select * from stu where english between 10 and 20;
select * from stu where english>10 and english<20;
[/code]

逻辑运算

and or not

排序

select name from stu order by math asc/desc;


asc 升序

desc 降序

默认使用升序

聚集函数

count 获取数量

select count(*) from stu;


sum 求和

select sum(math) from stu;


注意,如果有空值的时候,如果进行null+某个值,则得到的值为null. 而sum函数会忽略空值

mysql> select * from stu;
+----+------+------+---------+---------+
| id | name | math | english | chinese |
+----+------+------+---------+---------+
|  1 | 班长 | NULL |      19 |      20 |
|  2 | 小仓 |   18 |      19 |      20 |
|  3 | 小泽 |   18 |      19 |      20 |
|  4 | 小川 |   18 |      19 |      20 |
|  5 | 小波 |   18 |      19 |      20 |
|  6 | 小波 |   18 |      19 |      20 |
+----+------+------+---------+---------+
6 rows in set (0.00 sec)
[/code]

针对这个表来说,sum(math+english+chinese)和sum(math)+sum(english)+sum(chinese)是不一样的.

但是有个函数ifnull(xxx,默认值)这个可以处理空值.

mysql> select sum(math+english+chinese) from stu;
+---------------------------+
| sum(math+english+chinese) |
+---------------------------+
|                       285 |
+---------------------------+
1 row in set (0.00 sec)

mysql> select sum(math)+sum(english)+sum(chinese) from stu;
+-------------------------------------+
| sum(math)+sum(english)+sum(chinese) |
+-------------------------------------+
|                                 324 |
+-------------------------------------+
1 row in set (0.00 sec)

mysql> select sum(ifnull(math,0)+english+chinese) from stu;
+-------------------------------------+
| sum(ifnull(math,0)+english+chinese) |
+-------------------------------------+
|                                 324 |
+-------------------------------------+
[/code]

avg 平均数

同样有空值的问题,空值不会算入计算. 比如上面这个表,实际在计算的记录只有5条.

max 最大值

min最小值
group by子句

select product,sum(price) from orders group by product having sum(price)>100;


select product,count(product),sum(price) from orders group by product;


最后说一句,select 语句是有顺序的,S-F-W-G-H-O

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: