数据库概念

数据库是一种对大量信息进行管理的一种方法.
数据库系统从结构上看,也是可以分为三层的:

  • 物理层:数据实际如何存储
  • 逻辑层:存储的是什么数据,以及数据间是什么关系
  • 试图层:提供给用户的部分数据

关系数据库

目前关于数据库模型最主流的有两种,
一种叫做关系型数据库,这是目前应用最多的一种数据库模型.
简单来说,关系数据库,就是由一张张二维的表及表间的关系所组成的一种数据库.
关系数据库中有那么几个常见的概念:

  • 关系: 可以理解为一张二维的表,每个关系都有一个关系名,就是传说中的表名
  • 元组: 表中的一行,在数据库中被称为记录
  • 属性: 表中的一列,也就是所谓的字段
  • 域: 属性的取值范围
  • 关键字: 一组可以唯一标识元组的属性,数据库中的主键,可以是一个或多个字段组成.
  • 关系模式: 对关系的一个描述,关系名(属性1,属性2,属性3…),也就是数据库中的表结构.

关系型数据库最大的优点就是易于理解,并且可以通过SQL语句来进行方便的操作.
但是关系数据库也遇到的很多瓶颈:

  • 高并发读写时,磁盘IO是个很大问题.
  • 海量数据的读写效率,对于关系型数据库而言,一张包含海量数据的表,查询效率是相对较低的.
  • 扩展性和可用性问题:在基于web或者app的环境中,横向扩展是很难的,没有办法在保证不间断的服务的情况下,添加更多的节点来扩展性能和负载能力.

这一段我不是很确定对不对,没有做过这方面的运维,不是很清楚.

第二个就是,非关系型数据库NoSQL 
NoSQL最早在1998年被Carlo Strozzi提出(我比较孤陋寡闻,不太清楚他是谁…),他的设计初衷是一个没有sql语言的,轻量级开关的关系型数据库. 但是在发展中渐渐跑偏了. 现在的NoSQL表示,非关系型的,分布式的,一般不保证ACID原则的(Atomic原子性,Consistency一致性,Isolation隔离性,Durability持久性)数据存储系统.

现在有一种非关系型数据库,以key-Value对的形式来存储数据,结构不固定,每个元组都可以有不一样的字段. 每个元组也可以根据需要添加新的键值对. 这样可以避免多表联查,只需要根据id取出相应的value就可以了. (不是很理解这些大神的逻辑,暂时没有精力也没啥太大的兴趣深入了解…)

本段内容引用了NovaWong的<关系型数据库和非关系型数据库>,如有侵权,请联系我删除.
原文地址:http://my.oschina.net/u/1773689/blog/364548

常见数据库软件

  • 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

查看数据库的定义

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)

约束

主键约束

  • 可以用于唯一标记该记录的字段
  • 通过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;

逻辑运算
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)

    针对这个表来说,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 |
    +-------------------------------------+
  • 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

MYSQL数据库学习笔记1的更多相关文章

  1. MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  2. MySQL数据库学习笔记(十)----JDBC事务处理、封装JDBC工具类

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  3. MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  4. Mysql数据库学习笔记之数据库索引(index)

    什么是索引: SQL索引有两种,聚集索引和非聚集索引,索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间. 聚集索引:该索引中键值的逻辑顺序决定了表中相应行的物 ...

  5. MySQL数据库学习笔记<一>

    MySQL基本概念以及简单操作   一.MySQL   MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系 ...

  6. MySQL数据库学习笔记(四)----MySQL聚合函数、控制流程函数(含navicat软件的介绍)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  7. MySQL数据库学习笔记(三)----基本的SQL语句

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  8. mysql 数据库学习笔记一

    一.navicat的引入: (第三方可视化的客户端,方便MySQL数据库的管理和维护)安装网址:https://www.navicat.com.cn/ NavicatTM是一套快速.可靠并价格相宜的数 ...

  9. MySql数据库学习笔记(1)

    MySql数据库 下载地址 https://dev.mysql.com/downloads/mysql/5.1.html#downloads 连接到本机上的MYSQL mysql -u root -p ...

随机推荐

  1. RPMforge(Repoforge)源

    centos使用rpmforge-release 时间:2017-10-09 09:48:29      阅读:536      评论:0      收藏:0      [点我收藏+] 标签:rpmf ...

  2. CentOS 7 换yum源

    备份原来的源 sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bk 下载阿里源 $ cd /et ...

  3. tomcat的bin目录中startup.bat/tomcat.6.exe/tomcat6w.exe区别

    一.tomcat6.exe 与 startup.bat的区别 1.两者都可以用于启动Tomcat tomcat6.exe则是必须将tomcat注册Windows服务之后才可以用于启动tomcat服务; ...

  4. Scrapy爬虫入门系列4抓取豆瓣Top250电影数据

    豆瓣有些电影页面需要登录才能查看. 目录 [隐藏]  1 创建工程 2 定义Item 3 编写爬虫(Spider) 4 存储数据 5 配置文件 6 艺搜参考 创建工程 scrapy startproj ...

  5. ios -为什么用WKWebView加载相同的html文本,有时展示的内容却不一样。

      如图: 红色框部分是WKWebView,左边的是正常显示情况,右边的异常显示.我是在网页加载完成回调里执行的webview高度自适应内容: // 页面加载完成之后调用 - (void)webVie ...

  6. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)2.3——用Eclipse ADT导出App

    问题: 想在一个已经存在的Eclipse ADT的项目中使用Gradle 解决方案: Eclipse ADT插件可以帮助生成Gradle文件 讨论: Eclipse的ADT插件是在2013年推出Gra ...

  7. PHPFastCGI进程管理器PHP

    PHP-FPM是一个PHPFastCGI进程管理器,是只用于PHP的.      PHP-FPM其实是PHP源代码的一个补丁,旨在将FastCGI进程管理整合进PHP包中.必须将它patch到你的PH ...

  8. iptables 实际操作 之 规则查询 2

    在之前的文章中,我们已经总结过,iptables 为我们预定义了4张表,他们分别是raw 表,mangle表,nat表,filter表,不同的表拥有不同的功能. filter 负责过滤功能,比如允许那 ...

  9. TP ajax

    ①Ajax使用:   注意传值的所有过程用的是小写,及时数据库列的名称中有大写字母 控制器部分: AjaxController.class.php <?php namespace Home\Co ...

  10. 如何运行Python程序

    注:以下均基于windows下操作,并且安装的是最新的python3.3版本. 安装完python之后,我们可以做两件事情, 1.将安装目录中的Doc目录下的python331.chm使用手册复制到桌 ...