精华内容
下载资源
问答
  • SQL Server 数据库学习

    万次阅读 多人点赞 2018-08-31 20:47:02
    一、认识数据库 1、数据库的基本概念 2、数据库常用对象 3、数据库的组成 数据库主要由文件和文件组组成。数据库中所有的数据和对象都被存储在文件中。 二、创建数据库 1、创建数据库 对象资源管理...

    一、认识数据库

    1、数据库的基本概念

    2、数据库常用对象

    3、数据库的组成

    数据库主要由文件和文件组组成。数据库中所有的数据和对象都被存储在文件中。

    二、创建数据库

    1、创建数据库

    对象资源管理器—数据库——右击——新建数据库

    三、操作数据表与视图

    1、创建数据表

    空值:表示数据未知。非空值:数据列不允许空值。

    (1)选择一个数据库——展开 表——新建表

    填入属性

    (2)设置主键

    选择KH_ID右击,设置为主键。主键:建立一列或多列的组合以唯一标识表中的每一行,主键可以保证实体的完整性,一个表只能有一个主键。

    (3)保存新建的表,并给起一个名字。

    (4)修改数据表。选择要修改的数据表,右击——设计。

    (5)创建检查约束,检查约束可以把输入的数据限制在指定范围。

    设计——选择一列——右击 check约束

    (6)创建外键:外键是建立两个表数据之间连接的一列或多列。通过将保存表中主键值的一列或多列添加到另一个表中,可以创建两个表之间的连接。这个列为第二个表的外键。

    2、关系

    一对一

    一对多

    多对多

    3、视图

    将查询的结果以虚拟表的形式存储在数据表中,视图并不在数据库中以存储数据集的形式存在,视图的结构和内容建立在对表的查询基础之上的,视图的行列数据源于查询所应用的表。

    (1)创建视图

    选择指定的数据库——视图——新建视图——添加表——保存

    (2)查看视图的内容(记录)

    选择要查看的视图——编辑前200行

    (3)视图中删除数据记录

    设计——删除

    三、T-SQL

    3.1分类

    3.2语句分类

    3.3 常用的数据操作语句

    3.3.1 select 查询语句

    select 语句是一个查询表达式,包括select、from、where、group by 和 order by 子句。具有数据查询、统计、分组和排序的功能。

     

    select 和from为必选子句,其他为可选语句。

    1、where 用法

    (1)比较运算:

    (2)逻辑运算:

    (3)范围运算:

    (4)列表运算

     

     

    (5)字符匹配运算

    2、ORDER BY 子句

    对查询的结果升序或降序排列

    3、GROUP BY子句

    对查询结果按照一列信息归类

    4、SELECT操作多表数据

    多表查询把多个表的数据组合,再从中获取所需要的数据信息。

    (1)简单基本连接

    (2)内连接

    内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。

    如:

    (3)外连接

    外连不但返回符合连接和查询条件的数据行,还返回不符合条件的一些行。外连接分三类:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)和全外连接(FULL OUTER JOIN)。

    左外链接:

    右外连接:

    完全连接:返回两个表中所有匹配行和不匹配行

    3.3.2 insert 插入语句

     

     

     

    3.3.3   update语句修改指定的数据

    3.3.4 delete 语句删除指定数据

     

    3.4 视图操作

    (1)插入数据

    (2)修改数据

    (3)删除数据

    4、基本表和视图的区别:

    (1)数据库中的数据都是存储在表中的,而视图只是一个或多个表依照某个条件组合而成的结果集,一般来说你可以用update,insert,delete等sql语句修改表中的数据,而对视图只能进行select操作。但是也存在可更新的视图,对于这类视图的update,insert和delete等操作最终会作用于与其相关的表中数据。因此,表是数据库中数据存储的基础,而视图只是为了满足某种查询要求而建立的一个对象。

    (2)表是物理存在的,你可以理解成计算机中的文件! 视图是虚拟的内存表,你可以理解成Windows的快捷方式!

     

     

    展开全文
  • 数据库学习:高并发数据库设计

    万次阅读 2017-11-13 13:21:19
    数据库学习:高并发数据库设计 随着乐视硬件抢购的不断升级,乐视集团支付面临的请求压力百倍乃至千倍的暴增。作为商品购买的最后一环,保证用户快速稳定的完成支付尤为重要。所以在15年11月,我们对整个支付...

    数据库学习:高并发数据库设计

    随着乐视硬件抢购的不断升级,乐视集团支付面临的请求压力百倍乃至千倍的暴增。作为商品购买的最后一环,保证用户快速稳定的完成支付尤为重要。所以在15年11月,我们对整个支付系统进行了全面的架构升级,使之具备了每秒稳定处理10万订单的能力。为乐视生态各种形式的抢购秒杀活动提供了强有力的支撑。

    一、库分表

    Redis,memcached等缓存系统盛行的互联网时代,构建一个支撑每秒十万只读的系统并不复杂,无非是通过一致性哈希扩展缓存节点,水平扩展web服务器等。支付系统要处理每秒十万笔订单,需要的是每秒数十万的数据库更新操作(insert加update),这在任何一个独立数据库上都是不可能完成的任务,所以我们首先要做的是对订单表(简称order)进行分库与分表。

    在进行数据库操作时,一般都会有用户ID(简称uid)字段,所以我们选择以uid进行分库分表。

    分库策略我们选择了“二叉树分库”,所谓“二叉树分库”指的是:我们在进行数据库扩容时,都是以2的倍数进行扩容。比如:1台扩容到2台,2台扩容到4台,4台扩容到8台,以此类推。这种分库方式的好处是,我们在进行扩容时,只需DBA进行表级的数据同步,而不需要自己写脚本进行行级数据同步。

    光是有分库是不够的,经过持续压力测试我们发现,在同一数据库中,对多个表进行并发更新的效率要远远大于对一个表进行并发更新,所以我们在每个分库中都将order表拆分成10份:order_0,order_1,….,order_9。

    最后我们把order表放在了8个分库中(编号1到8,分别对应DB1到DB8),每个分库中10个分表(编号0到9,分别对应order_0到order_9),部署结构如下图所示:

    图片描述

    根据uid计算数据库编号:

    数据库编号 = (uid / 10) % 8 + 1

    根据uid计算表编号:

    表编号 = uid % 10

    当uid=9527时,根据上面的算法,其实是把uid分成了两部分952和7,其中952模8加1等于1为数据库编号,而7则为表编号。所以uid=9527的订单信息需要去DB1库中的order_7表查找。具体算法流程也可参见下图:

    图片描述

    有了分库分表的结构与算法最后就是寻找分库分表的实现工具,目前市面上约有两种类型的分库分表工具:

    1. 客户端分库分表,在客户端完成分库分表操作,直连数据库
    2. 使用分库分表中间件,客户端连分库分表中间件,由中间件完成分库分表操作

    这两种类型的工具市面上都有,这里不一一列举,总的来看这两类工具各有利弊。客户端分库分表由于直连数据库,所以性能比使用分库分表中间件高15%到20%。而使用分库分表中间件由于进行了统一的中间件管理,将分库分表操作和客户端隔离,模块划分更加清晰,便于DBA进行统一管理。

    我们选择的是在客户端分库分表,因为我们自己开发并开源了一套数据层访问框架,它的代号叫“芒果”,芒果框架原生支持分库分表功能,并且配置起来非常简单。

    • 芒果主页:mango.jfaster.org
    • 芒果源码:github.com/jfaster/mango

    二、订单ID(uid维度)

    订单系统的ID必须具有全局唯一的特征,最简单的方式是利用数据库的序列,每操作一次就能获得一个全局唯一的自增ID,如果要支持每秒处理10万订单,那每秒将至少需要生成10万个订单ID,通过数据库生成自增ID显然无法完成上述要求。所以我们只能通过内存计算获得全局唯一的订单ID。

    Java领域最著名的唯一ID应该算是UUID了,不过UUID太长而且包含字母,不适合作为订单ID。通过反复比较与筛选,我们借鉴了Twitter的Snowflake算法,实现了全局唯一ID。下面是订单ID的简化结构图:

    图片描述

    上图分为3个部分:

    1. 时间戳

    这里时间戳的粒度是毫秒级,生成订单ID时,使用System.currentTimeMillis()作为时间戳。

    1. 机器号

    每个订单服务器都将被分配一个唯一的编号,生成订单ID时,直接使用该唯一编号作为机器号即可。

    1. 自增序号

    当在同一服务器的同一毫秒中有多个生成订单ID的请求时,会在当前毫秒下自增此序号,下一个毫秒此序号继续从0开始。比如在同一服务器同一毫秒有3个生成订单ID的请求,这3个订单ID的自增序号部分将分别是0,1,2。

    上面3个部分组合,我们就能快速生成全局唯一的订单ID。不过光全局唯一还不够,很多时候我们会只根据订单ID直接查询订单信息,这时由于没有uid,我们不知道去哪个分库的分表中查询,遍历所有的库的所有表?这显然不行。所以我们需要将分库分表的信息添加到订单ID上,下面是带分库分表信息的订单ID简化结构图:

    图片描述

    我们在生成的全局订单ID头部添加了分库与分表的信息,这样只根据订单ID,我们也能快速的查询到对应的订单信息。

    分库分表信息具体包含哪些内容?第一部分有讨论到,我们将订单表按uid维度拆分成了8个数据库,每个数据库10张表,最简单的分库分表信息只需一个长度为2的字符串即可存储,第1位存数据库编号,取值范围1到8,第2位存表编号,取值范围0到9。

    还是按照第一部分根据uid计算数据库编号和表编号的算法,当uid=9527时,分库信息=1,分表信息=7,将他们进行组合,两位的分库分表信息即为”17”。具体算法流程参见下图:

    图片描述

    上述使用表编号作为分表信息没有任何问题,但使用数据库编号作为分库信息却存在隐患,考虑未来的扩容需求,我们需要将8库扩容到16库,这时取值范围1到8的分库信息将无法支撑1到16的分库场景,分库路由将无法正确完成,我们将上诉问题简称为分库信息精度丢失。

    为解决分库信息精度丢失问题,我们需要对分库信息精度进行冗余,即我们现在保存的分库信息要支持以后的扩容。这里我们假设最终我们会扩容到64台数据库,所以新的分库信息算法为:

    分库信息 = (uid / 10) % 64 + 1

    当uid=9527时,根据新的算法,分库信息=57,这里的57并不是真正数据库的编号,它冗余了最后扩展到64台数据库的分库信息精度。我们当前只有8台数据库,实际数据库编号还需根据下面的公式进行计算:

    实际数据库编号 = (分库信息 - 1) % 8 + 1

    当uid=9527时,分库信息=57,实际数据库编号=1,分库分表信息=”577”。

    由于我们选择模64来保存精度冗余后的分库信息,保存分库信息的长度由1变为了2,最后的分库分表信息的长度为3。具体算法流程也可参见下图:

    图片描述

    如上图所示,在计算分库信息的时候采用了模64的方式冗余了分库信息精度,这样当我们的系统以后需要扩容到16库,32库,64库都不会再有问题。

    当577找不到订单时,采用(分库信息57 - 1) % 8 + 1,就能找到实际数据库编号。

    可以这么理解:

    1、扩容后的分库分表信息,可以兼容扩容之前的分库分表信息,也就是说:9527这个uid本来按照64库设计是在57库1表中,由于目前最多只有8库,所有只能让它分配在8库中,经换算是在7库1表中。

    9527按照8库设计也是在7库1表中。这种算法在某中程度上换算结果是一致的。

    2、扩容后的分库分表,后续的用户会均匀分布在扩容的库和表中;之前的库表信息存在就存在了,所以说扩容前的已存在的库表中存的订单信息(如8库9表)要比后面扩容后(如64库9表)存在的订单信息(9-64库9表) 要多。也就是说扩容前的库表信息冗余了。

    上面的订单ID结构已经能很好的满足我们当前与之后的扩容需求,但考虑到业务的不确定性,我们在订单ID的最前方加了1位用于标识订单ID的版本,这个版本号属于冗余数据,目前并没有用到。下面是最终订单ID简化结构图:

    图片描述

    Snowflake算法:github.com/twitter/snowflake

    三、最终一致性(bid维度)

    到目前为止,我们通过对order表uid维度的分库分表,实现了order表的超高并发写入与更新,并能通过uid和订单ID查询订单信息。但作为一个开放的集团支付系统,我们还需要通过业务线ID(又称商户ID,简称bid)来查询订单信息,所以我们引入了bid维度的order表集群,将uid维度的order表集群冗余一份到bid维度的order表集群中,要根据bid查询订单信息时,只需查bid维度的order表集群即可。

    上面的方案虽然简单,但保持两个order表集群的数据一致性是一件很麻烦的事情。两个表集群显然是在不同的数据库集群中,如果在写入与更新中引入强一致性的分布式事务,这无疑会大大降低系统效率,增长服务响应时间,这是我们所不能接受的,所以我们引入了消息队列进行异步数据同步,来实现数据的最终一致性。当然消息队列的各种异常也会造成数据不一致,所以我们又引入了实时监控服务,实时计算两个集群的数据差异,并进行一致性同步

    下面是简化的一致性同步图:

    图片描述

    四、数据库高可用

    没有任何机器或服务能保证在线上稳定运行不出故障。比如某一时间,某一数据库主库宕机,这时我们将不能对该库进行读写操作,线上服务将受到影响。

    所谓数据库高可用指的是:当数据库由于各种原因出现问题时,能实时或快速的恢复数据库服务并修补数据,从整个集群的角度看,就像没有出任何问题一样。需要注意的是,这里的恢复数据库服务并不一定是指修复原有数据库,也包括将服务切换到另外备用的数据库。

    数据库高可用的主要工作是数据库恢复与数据修补,一般我们以完成这两项工作的时间长短,作为衡量高可用好坏的标准。这里有一个恶性循环的问题,数据库恢复的时间越长,不一致数据越多,数据修补的时间就会越长,整体修复的时间就会变得更长。所以数据库的快速恢复成了数据库高可用的重中之重,试想一下如果我们能在数据库出故障的1秒之内完成数据库恢复,修复不一致的数据和成本也会大大降低。

    下图是一个最经典的主从结构:

    图片描述

    上图中有1台web服务器和3台数据库,其中DB1是主库,DB2和DB3是从库。我们在这里假设web服务器由项目组维护,而数据库服务器由DBA维护。

    当从库DB2出现问题时,DBA会通知项目组,项目组将DB2从web服务的配置列表中删除,重启web服务器,这样出错的节点DB2将不再被访问,整个数据库服务得到恢复,等DBA修复DB2时,再由项目组将DB2添加到web服务。

    当主库DB1出现问题时,DBA会将DB2切换为主库,并通知项目组,项目组使用DB2替换原有的主库DB1,重启web服务器,这样web服务将使用新的主库DB2,而DB1将不再被访问,整个数据库服务得到恢复,等DBA修复DB1时,再将DB1作为DB2的从库即可。

    上面的经典结构有很大的弊病:不管主库或从库出现问题,都需要DBA和项目组协同完成数据库服务恢复,这很难做到自动化,而且恢复工程也过于缓慢。

    我们认为,数据库运维应该和项目组分开,当数据库出现问题时,应由DBA实现统一恢复,不需要项目组操作服务,这样便于做到自动化,缩短服务恢复时间。

    先来看从库高可用结构图:

    图片描述

    如上图所示,web服务器将不再直接连接从库DB2和DB3,而是连接LVS负载均衡,由LVS连接从库。这样做的好处是LVS能自动感知从库是否可用,从库DB2宕机后,LVS将不会把读数据请求再发向DB2。同时DBA需要增减从库节点时,只需独立操作LVS即可,不再需要项目组更新配置文件,重启服务器来配合。

    再来看主库高可用结构图:

    图片描述

    如上图所示,web服务器将不再直接连接主库DB1,而是连接KeepAlive虚拟出的一个虚拟ip,再将此虚拟ip映射到主库DB1上,同时添加DB_bak从库,实时同步DB1中的数据。正常情况下web还是在DB1中读写数据,当DB1宕机后,脚本会自动将DB_bak设置成主库,并将虚拟ip映射到DB_bak上,web服务将使用健康的DB_bak作为主库进行读写访问。这样只需几秒的时间,就能完成主数据库服务恢复。

    组合上面的结构,得到主从高可用结构图:

    图片描述

    数据库高可用还包含数据修补,由于我们在操作核心数据时,都是先记录日志再执行更新,加上实现了近乎实时的快速恢复数据库服务,所以修补的数据量都不大,一个简单的恢复脚本就能快速完成数据修复。

    五、数据分级

    支付系统除了最核心的支付订单表与支付流水表外,还有一些配置信息表和一些用户相关信息表。如果所有的读操作都在数据库上完成,系统性能将大打折扣,所以我们引入了数据分级机制。

    我们简单的将支付系统的数据划分成了3级:

    第1级:订单数据和支付流水数据;这两块数据对实时性和精确性要求很高,所以不添加任何缓存,读写操作将直接操作数据库。

    第2级:用户相关数据;这些数据和用户相关,具有读多写少的特征,所以我们使用redis进行缓存。

    第3级:支付配置信息;这些数据和用户无关,具有数据量小,频繁读,几乎不修改的特征,所以我们使用本地内存进行缓存。

    使用本地内存缓存有一个数据同步问题,因为配置信息缓存在内存中,而本地内存无法感知到配置信息在数据库的修改,这样会造成数据库中数据和本地内存中数据不一致的问题。

    为了解决此问题,我们开发了一个高可用的消息推送平台,当配置信息被修改时,我们可以使用推送平台,给支付系统所有的服务器推送配置文件更新消息,服务器收到消息会自动更新配置信息,并给出成功反馈。

    六、粗细管道

    黑客攻击,前端重试等一些原因会造成请求量的暴涨,如果我们的服务被激增的请求给一波打死,想要重新恢复,就是一件非常痛苦和繁琐的过程。

    举个简单的例子,我们目前订单的处理能力是平均10万下单每秒,峰值14万下单每秒,如果同一秒钟有100万个下单请求进入支付系统,毫无疑问我们的整个支付系统就会崩溃,后续源源不断的请求会让我们的服务集群根本启动不起来,唯一的办法只能是切断所有流量,重启整个集群,再慢慢导入流量。

    我们在对外的web服务器上加一层“粗细管道”,就能很好的解决上面的问题。

    下面是粗细管道简单的结构图:

    图片描述

    请看上面的结构图,http请求在进入web集群前,会先经过一层粗细管道。入口端是粗口,我们设置最大能支持100万请求每秒,多余的请求会被直接抛弃掉。出口端是细口,我们设置给web集群10万请求每秒。剩余的90万请求会在粗细管道中排队,等待web集群处理完老的请求后,才会有新的请求从管道中出来,给web集群处理。这样web集群处理的请求数每秒永远不会超过10万,在这个负载下,集群中的各个服务都会高校运转,整个集群也不会因为暴增的请求而停止服务。

    如何实现粗细管道?nginx商业版中已经有了支持,相关资料请搜索

    nginx max_conns,需要注意的是max_conns是活跃连接数,具体设置除了需要确定最大TPS外,还需确定平均响应时间。

    展开全文
  • 数据库学习线路图

    千次阅读 多人点赞 2018-09-19 19:30:09
    数据库学习线路图 SQL 语法教程 SQL 教程 SQL 简介 SQL 语法 SQL Select选择 SQL SELECT DISTINCT SQL 查询子句 SQL 与,或,非 SQL 按关键字排序 SQL 在表中插入 SQL 空值 SQL 更新 SQL...

    数据库学习线路图


    SQL 语法教程

    SQL 教程 SQL 简介 SQL 语法 SQL Select选择 SQL SELECT DISTINCT SQL 查询子句
    SQL 与,或,非 SQL 按关键字排序 SQL 在表中插入 SQL 空值 SQL 更新 SQL 删除
    SQL SELECT TOP, LIMIT, ROWNUM SQL LIKE 运算符 SQL Wildcards 通配符 SQL IN 运算符 SQL BETWEEN运算符 SQL 通用数据类型
    SQL 语句快速参考 SQL Join连接 SQL 内部连接 SQL 左连接 SQL 右连接 SQL 完整外部连接
    SQL 自连接 SQL UNION 运算符 SQL SELECT INTO 语句 SQL INSERT INTO SELECT 语句 SQL 撤销索引、表以及数据库 SQL CREATE DATABASE 语句
    SQL CREATE TABLE 语句 SQL ALTER TABLE 语句 SQL AUTO INCREMENT 字段 SQL CREATE VIEW、REPLACE VIEW、 DROP VIEW 语句 SQL Server 和 MySQL 中的 Date 函数 SQL NULL 值 – IS NULL 和 IS NOT NULL
    SQL Aliases 别名 SQL 约束 SQL NOT NULL 约束 SQL UNIQUE 约束 SQL PRIMARY KEY 约束 SQL FOREIGN KEY 约束
    SQL DEFAULT 约束 SQL CHECK 约束 SQL JOIN 连接 SQL UNION 子句 SQL 克隆数据表 SQL 索引
    SQL 子查询 SQL ALTER TABLE 命令 SQL TRUNCATE TABLE 命令 SQL 处理重复数据 SQL 使用视图 SQL 注入
    SQL HAVING 子句 SQL 事务 SQL 使用序列 SQL 通配符 SQL 临时表 SQL MS Access、MySQL 和 SQL Server 数据类型
    SQL MAX() 函数 SQL MIN() 函数 SQL COUNT() 函数 SQL AVG() 函数 SQL SUM() 函数 SQL 日期函数
    SQL 函数 SQL FIELD()函数 SQL FIRST() 函数 SQL LAST() 函数 SQL GROUP BY 语句 SQL HAVING 子句
    SQL UPPER(),LOWER()函数 SQL UPPER()函数 SQL LOWER()函数 SQL UCASE() 函数 SQL LCASE() 函数 SQL MID() 函数
    SQL LEN() 函数 SQL ROUND() 函数 SQL NOW() 函数 SQL FORMAT() 函数 SQL SQRT() 函数 SQL RAND() 函数
    SQL CONCAT() 函数 SQL ISNULL()、NVL()、IFNULL() 和 COALESCE() 函数 SQL REPLACE()函数 SQL TRIM()函数 MySQL NOW() 函数 MySQL CURDATE() 函数
    MySQL CURTIME() 函数 MySQL DATE() 函数 MySQL EXTRACT() 函数 MySQL DATE_ADD() 函数 MySQL DATE_SUB() 函数 MySQL DATEDIFF() 函数
    MySQL DATE_FORMAT() 函数 SQL Server GETDATE() 函数 SQL Server DATEPART() 函数 SQL Server DATEADD() 函数 SQL Server DATEDIFF() 函数 SQL Server CONVERT() 函数

    MySQL教程

    MariaDB教程

    SQLite教程

    MongoDB教程

    Redis教程

    Memcached 教程

    SQLServer教程

    DB2教程

    文章转载自:http://codingdict.com/blog/13

    展开全文
  • MySql数据库学习(一)

    千次阅读 多人点赞 2019-10-23 16:31:00
    MySql数据库学习(一) mySQL (关系型数据库管理系统) MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL...

    MySql数据库学习(一)

    mySQL (关系型数据库管理系统)

    MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。

    MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

    MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。

    • MYSQL的SQL语句
      SQL:Structure Query Language结构化查询语言
      DDL:数据定义定义语言:定义与数据库/表结构:create(创建)drop(删除) alter(修改)
      DML:数据操纵语言:主要是用来操作表数据 insert(插入) update(修改) delete(删除)
      DCL:数据控制语言:定义访问权限,取消访问权限,安全设置 grant
      DQL:数据查询语言:select(查询) from子句 where子句

    1. 数据库的CRUD的操作

    • 首先要登录数据库服务器:mysql -uroot -proot

    创建数据库

    create database 数据库名字
    create database day01;
    
    --创建数据库的时候,指定字符集
    create database 数据库的名字 character set 字符集;
    create database day01_1 character set utf-8;
    
    create database 数据库的名字 character set 字符集 collate 校对规则;
    create database day01_2 character set utf-8 collate utf8_bin;
    
    

    查看数据库

    --查看数据库定义的语句
    show create database 数据库的名字
    show create database day_01;
    show create database day_01_1;
    
    --查看所有数据库
    show databases;
    
    informartion_schema
    performance_schema
    mysql
    

    修改数据库的操作

    --修改数据的字符集
    alter database 数据库的名字 character set 字符集;
    alter database day01_1 character set gbk;
    

    删除数据库

    drop database 数据库的名字;
    drop database day01;
    
    drop database test;
    
    

    其他数据库操作命令

    --切换数据库(选中数据库)
    use 数据库的名字
    use day01;
    --查看一下当前正在使用的数据库
    select database();
    

    2. 表的CRUD操作

    创建表

    create database 数据库的名字;
    
    create table 表名(
    	列名 列的类型(长度) 约束,
    	列名2 列的类型(长度) 约束,
    );
    
    
    
    列的类型:
    java          sql       
    int           int
    char/string   char/varchar
    			  char : 固定长度
    			  varchar : 可变长度
    			  char3)    一    一空格空格
    			  varchar3) 一    一
    			  长度代表的是字符的个数
    double        double
    float 		  float
    boolean       boolean
    date  		  date  : YYYY-MM-DD
    			  time  : hh:mm:ss
    			  datetime : YYYY-MM-DD hh:mm:ss  默认值是null
    			  timestamp :YYYY-MM-DD hh:mm:ss  默认使用当前时间
    			  
    			  text : 主要是用来存放文本
    			  blob :存放的是二进制
    
    
    
    列的约束:
    		主键约束 : primary key
    		唯一约束 : unique
    		非空约束 : not null
    
    创建表:
    	1.分析实体:学生
    	2.学生ID
    	3.姓名
    	4.性别
    	5.年龄
    create table student(
    	sid int primary key,
    	sname varchar(31),
    	sex int,
    	age int
    );
     			 		  
    

    查看表

    --查看所有的表
      show tables;
      
    --查看表的定义
      show create table student;
      
    --查看表结构
      desc student;
    

    修改表
    添加列(add),修改列(modify),修改列名(change),删除列(drop),修改表名(rename),修改表的字符集

    添加列(addalter table 表名 add 列名 列的类型 列的约束
    alter table student add chengji int not null;
    
    修改列(modifyalter table student modify sex varchar(2);
    修改列名(change)
    alter table student change sex gender varchar(2);
    删除列(dorp)
    alter table student drop chengji;
    
    修改表名(renamerename table student to studenttable;
    修改表的字符集
    alter table studenttable character set gbk;
    

    删除表

    drop table studenttable;
    

    Sql完全对表中的数据的CRUD的操作:
    插入数据

    insert into 表名(列名1,列名2,列名3values(值1,2,3; 
    
    --简单写法:如果插入式全列名的数据,表名后面的列名可以省略
    insert into 表名 values(1,2,3);
    insert into student values(2,'zhangsan',1,23);
    
    --注意:如果是插入部分列的话,列名不能省略
    insert into student(sid,sname) values(3,'lisi');
    insert into student values(3,'lisi');//这种写法是错误的
    
    --插入批量数据:
    insert into student(sid,sname,sex,age) values
    (1,'zhangsan',1,23),
    (2,'zhangsan',1,23),
    (3,'zhangsan',1,23),
    (4,'zhangsan',1,23),
    (5,'zhangsan',1,23),
    (6,'zhangsan',1,23);
    
    --单条插入和批量插入的效率
      看插入的数据多少,多的话就是批量插入的效率高
    
    --查看表的数据
    select * from student;
    

    命令行下插入中文问题:insert into student values(10,‘李四’,1,23);

    • 临时解决方案:set names gbk;相当于是高速mysql服务器软件,我们当前在命令行下输入的内容是GBK编码,当命令行窗口关闭之后,他在输入中文就会存在问题。
    • 永久解决办法:修改my.ini配置(在mysql软件安装路径里)
      1.暂停mysql的服务
      2.在mysql安装路径中找到my.ini配置文件;C:\Program Files\MySql Server 5.5
      3.将57行的编码改成gbk
      4.保存文件退出
      5.启动mysq服务

    删除表记录

    delete from 表名 [ where 条件 ]
    
    delete from student where sid = 10;
    delete from student; 如果没有指明条件  会将表中的数据一条一条全部删除掉
    
    --面试问题:请说一下 delete 删除数据 和 truncate 删除数据有什么差别
    	delete: DML 一条一条删除表中的数据
    	truncate :DDL 先删除表在重建表
    	关于哪条执行效率高:具体要看表中的数据量
    		如果数据比较少,delete比较高效
    		如果是数据比较多,truncate比较高效
    

    更新表记录

    update 表名 set 列名=列的值,列名=列的值2 [ where 条件]
      --将sid为5的名字改成李四
      --如果参数是字符串,日期要加上单引号
      update student set sname = ‘李四’ where sid = 5;
    
    
      update 表名 set 列名=列名值,列名2=列的值2 [ where 条件]
      
      update student set sname ='王五',sex='1';
      update student set sname ='赵六',sex='0' where sid=6;
    

    查询记录

    select [distinct][*] [列名,列名2] from 表名 [where 条件]
    distinct : 去除重复的数据
    
    --商品分类:手机数码,鞋子提包...
    1.分类的ID
    2.分类名称
    3.分类描述
    create table category(
      cid int primary key auto_increment,
      cname varchar(10),
      cdesc varchar(31)
    );
    
    insert into category values(null,'手机数码','kk电子产品,kk生产');
    insert into category values(null,'鞋子书包','kk皮鞋厂,kk生产');
    insert into category values(null,'香烟酒水','kk酒水,kk生产');
    insert into category values(null,'零食饼干','kk哇哈哈哈,kk生产');
    insert into category values(null,'零食辣条','kk威龙,kk生产');
    
    select * from category;
    select cname,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,'小米9',998,null,1);
    insert into product values(null,'1+',2888,null,1);
    insert into product values(null,'阿迪达斯',99,null,2);
    insert into product values(null,'老村长',88,null,3);
    insert into product values(null,'劲酒',35,null,3);
    insert into product values(null,'小熊饼干',1,null,4);
    insert into product values(null,'威龙辣条',1,null,5);
    insert into product values(null,'小辣条',1,null,5);
    
    --简单查询:
    ---查询所有的商品:
    	select * from product;
    ---查询商品名称和商品价格:
    	select pname,price from product;
    	
    ---别名查询 as 的关键字, as 关键字是可以省略的
    	--表别名: select p.pname ,p.price from product p;(主要是用在多表查询);
    	select p.pname,p.price from product as p;
    	--列别名: select pname as 商品名称 ,price as 商品价格 from product;
    	select pname as 商品名称,price as 商品价格 from product;
    	省略as关键字
    	select pname 商品名称,price 商品价格 from product;
    
    ---去掉重复的值
    	--查询商品所有的价格
    	select price from product;
    	select distinct price from product;
    
    --select 运算查询 : 仅仅在查询结果上做了运算 + - * /
     select *,price*1.5 from product;
     select *,price*1.5 as el折后价 from product;
    
     select *,price*0.9 from product;
    
    --调价查询 [ where 关键字]
    	指定条件,确定要操作的记录
    
    --查询商品价格>60元的所有商品信息
    select * from product where price > 60 ;
    
    --where 后的条件写法:
    	--关系运算符: >  >=  <   <=   =  !=  <>
    	<> : 不等于  :标准SQL语法
    	!= : 不等于  : 非标准SQL语法
    	--查询商品价格不等于88的所有商品:
    	select * from product where price <> 88;
    	select * from product where price != 88;
    
    	
    	--查询商品价格在 10 到 100 之间
    	select * from product where price > 10 and price >100;
    
    	between ...and...
    	
    	select * from product where price between 10 and 100;
    	
    	--逻辑运算:and , or ,not
    	
    	--查询出商品价格 小于100 或者商品价格 大于900
        select * from product where price <35 or price >900;
    
    	--like :模糊查询
    		_ : 代表的是一个字符
    		% : 代表的是多个字符
    	-- 查询出名字中带有饼的所欲商品 ‘%饼%’
    		select * from product where pname like '%饼%'
    	-- 查询第二名字是熊的所有商品  ‘_熊%’
    		select * from product where pname like '_熊%'
    
    	-- in 在某个范围中获取值
    	    --查询出商品分类ID在 1,4,5里面的所有商品
    	    select * from product where cno in (1,4,5);
    
    
    --排序查询 : order by 关键字
    	asc : ascend 升序 (默认的排序方式)
    	desc : descend 降序
    	
    	--0.查询所有的商品,按照价格进行排序
    	select * from product order by price
    	
    	--1.查询所有的商品,按价格进行降序排序(asc -升序  desc-降序);
    	select * from product order by price desc;
    
    	--2.查询名称有 小 的商品,按价格降序排序
    		1.查询名称有 小 的商品
    		select * from product where pname like '%小%';
    		2.进行排序得出结果
    		select * from product where pname like '%小%'; order by price asc;
    
    
    --聚合函数:
    		sum() :求和
    		avg() :求平均值
    		count() :统计数量
    		max() :最大值
    		min() :最小值
    	--1.获取所有商品价格的总和:
    	select sum(price) from product;
    	--2.获取所有商品的平均价格:
    	select avg(price) from product;
    	--3.获取所有商品的个数:
    	select count(*) from product;
    
    	--注意:where 条件后面不能接聚合函数
    	select * from product where price > avg(price);//这是错误的
    	--查询出商品价格大于平均价格的所有商品
    	查询所有商品
    	select * from product;
    	大于
    	平均价格
    	select avg(price) from product;
    	
    	select * from product where price > (select avg(price) from product);
    
    
    --分组 :group by
    	
    	--1.根据cno 字段分组,分组后统计商品的个数
    	select cno ,count(*) from product group by cno;
    
    	--2.根据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
    	
    
    
    展开全文
  • 数据库学习笔记(一)

    千次阅读 2021-03-15 09:51:17
    学习数据库主要学习的就是如何对数据进行增删改查操作. 为什么使用数据库软件? 之前通过IO技术可以对数据进行增删改查操作, 但是这些代码都自己写的话相当于自己写一个数据库软件, 自己写的数据库软件 执行效率和...
  • 数据库学习笔记(持续更新)

    万次阅读 2019-07-08 15:57:14
    数据库学习指南,数据库入门,MySQL,Redis,SQLyog,JDBC,Spring集成MySQL,Redis,如何学习数据库
  • SQL 数据库学习路线推荐

    千次阅读 2019-02-13 21:10:50
    昨天我们的星球里有位朋友咨询了个 SQL 数据库学习路线的问题。 一开始学数据库的时候,和学校里教的 C/C++/Java 完全不是一个路子的事。你学会了 C 中的函数,Java 中的方法,却无法理解 SELECT WHERE FROM 到底...
  • MySQL数据库学习

    万次阅读 多人点赞 2018-08-13 20:41:03
    虽然笔者从事的是Android客户端的开发,平时和数据库打的交道并不多,但是我们对于数据库这一块的学习还是很重要的,今天笔者想总结下MySQL关系型数据库的一些常用知识点 数据库概述 一、常见的概念 数据库...
  • Oracle数据库学习笔记(一)

    千次阅读 2019-09-19 11:46:30
    Oracle 数据库学习第一章 Oracle 数据库快速入门1.1 环境搭建 第一章 Oracle 数据库快速入门 1.1 环境搭建 写出Oracle安装的步骤 在 Oracle 官网下载 Oracle 11g 版本的数据库 (官网下载) Oracle服务端安装: - ...
  • Oracle数据库学习(一)--数据库原理及SQL标签: oracle 数据库 数据库原理 sql2016年03月22日 22:59:543089人阅读 评论(0) 收藏 举报 分类:数据库(6) 版权声明:本博客内容多为学习和工作笔记,有用的...
  • 数据库学习之MySQL (一)——数据库管理系统 DBMS 的流行度排名 分类等背景 数据库学习之MySQL (二)——MySQL的安装及环境配置 数据库学习之MySQL (三)——数据库小试牛刀 + 利用对象思维理解表行列 数据库学习之...
  • SELECT a.last_name, a.first_name, b.order_no FROM luo_persons a, luo_orders b WHERE a.id_p = b.id_p

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,084,535
精华内容 433,814
关键字:

数据库学习