mysql学习笔记(一)

一.数据库

1. 数据库介绍

数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以通过sql语句对数据库中的数据进行增加,修改,删除及查询操作

2. 关系型数据库

关系数据库(Relationship DataBase Management System 简写:RDBMS) ,描述是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。说白了就是描述实体与实体之间的关系的数据库.例如用户购物下订单,订单包含商品.

数据库发展历程如下所示:

l没有数据库,使用磁盘文件存储数据;

l层次结构模型数据库;

l网状结构模型数据库;

l关系结构模型数据库,使用二维表格来存储数据;

l关系-对象模型数据库;No-sql

3. 常见的关系型数据库 

Oracle数据库:Oracle是殷墟(yīn Xu)出土的甲骨文(oracle bone inscriptions)的英文翻译的第一个单词,在英语里是“神谕”的意思,由Larry Ellison 和另两个编程人员在1977创办,他们开发了自己的拳头产品,在市场上大量销售,1979 年,Oracle公司引入了第一个商用SQL 关系数据库管理系统。Oracle公司是最早开发关系数据库的厂商之一,其产品支持最广泛的操作系统平台。目前Oracle关系数据库产品的市场占有率名列前茅。

SQL Server数据库:1987 年,微软和 IBM合作开发完成OS/2IBM 在其销售的OS/2 ExtendedEdition 系统中绑定了OS/2Database Manager,而微软产品线中尚缺少数据库产品。为此,微软将目光投向Sybase,同Sybase 签订了合作协议,使用Sybase的技术开发基于OS/2平台的关系型数据库。1989年,微软发布了SQL Server 1.0 版。

DB2数据库:  作为关系数据库领域的开拓者和领航人,IBM1997年完成了System R系统的原型,1980年开始提供集成的数据库服务器—— System/38,随后是SQL/DSforVSEVM,其初始版本与SystemR研究原型密切相关。DB2 forMVSV1 1983年推出。该版本的目标是提供这一新方案所承诺的简单性,数据不相关性和用户生产率。1988DB2 for MVS 提供了强大的在线事务处理(OLTP)支持,1989 年和1993 年分别以远程工作单元和分布式工作单元实现了分布式数据库支持。最近推出的DB2 Universal Database 6.1则是通用数据库的典范,是第一个具备网上功能的多媒体关系数据库管理系统,支持包括Linux在内的一系列平台。

Sybase数据库:Sybase公司成立于1984年,公司名称“Sybase”取自“system”和 “database” 相结合的含义。Sybase公司的创始人之一Bob Epstein Ingres 大学版(与System/R同时期的关系数据库模型产品)的主要设计人员。公司的第一个关系数据库产品是19875月推出的Sybase SQLServer1.0Sybase首先提出Client/Server 数据库体系结构的思想,并率先在Sybase SQLServer 中实现。

MySQL数据库 mySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司。在2008116号被Sun公司收购。而2009年,Sun公司又被Oracle公司收购。目前MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库

4. 数据库管理系统

我们通常将数据库管理系统(DataBase Management System,简写dbms)称为数据库,大白话就是我们安装的软件,当我们安装了数据库之后(数据库服务器),就可以在数据库服务器中创建数据库,每个数据库中还可以包含多张表.

通过上述图我们知道了数据库与表之间的关系,那么我们的数据又是怎样存储在数据库中。

数据库中的表就是一个多行多列的表格。在创建表时,需要指定表的列数,以及列名称,列类型等信息。而不用指定表格的行数,行数是没有上限的。

表中的列我们称之为字段,表中的行我们称之为记录。

用我们熟悉的java程序来与关系型数据对比,就会发现以下对应关系。

-------

类中属性-------表中的字段

对象--------记录。

5. mysql数据库安装,卸载与配置

社区版下载:http://downloads.mysql.com/archives/community/mysql的安装与配置直接去问度娘

6. mysql登录

进入命令窗口

格式:mysql [-h主机地址] -u用户名 -p[密码]

启动mysql服务命令 net start mysql

关闭mysql服务命令 net stop mysql

7. mysql数据库密码重置

停止mysql服务器 运行输入services.msc 停止mysql服务

cmd,输入mysqld   --console  --skip-grant-tables 启动服务器,出现一下页面,不要关闭该窗口

新打开cmd,输入mysql -uroot  不需要密码

use mysql;

update user set password=password('abc') WHERE User='root';

关闭两个cmd窗口

二.SQL语句

1. SQL介绍

SQL:结构化查询语言(Structured Query Language),是一种数据库查询和程序设计语言,用于存取、查询、更新数据以及管理关系数据库系统.

2. SQL分类

数据定义语言:简称DDL(Data Definition Language),用来定义数据库对象:数据库,表,列等,例如创建、删除、修改数据库和表结构等;

数据操作语言:简称DML(Data Manipulation Language),用来对数据库中表的记录进行更新,例如:增、删、改表记录;

数据查询语言:简称DQL(Data Query Language),用来查询数据库中表的记录。

数据控制语言:简称DCL(Data Control Language),用来定义数据库的访问权限和安全级别,及创建用户;grant revoke 

DDL是对数据库或表的结构进行操作,而DML是对表的记录进行操作(增、删、改)。我们以后最常用的就是DDLDMLDQL

3.书写注意事项

SQL语句可以单行或多行书写,以分号结尾 

MySQL数据库的SQL语句不区分大小写,建议使用大写,例如:SELECT * FROM user

4. DDL(数据定义语言)

 对数据库的操作

(1)创建数据库

格式:create database 数据库名称;

例:

create database day04;-- 使用数据库默认字符集

扩展:

格式:create database [if not exists] 数据库名称 [character set 字符集] [collate 校对规则];
create database day0401 character set utf8;-- 使用指定的编码创建数据库
create database day0402 character set utf8 collate utf8_general_ci;-- 使用指定的编码和校对规则创建数据库

(2)删除数据库

格式:drop database数据库名称;

 例:

drop database day0402;

(3)修改数据库

修改数据库编码或者校对规则

格式:alter database 数据库名称  character set 编码 collate 校对规则

例如:

alter database day0401 character set gbk;-- 修改其字符集为gbk

(5)常见的命令

选库语句:

use 数据库名

查看所有数据库:

show databases;

查看数据库创建语句:

show create database 数据库名称;

查看字符集和校对规则:

show character set;

对表的操作

(1)查看已建表的建表语句

show create table 表名;

(2)删除表

drop table 表名;

(3)修改表名

rename table 表名 to 新表名;

(4)给表增加一列

alter table  表名 add  列名  tinyint unsigned not null default 0;
注意:tinyint表示整型
     unsigned表示该列的类型是:无符号的in型,范围0~255
注意:alter table  表名 add  列名1  tinyint unsigned not null default 0 after 列名2;
     是新加的列名1加在列名2的后面(更改了加入的列名的顺序);
     alter table  表名 add  列名1  tinyint unsigned not null default 0 first;
     加有first表示该新加的列放在第一列。

(5)删除表中的列

alter table 表名 drop 列名;

(6)修改表中的列的列名及列类型

alter table 表名 change 旧列名 新列名 新列类型 列参数;

(7)修改表中的列(列类型及列参数,不能改列名)

alter table 表名 modify 列名 int unsigned not null default 0;

(8)清空表数据

truncate 表名;
注意:truncate 和 delete区别:
    truncate:相当于删除当前这张表再新建一张同样结构的空表,操作后得到的是一张全新的表。
    delete:是从删除所有行数据的层面来操作的。清空所有的数据,表还是原来的那张表。
    速度:truncate速度快些。

(9)查看表结构

desc 表名;

(10)创建表

create table 表名(
   字段名 类型(长度) 约束,
   字段名 类型(长度) 约束
);

Java                 MYSQL
int                  int
float                float
double               double
char/String          char/varchar  (char固定长度字符串,varchar可变长度的字符串)
Date                 date,time,datetime,timestamp
文件类型              BLOB、TEXT     (TEXT指的是文本文件  BLOB二进制文件)
Oracle的文件类型:BLOB CLOB 约束: 单表约束: * 主键约束:primary key * 唯一约束:unique * 非空约束:not null 创建一个分类表: 分类ID int类型主键 自动增长 分类名称 字符串类型 长度20 create table category( cid int primary key auto_increment, cname varchar(20) ); ***** 注意:建表之前一定先选择数据库.

例:

create table class(
        id int primary key auto_increment,
        sname varchar(10) not null default '',
        gender char(1) not null default '',
        company varchar(20) not null default '',
        salary decimal(6,2) not null default 0.00,
        fanbu smallint not null default 0
    )engine myisam charset utf8;

MySQL 数据类型

MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。

数值类型

MySQL支持所有标准SQL数值数据类型。

这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。

关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。

BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。

作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。

日期和时间类型

表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。

每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。

字符串类型

字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。

 

CHAR和VARCHAR类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。

BINARY和VARBINARY类类似于CHAR和VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。

BLOB是一个二进制大对象,可以容纳可变数量的数据。有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们只是可容纳值的最大长度不同。

有4种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。这些对应4种BLOB类型,有相同的最大长度和存储需求。

5. DML(数据操作语言)

插入数据

不指定列插入

insert into 表名 values(字段值1,字段值2,...);

例如:

nsert into user values(null,'laobai','1234','male','laobai@126.com',null,null);

注意:

没有给出要插入的列,表示插入所有列;

值的个数必须是该表的列的个数;

值的顺序,必须与表创建时给出的列的顺序相同。

插入指定列值:

insert into 表名(字段名1,字段名2,...) values(字段值1,字段值2,...);

例如:

nsert into user(username,password,email,registTime) values('laoqi','1234','laoqi@126.com',null);

注意:表名后面是当前表中部分字段名称

插入全部列值:

insert into 表名(字段名1,字段名2,...) values(字段值1,字段值2,...);

例如:

insert into user(id,username,password,gender,email,role,registTime) values(1,'shijin','1234','male','shijin@126.com',null,null);

注意:

表名后面是当前表中所有字段()

多个字段之间使用逗号分隔

字段值必须使用引号(建议单引号),如果是整型数据引号可以省略。

更新数据

格式:

update 表名 set 字段名1=字段值1, 字段名2=字段值2, ..... [where 条件];

例如:

1.update user set gender='male' ;## 修改所有人的性别为’male’
2.update user set username='xusanduo',email='xusanduo@qq.com' where id=3;## 修改id为3的人username和email.

 删除数据

格式:

delete from 表名 [where 条件];

例如:

1.delete from user;## 删除所有
2.delete from user where id=6; ##删除id为6的记录.

扩展:

删除整张表的内容,两种实现方式:

1.delete from 表名;

2.truncate [table] 表名;

区别:

1.delete属于DML语句 ,truncate属于DDL语句

2.delete是一行一行删除,truncate是将表结构销毁,重新创建表结构,数据多的时候,效率高.

6. 约束

mysql中常用的约束有主键约束,非空约束,唯一约束,外键约束

主键约束(primary key)

用于标识当前记录的字段。可以是一个字段,也可以是多个字段。它的特点是:数据唯一,不能为null.

三种写法:

格式1:定义表,声明字段时,定义主键.特点:primary key 只能修饰一个字段

例如:

create table user01(
  id int primary key,
  username varchar(20)
);

格式2:定义表,声明字段之后,在约束区域定义主键。特点  [constraint] primary key (字段1,字段2,....) 可以设置多个字段

例如:

create table user02(
     id int ,
     username varchar(20),
     primary key(id)
);

格式3:定义表,声明字段,表创建之后。修改表结构添加约束。特点:也可以设置多个字段,更灵活。

create table user03(
    id int ,
    username varchar(20)
);
alter table user03 add primary key(id);

一般主键idint的时候,还习惯配合 auto_increment使用,使主键自增.插入数据的时候,id列可以不写,写的时候写null,让数据库维护id.

create table user04(
    id int primary key auto_increment,
    username varchar(20)
);

 唯一约束(unique)

被修饰的字段不能重复,但是null值不起作用

三种写法:

格式1:定义表,声明字段时,定义唯一约束.特点:unique 只能修饰一个字段

例如:

create table user01(
  id int unique,
  username varchar(20)
);

格式2:定义表,声明字段之后,在约束区域定义唯一约束。特点  [constraint] unique (字段1,字段2,....) 可以设置多个字段

例如:

create table user02(
     id int ,
     username varchar(20),
     unique(id)
);

格式3:定义表,声明字段,表创建之后。修改表结构添加约束。特点:也可以设置多个字段,更灵活。

例如:

create table user03(
    id int ,
    username varchar(20)
);
alter table user03 add unique(id);

非空约束(not null)

被修饰字段不能为null.

格式:定义表,声明字段时,添加非空约束

例如:

create table user01(
    id int,
    username varchar(20)  not null default ‘xu’
);

还可以使用default,给定一个默认值.

7. DQL

select基本查询

查询指定列

select 字段 from 表名;

查询指定字段信息,如果要查询多个字段

select 字段1,字段2,...from 表名;    

查询所有列

select * from 表名;

注意:使用"*"在练习,学习过程中可以使用,在实际开发中,不建议使用。

去掉重复记录

select distinct 字段 from 表名;                
注意:distinct它的作用是去除重复.

使用别名

使用as 别名可以给表中的字段,表设置别名.

例如:

select name as 书名 from products;

在查询中可以直接对列进行运算,我们在sql操作中,可以直接对列进行运算。

where字句

我们在开发中,使用select操作,一般都是有条件查询,那以我们介绍一下关于where子句的使用

格式 :select 字段  from 表名  where 条件;
where条件种类:
1.比较运算符 > >= < <= = !=(<>) 2.逻辑运算符 and or not 3.between ...and 相当于 >= and <= 注意:between 后面的值必须是小值 and后面的是大值
4.in 可以比较多个值 5.like 模糊查询 通配符使用:1.% 匹配多个 2._ 匹配一个 6.null值操作 is null; 判断为空 is not null; 判断不为空

 order by 排序

在开发中,我们从数据库中查询出的数据经常需要根据某些字段进行排序,可以使用order by关键字,后面跟的就是要排序的列,order by 子句是select的最后的一个子句。 `

asc 升序 (默认)

desc 降序

 聚集函数

之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个单一的值;另外聚合函数会忽略空值。

count:统计指定列不为NULL的记录行数;

sum:计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0

max:计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;

min:计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;

avg:计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0

注意

select count(名称) from 表名;

count(*),count(1):查询的是绝对的行数,null也会计算在内

count(列名):除去Null剩下所有的列

count(*)和count(1)区别:
对应myisam引擎的表没有区别,改引擎内部有一个计算器在维护着行数。
innodb的表用count(*)效率会很低,因为innodb要从头到尾的数一遍。

group by分组

分组查询是指使用group by字句对查询信息进行分组,例如:我们要统计出products表中所有分类商品的总数量,这时就需要使用group by 来对products表中的商品根据category进行分组操作.

分组后我们在对每一组数据进行统计。

分组操作中的having子句是用于在分组后对数据进行过滤的,作用类似于where条件。

注意:

havingwhere的区别

1.having是在分组后对数据进行过滤. where是在分组前对数据进行过滤

2.having后面可以使用分组函数(统计函数),where后面不可以使用分组函数

DQL语句操作总结

综合我们学习的查询相关关键字:selectfromwheregroup byhavingorder by;它们的执行顺序是如下:

from:首先执行from,找到要查询的表;

where:判断条件,筛选符合条件所有记录;

group by:根据之前操作对记录按照指定列进行分组

having:对分组后的信息进行筛选;

select:选择所需要的列信息;

order by:对查询信息进行排序。

SQL语言中,第一个被处理的子句是from字句,尽管select字句最先出现,但是几乎总是最后被处理。

 

posted @ 2017-11-21 10:28  奋斗中的咸鱼  阅读(183)  评论(0)    收藏  举报