第一篇:My SQL 第7章 教案
7.1 存储过程
一、存储过程的创建格式: a)格式:
create procedure 存储过程名称([参数列表])[begin]
存储过程中执行的命令序列;[end] 结束符
b)参数的定义(参数可有可无,但小括号必须要),包括三部分: i.输入|输出模式
1.in 输入型参数(默认),从外部调用环境将值输入到存储过程内部,传递的方向:实参值-形参变量 2.out 输出型参数,从存储过程输出值到外部调用环境的变量,传递的方向:形参变量-实参变量
3.in|out 输入|输出型参数,从外部调用环境将值输入到存储过程内部,对数据进行处理,然后将新的结果再由存储过程输出到外部调用环境的变量,传递的方向:实参变量-形参变量-实参变量 ii.iii.iv.参数名称 数据类型 例如:
1.create procedure addValue1(in oper1 int,in oper2 int,out sum int)……
2.create procedure swapValue(inout oper1 int,inout oper2 int)……
c)结束符的定义: i.结束符定义的原因:因为在mySQL环境中 默认使用分号 作为结束符号,而每条语句输入完成后也是使用分号作为结束标记的。因此在定义存储过程的内部,如果需要写入多条语句,那么在第一条语句结束写 分号 的时候,整个存储过程的定义也就被结束了,因此,需要为mySQL环境定义额外的结束符作为结束标记。
ii.结束符定义的格式: delimiter 结束符号 iii.结束符的使用:
1.在存储过程内部(即begin end之间)仍然使用 分号 作为语句的结束标志。
2.在存储过程定义结束后(即 end 的后面)需要使用自己定义的结束符作为整个存储过程定义结束的标志。d)在存储过程中处理2条以上命令的时候,应该加上begin...end,如果只包含1条语句,可以省略begin...end关键字。i.例如:
create procedure pro1()set @a=100;$
create procedure pro2()begin set @a=100;set @b=1000;end;$
二、简单存储过程的例题 a)不执行任何操作的存储过程
delimiter!
create procedure pro3()begin end!
b)存储过程的执行:call 存储过程名称([实参列表]);
c)在别的数据库语言中这样做是不允许的。因为它们要求begin 和 end 之间至少存在一条语句。如下面的代码: create procedure pro4()begin null;end!使用null关键字表示不执行任何操作,但是这样做在MySQL中是不允许的。
d)查看错误信息
show errors
三、存储过程中的注释符号: a)单行注释符 i.--
该注释符需要注意:注释符和注释的内容之间要
有空格,否则语法错误 ii.# 该注释符和注释的内容之间的空格可有可无
b)多行注释符 i./*……*/ c)例题:
create procedure pro5()begin set @a=100;--定义一个用户变量@a set @b=1000;#定义一个用户变量@b set @c=1000;/*定义一个
用户变量@c*/ end;$
四、局部变量的定义和使用
a)局部变量的概念:在存储过程内部声明的变量,称为局部变量,这样的变量只能局限于存储过程内部使用。该变量不同于前面学的用户变量。b)局部变量的定义: i.在begin…end之间进行定义。ii.使用declare关键字进行定义,并且定义的同时可以赋值。格式: declare 变量名,[变量2] 数据类型 [default 默认值];注意,此处只能使用default设置默认值,不能用等号 iii.必须遵循先定义后使用的原则。
c)局部变量与用户变量的不同: i.ii.命名格式不同:局部变量前面没有@
定义和使用范围不同:局部变量只能在当前定义它的存储过程内部使用;而用户变量可以在当前的整个会话范围使用,包括存储过程。iii.用户变量不用事先定义,可以直接赋值使用,而且数据类型是随着赋予它的值而确定的。但局部变量必须先定义后使用,见下面的两个例子。iv.赋值方式不同,如下面。
d)分别使用set和select关键字为局部变量和用户变量赋值
首先要注意,为局部变量或用户变量赋值时,不能直接写成变量名 = 值;等号 运算符应该 配合set或 select 关键字一起使用。i.局部变量的赋值: 1.set 局部变量名=值 2.set 局部变量名:=值
3.select值 into 局部变量名
注意:由于局部变量的局限性,所以为局部变量的赋值的这些语句只能在存储过程内部执行。ii.用户变量的赋值方式: 1.set @用户变量名=值
2.set @用户变量名:=值
3.select 值 into @用户变量名
4.select @用户变量名:=值
--这种形式只能用在用户变
--量的赋值上
注意:由于用户变量可以在整个会话的范围内使用,所以这些命令既可以在存储过程内部执行,也可以在存储过程的外部执行。iii.局部变量与用户变量的定义、赋值例题: 1.例6:局部变量的定义与赋值 create procedure pro6()begin declare a,b,c,d int;set a=10;set b:=20;select 30 into c;--select d:=40;end$ 2.例7:用户变量的定义与赋值 create procedure pro7()begin set @a=10;set @b:=20;select 30 into @c;--这种格式也可以直接在提示符下使用
select @d:=40;end$ 3.例8:局部变量与用户变量不同的使用范围 call pro6()$ call pro7()$
select a$--局部变量a超出了使用范围,访问失败 select @a$--用户变量@a可以在整个会话中使用
五、有参数存储过程的定义与调用 a)不同模式的形参对应的实参: i.ii.iii.in模式的形参,它的实参可以是常量、变量和表达式; out模式的形参,它的实参只能是变量; inout模式的形参,它的实参只能是变量;
b)输入型参数与输出型参数的使用 i.例1:
create procedure addValue(in oper1 int,in oper2 int,out sum int)begin set sum=oper1+oper2;
end$ 或者写成:set sum:=oper1+oper2;select oper1+oper2 into sum;也就是说,形参本质与局部变量相同,所以赋值方式也相同。注意:add是关键字 sum不是关键字 上面存储过程的调用: delimiter;set @number;call addValue(10,20,@number);select @number;ii.例2:使用用户变量保存存储过程的值
delimiter $ create procedure addValue1(in x int,in y int)begin select @z:=x+y;
end$ call addValue1(1,2)$ select @z$ c)输入输出型参数的使用 i.写法一:
delimiter$ create procedure swapValue(inout oper1 int,inout oper2 int)begin set oper1=oper1+oper2;set oper2=oper1-oper2;set oper1=oper1-oper2;end$ ii.写法二:
create procedure swapValue1(inout oper1 int,inout oper2 int)begin declare temp int;set temp=oper1;set oper1=oper2;set oper2=temp;end$ iii.调用: set @a=10,@b=20$ call swapValue(@a,@b)$ select @a,@b$
六、标准SQL语句在存储过程中的使用 a)DML语句在存储过程中的使用 i.insert 语句在存储过程中的使用
create procedure insert_xs(in xh char(6),xm char(8),zym char(10),xb tinyint,csrq date,zxf tinyint)begin insert into xs(学号,姓名,专业名,性别,出生日期,总学分)values(xh,xm,zym,xb,csrq,zxf);end$ 调用插入的存储过程:
call insert_xs('1','张三','软件开发',1,'1990-9-8',40)$ call insert_xs('2','李四','软件开发',1,'1990-9-8',40)$ ii.update语句在存储过程中的使用
create procedure update_xs(in xh char(6),zym char(10))begin update xs set 专业名=zym where 学号=xh;end$ 调用修改的存储过程: call update_xs('2','计算机网络')$ iii.delete语句在存储过程中的使用
create procedure delete_xs_byID(in xh char(6))begin delete from xs where 学号=xh;end$ 调用删除的存储过程: call delete_xs_byID('1')$ iv.select语句在存储过程中的使用
create procedure select_xs_byID(xh char(6),out name char(8))begin select 姓名 into name from xs where 学号=xh;end$ 注意两点:
调用查询的存储过程:
call select_xs_byID('081101',@name)$ select @name$ b)DCL语句在存储过程中的使用 c)DDL语句在存储过程中的使用
七、流程控制语句在存储过程中的使用
八、处理程序和条件
九、游标的定义与使用
十、删除存储过程
十一、修改存储过程
7.2 存储函数
第二篇:mysql教案讲解
1、数据库概述
1.1 什么是数据库
数据库DataBase 就是一个存储数据的仓库。
为了方便数据的存储和管理,它将数据按照特定的规律存储在磁盘上。通过数据库管理系统,可有效地组织和管理存储在数据库中的数据。
1.2 文件与文件系统
所谓“文件”一般指存储在外部介质上数据的集合,是操作系统(确切地说是文件系统)管理数据的基本单位。
1.3 文件系统和数据库系统之间的区别和联系
1.3.1 区别
(1)文件系统用文件将数据长期保存在外存上,数据库系统用数据库统一存储数据;
(2)文件系统中的程序和数据有一定的联系,数据库系统中的程序和数据分离;
(3)文件系统用操作系统中的存取方法对数据进行管理,数据库系统用DBMS统一管理和控制数据
(4)文件系统实现以文件为单位的数据共享,数据库系统实现以记录和字段为单位的数据共享。
1.3.2 联系
(1)均为数据组织的管理技术;
(2)均由数据管理软件管理数据,程序与数据之间用存取方法进行转换;(3)数据库系统是在文件系统的基础上发展而来
1.3.3 读写数据库与读写文件哪个更快 1.4 数据存储方式
学校需要存储学生和教师信息 公司需要存储员工信息和公司的资料
这些数据或者信息是如何存储的?数据存储方式经历了三个阶段:人工管理阶段、文件系统阶段、数据库系统阶段(注:新兴数据存储系统--例如google的bigtable)。
1.4.1 人工管理阶段
磁带、磁盘、手工记录
1.4.2 文件系统阶段
数据存储在计算机的磁盘上,数据以文件的形式出现,通过文件系统来管理这些文件,文件系统通过路径和文件访问文件中的数据
1.4.3 数据库系统阶段
使用专门的数据库来管理数据。用户在数据库系统中建立数据库,然后在数据库中建立表,最后将数据存储在这些表中--表是数据库存储数据的基本单位。
用户通过数据库管理系统来查询表中的数据。1.5 常用的数据库
甲骨文的Oracle:大型数据库,Linux/WINDOWS/Soloras/SUSE Sybase:大型数据库
Mysql:开源,中大型数据库,Linux/Windows/… 微软SQL Server:Windows Postgre SQL:安全开源免费,中型,Linux Access:
SQLITE:小型数据库,Linux/Windows,嵌入式系统
1.6 数据库技术构成
数据库技术是解决数据存储、管理、统计、查询等处理而使用的一门广泛技术 数据Data:是数据库中存储的基本对象,是描述事物的符号,如数字、文件、图形、图像等
数据库Database,DB:是长期储存在计算机内、有组织的、可共享的数据集合。数据库管理系统 Database Management System,DBMS:是位于用户与操作系统之间的管理数据库的软件(定义、管理和维护数据)。MySql是一中DBMS。数据库系统 Database System--DBS:是指在计算机系统中引入数据库后的系统。其组成如下:计算机系统、数据库、数据库管理系统及其开发工具、人员(数据库管理员DBA、终端用户)
通常情况下,把数据库系统简称为数据库。
SQL(Structed Query Language)语言 :结构化查询语言,是数据库管理系统通过SQL语句来操作数据库中的数据。标准的SQL命令,比如“Select”、“Insert”、“Update”、“Delete”、“Create”和 “Drop”常常被用于完成绝大多数数据库的操作。
数据库访问技术:
ODBC(Open Database Connectivity开放式数据库连接)
是应用程序和数据库系统之间的中间件,用来在数据库管理系统中存取数据的标准应用程序接口。
它通过使用相应应用平台上和所需数据库对应的驱动程序与应用程序的交互来实现对数据库的操作,避免了在应用程序中直接调用与数据库相关的操作,从而提供了数据库的独立性。
JDBC / JDO(Java Data Base Connectivity,java数据库连接)
是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,同时,JDBC也是个商标名。
C API(C语言连接数据库)
MySQL提供C语言使用的API.C代码的API是随MySQL一起发布的.它包含在mysqlclient库中, 可以使C程序来访问数据库.综上所述,数据库技术主要包括:数据库系统、SQL语句、数据库访问技术
1.7 MySQL逻辑架构
一张好的图片会是你更容易理解MySQL各个组件的工作方式。
1、最上一层所包含的服务并不是MySQL所独有的技术。它们都是服务于C/S程序或者是这些程序所需要的:连接处理,身份验证,安全性等等。
2、第二层是我们所感兴趣的。这是MySQL的核心部分。包括了查询的解析,分析,优化,缓存以及所有内置的函数(如日期,时间,数学运算,加密)。还有一些功能是涉及到了存储引擎,如存储过程,触发器,视图等。
3、第三层包括了存储过程。它们负责存储和获取所有存储在MySQL中的数据。就像Linux众多的文件系统一样。每个存储引擎都有自己的优点和缺陷。服务器是通过存储引擎API来与它们交互的。这个接口隐藏了各个存储引擎不同的地方。对于查询层尽可能的透明。这个API包含了很多底层的操作。如开始一个事物,或者取出有特定主键的行。存储引擎不能解析SQL,互相之间也不能通信。仅仅是简单的响应服务器的请求。
连接管理和安全
在服务器内部,每个client连接都有自己的线程。这个连接的查询都在一个单独的线程中执行。这个线程存在于一个核心或者CPU中。服务器缓存了线程,因此不需要为每个client连接单独创建和销毁线程。
当clients(也就是应用程序)连接到了MySQL服务器。服务器需要对它进行身份验证。这个身份验证是基于用户名,主机,以及密码。也使用了X.509的SSL连接。clients一连接上,服务器就验证它的权限。如这个client是否可以查询world数据库下的Country表的数据。这部分将在独立的章节进行说明。
优化和执行 MySQL的解析查询是创建了一个内部的结构(一个语法分析树)。之后就进行了各种各样的优化。这些优化包括了,查询语句的重写,读表的顺序,索引的选择等等。你可以通过查询语句的关键词对优化器进行一定的提示。这样做会影响到它的优化方式。你也可以让服务器对于各种优化进行说明。这样可以得知服务器的运行策略以及为了获得更好的效率,可以做更多的优化工作,如查询优化等。优化器会在以后的教程中详细介绍。
优化器是不会关心表所用到的存储引擎的类型,但是存储引擎会影响到服务器优化查询的方式。优化器需要知道存储引擎的一些特性,这些操作的消耗以及表数据的一些统计信息。例如,一些存储引擎支持索引,这对于查询是非常有用的。
在解析查询之前,要查询缓存,这个缓存只能保存查询信息以及结果数据。如果请求一个查询在缓存中存在,就不需要解析,优化和执行查询了。直接返回缓存中所存放的这个查询的结果。
MySQL体系结构介绍:
存储引擎负责管理数据存储,以及MySQL的索引管理。通过定义的API,MySQL服务器能够与存储引擎进行通信。每个存储引擎均是1个继承类,每个类实例作为处理程序而被引用。
针对需要与特殊表一起工作的每个线程,处理程序是在1个处理程序的基础上实例化的。例如,如果3个连接全都在相同的表上工作,需要创建3个处理程序实例。
一旦创建了处理程序实例,MySQL服务器将向处理程序发送命令,以便执行数据存储和检索任务,如打开表、操纵行和管理索引等。
能够以累进方式创建定制存储引擎:开发人员能够以只读存储引擎启动,随后添加对INSERT、UPDATE和DELETE操作的支持,甚至能够增加对索引功能、事务和其他高级操作的支持
2.Linux平台下安装配置MySQL MySQL语言
SQL功能强大,但是概括起来,它可以分成以下几组:
DDL(数据定义语言): 用于定义数据的结构,比如 创建、修改或者删除数据库对象;
DML(数据操作语言):用于检索或者修改数据;
DCL(数据控制语言):用于定义数据库用户的权限。
3.1 DDL 可以用于创建用户和重建数据库对象。下面是DDL命令: CREATE TABLE:创建数据库表 ALTER TABLE :修改数据库表 DROP TABLE :丢弃数据库表 CREATE INDEX :创建索引 DROP INDEX:丢弃索引
3.2 DML 可以细分为以下的几个语句: SELECT:用于检索数据;
INSERT:用于增加数据到数据库;
UPDATE:用于从数据库中修改现存的数据
DELETE:用于从数据库中删除数据。
3.3 DCL 用于创建关系用户访问以及授权的对象。下面是几个DCL命令:
ALTER PASSWORD :修改访问授权密码 GRANT :授权用户访问数据库表 REVOKE :废除用户授权 CREATE SYNONYM:
3.4 表、字段、记录
在关系型数据库中,表就是一个数据的集合体,简单地理解就是一个二维(行与列有简单对应关系的)数据表格。
字段是指表格中的列,即具有相同属性的数据集合,每个字段都必须有一个唯一的名称,称为字段名。例如,在表格中,如果用一列存放“性别”,“性别”就是一个字段名。记录是指表格中的行,它由若干个字段值构成。例如,用于记录每个成员的表中,可以有昵称、年龄、性别、电子邮件等字段,添加进表中的每一个成员,都包含有昵称、年龄、性别、电子邮件这些数据,每个成员的这些数据构成一条记录。
下面给出一张学生表,表中id、name、gender、birth、class都是字段,而行中包含了这个表的一个记录,即每个学生的ID,名字,性别,生日等:
4.MySQL数据库基本操作
4.1 基本操作
4.1.1 连接登录MySql 语法:mysql-u用户名-p密码-h服务器名称-P端口
1)、连接到本机 mysql-u root-p Enter password: **-----------------------2)、连接到远程主机上 mysql-h localhost-u root-p Enter password: ** 4.1.2 退出MySql操作界面
mysql> quit;mysql>exit;4.1.3 修改密码
mysqladmin-u root –psa(旧密码)password chx(新密码)4.1.4 显示当前存在的数据库
mysql> show databases;
或者多行命令 mysql> show
-> databases->;
4.1.5 创建一个数据库
语法:create database [if not exists] 数据库名称 [default character set '字符集'] mysql> create database if not exists db1 default character set 'utf8';4.1.6 删除一个数据库
语法:drop database [if exists] 数据库名称 mysql> drop database db1;4.1.7 选择数据库并显示当前选择的数据库
mysql> use mysql;4.1.8 显示当前数据库中存在的表
语法:show tables [like '表达式']
mysql> show tables;4.2 SQL数据类型
smallint32 位元的整数。
decimal(p,s)32位元的实数。
Doublen 长度的字串,n不能超过 254。
varchar(n)和 char(n)一样,不过其单位是两个字元 double-bytes,n不能超过127。这个形态是为了支援两个字元长度的字体,例如中文字。
vargraphic(n)包含了 年份、月份、日期。
time包含了 年、月、日、时、分、秒、千分之一秒。
4.3 主键、外键、索引
主键(primary key)能够唯一标识表中某一行的属性或属性组。一个表只能有一个主键,但可以有多个候选索引。主键常常与外键构成参照完整性约束,防止出现数据不一致。主键可以保证记录的唯一和主键域非空,数据库管理系统对于主键自动生成唯一索引,所以主键也是一个特殊的索引。
比如学生表里有学号和姓名,姓名可能有重名的,但学号确是唯一的,你要从学生表中搜索一条纪录如查找一个人,就只能根据学号去查找,这才能找出唯一的一个,这就是主键;如:id int(10)not null primary key auto_increment ;自增长的类型 外键(foreign key)是用于建立和加强两个表数据之间的链接的一列或多列。外键约束主要用来维护两个表之间数据的一致性。简言之,表的外键就是另一表的主键,外键将两表联系起来。一般情况下,要删除一张表中的主键必须首先要确保其它表中的没有相同外键(即该表中的主键没有一个外键和它相关联)。索引(index)是用来快速地寻找那些具有特定值的记录。主要是为了检索的方便,是为了加快访问速度,按一定的规则创建的,一般起到排序作用。所谓唯一性索引,这种索引和前面的“普通索引”基本相同,但有一个区别:索引列的所有值都只能出现一次,即必须唯一。总结:
主键一定是唯一性索引,唯一性索引并不一定就是主键。一个表中可以有多个唯一性索引,但只能有一个主键。主键列不允许空值,而唯一性索引列允许空值。
主键可以被其他字段作外键引用,而索引不能作为外键引用。
4.4 数据表操作 4.4.1 创建一个表
语法:create table [if not exists] 数据表名称(列定义[,....])示例:
mysql> create table tb1(-> id int auto_increment primary key,-> name varchar(20)->);
列定义:
列名称 数据类型 [null|not null] [primary key][unique][auto_increment][default 默认值]
4.4.2显示表(db)的内容
mysql>select * from tb1;4.4.3 查看表tb1的字段描述
语法:show columns from 数据表 语法:desc[ribe] 数据表
mysql> show columns from tb1;mysql> describe tb1;mysql> desc tb1;4.4.4 修改数据表
语法如下:
ALTER TABLE “table_name“ 【改变方式】 改变方式分:
ADD :在表中增加一列,ADD 列名 数据类型
CHANGE:修改表中某一列的名字,CHANGE 列名 新列名 MODIFY:改变某一列的数据类型,MODIFY 列名 数据类型
DROP:丢弃某一列
1· 添加列
语法1:alter table 数据表名称 add 列定义 first 语法2:alter table 数据表名称 add 列定义 after 列名称 语法3:alter table 数据表名称 add(列定义,...)示例:
mysql> alter table tb1 add age int first;mysql> alter table tb1 add age2 int default 10 after id;mysql> alter table tb1 add sex tinyint default 0;2· 删除列
语法:alter table 数据表名称 drop 列名称 示例:
mysql> alter table tb1 drop age 3· 修改列定义 语法:
alter table 数据表名称 modify 列名称 数据类型 示例:
mysql> alter table tb1 add memo varchar(100);mysql> alter table tb1 modify memo char(1);mysql> desc tb1;4· 修改列名称及定义 语法:
alter table 数据表名称 change 旧列名称 新的列名称 列定义 示例:
mysql> alter table tb1 change memo memo1 varchar(200);4.4.5 修改数据表名称
语法:
alter table 数据表名称 rename 新表名称 示例:
mysql> alter table tb1 rename user;4.4.6 删除数据表
语法:drop table [if exists] 数据表名称 4.4.7 清空数据表
语法: TRUNCATE TABLE ”表格名“ 如清空grade表:
TRUNCATE TABLE grade 4.4.8 插入记录
语法:
INSERT INTO “表格名”(“列1”, “列2”,...)VALUES(“值1”, “值2”,...);
例如向student表中插入一条学生记录:
INSERT INTO student(name, gender, birth,class)VALUES(‘Sun Nan’, ‘M’, ‘1973-03-19’, 1);注:因为id字段为自增长的,所以可以不用指定值,另,插入的时候如果指定列的值为唯一属性的话则插入相同的值时会失败。比如说在student表中,不能存在两条id为2的记录,但可以存在两条name为“Sun Nan”的记录。
4.4.9更新记录
格式:UPDATE “表格名” SET 列1 = [新值1], 列2=[新值2]… WHERE {条件};如我们修改“Sun Nan”同学的出生日期为“1972-08-29”,所在的班级id为2,执行的语句为:
UPDATE student SET birth=‘1972-08-29’, class=2 WHERE name=‘Sun Nam’;
4.4.10 删除记录
格式:DELETE FROM ”表名" WHERE {条件} 如从grade表中删除student_id为2的记录: DELETE FROM grade WHERE student_id=2;如果要删除表中所有的数据: DELTE FROM grade;
5.练习
创建学生表student : create table student(id
int auto_increment,name
varchar(32),gender
int default 1,birth
varchar(20),class
int,primary key(id));创建班级表class create table class(id
int not null,class_name
varchar(32),begin_time
varchar(20),teacher
varchar(32),primary key(id));创建成绩表grade: create table grade(id
int auto_increment,student_id
int,class
int,chinese
int,math
int,exam_time
varchar(20),primary key(id));
6.select 语句
SELECT语句主要被用于查询数据库中的一个或多个表里的数据。格式:
SELECT [ 例如: mysql> select * from user;mysql> select name from user; 许多子句及它们的结合都可以用于SELECT语句中: FROM:指定从哪些表中获取数据 DISTINCT:消除重复的记录行 WHERE:只返回满足特定条件(也叫过滤器)的记录行 ORDER BY:按照表达式列表排序记录 LIMIT:返回特定部分的数据,而不是所有的结果集 格式: SELECT DISTINCT 6.1使用FROM • • • FROM子句在SELECT语句中是可选项,它出现在语句的表达式之后 FROM子句指定语句要处理的表。表的别名 在SQL语句里,在FROM子句里引用的表可以给定一个临时的名称,该名称叫做表的别名。• 示例: mysql> select id, name, sex, age from user where id = 1; mysql> select u.id, u.name, u.sex, u.age from user u where id = 1;6.2 使用DISTINCT • 如果查询的结果中包含重复的记录,该重复记录要被删除以生成每行都是唯一的结果集。为了达到这个目的,可在SELECT关键字后添加DISTINCT关键字。• • 在指定的列里,DISTINCT将所有的NULL值当作相同的值。示例: mysql> select distinct work from user;6.3使用WHERE • MySQL支持许多不同类型的运算符,这依赖于操作数的数据类型,或操作数与运算符处理的值的数据类型。 – 运算 – 比较 – 逻辑 • 示例: mysql> select * from user where age<20; mysql> select * from user where age >30 and(work='java' or work='c++');mysql> select * from user where age >30 and work in('java','c++');6.4关于NULL 如果有一个操作数的结果是NULL,则大多数运算符的求值结果也会是NULL。当NULL值表达式在函数中被用于操作数时,运算符将产生NULL。 WHERE子句也有相同的情况,WHERE子句会丢弃那些条件不是TRUE的记录。示例: mysql> select NULL+age from user;6.5 在SELECT语句里使用ORDER BY 如果有必要让输出记录按某一特定的顺序返回,可以使用ORDER BY子句以显示如何排序结果集。示例: mysql> select * from user order by age;DESC:降序 ASC:升序 示例: mysql> select * from user order by age desc;mysql> select * from user order by age asc;6.6 在SELECT语句里使用LIMIT 当一个查询返回许多记录行时,有必要通过增加LIMIT子句来限定只显示部分记录。LIMIT子句可以采用以下一个或两个参数: LIMIT row_count LIMIT skip_count, row_count 示例: mysql> select * from user limit 5;mysql> select * from user limit 5,5;它常见的用处是获取包含某个特定列的最小或最大值的行 示例(查找user表中年龄最大的): mysql> select * from user order by age desc limit 1; 6.7 聚集查询结果 有可能出现这种情况,结果集里的一行对应于底层基表里的一组记录行。这个过程叫聚合,并且这样一个结果集被称为聚集。计算一组值的摘要值的函数(例如AVG())被称为“聚集”函数。MIN()求最小值 MAX()求最大值 SUM()求和 AVG()求平均数 COUNT()求条目数 示例: mysql> select min(age)from user;mysql> select max(age)from user;mysql> select sum(age)from user;mysql> select avg(age)from user;示例(使用count(*)统计user表中用户的个数): mysql> select count(*)from user;示例(指定统计memo列,NULL值不会被统计): mysql> select count(memo)from user;6.8 用SELECT与GROUP BY分组 所有在GROUP BY子句中指定的表达式里,具有相同结合值的记录行将按一组处理,在结果集里以一行结束。 聚集函数可以与GROUP BY一起使用将记录分组。当带有GROUP BY子句时,聚集函数将为每个组统计值。示例(求每个工作员工的平均年龄): mysql> select avg(age), work from user group by work;示例(求每个工作员工的总年龄): mysql> select count(*), sum(age), work from user group by work;6.9 使用UNION UNION关键字能够将两个或多个SELECT语句的结果连接起来。其语句是: SELECT … UNION SELECT … 缺省地,UNION消除结果集中的重复记录。为了获得所有的记录行,可用UNION ALL取代每个UNION实例。UNION在下面情况下将很有用: 多个表中有相似的信息,并且需要从这些表中立刻获取记录。 需要从同一个表中获取几组记录,但是表现每组的条件并不容易写在一个单个的WHERE子句里。示例: mysql> select * from user where age < 20-> union-> select * from user where name = '张三'; MySQL学习心得 第一章 一、数据库管理系统(DBMS)是操作和管理数据库的大型软件,它按一定的数据模型组织数据。 例如:Oracle、SQL Server、MySQL、Access。 二、数据库应用系统在数据库管理系统(DBMS)支持下建立的计算机应用系统,简写:DBAS。 例如:.net Java。 三、字符集从大到小排序:utf8--gbk--gb2312。 四、mysql的特点: 适用于中小型网站中,体积小、速度快、总体拥有成本低,尤其是有开放源码这一特点。 五、目前Internet上浒的网站构架方式是LAMP(Linux+apache+mysql+php)即使用Linux作为操作系统,Apache作为Web服务器,MySQL作为数据库,PHP作为服务器端脚本解释器,由于4个软件都是遵循GPL的开放源码软件,因此使用这种方式不用花一分钱就可以建立起一个稳定、免费的网站系统。 第二章 一、安装过程中遇到的问题及解决方法: 安装过程中没有完成时计算机关机。(没有删除完文件)安装完成时找不到所配置的路径。(可以从配置文件中找到) 安装完成后无法正常使用。(在计算机管理中重新启动MySQL服务)安装到一半时没有出现下一步。(误把配置文件删除了)安装到最后一步时start service错误。到控制面板里面先把mysql删除.到c盘C:Program Files目录下把mysql目录删除.如果在其他盘还有设置目录也要删除.空目录也要删除 到regedit把注册表 HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/Services/Eventlog/Applications/MySQL HKEY_LOCAL_MACHINE/SYSTEM/ControlSet002/Services/Eventlog/Applications/MySQL HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Eventlog/Applications/MySQL 有的话,全部删除!(技巧:用F3循环查找“mysql”)如果任务管理器里有关mysql内容也删除 把防火墙关了 重新装mysql(这里我没有重启计算机) 重装时候有必要的话,重启计算机,停用IIS,和删除temp里的临时文件.实在不行的话,配置mysql时候,把mysql服务换个服务名.使用时输入中文会出错。(在配置时在“Character Set”选框中将latinl修改为gb2312;也可以在配置文件中修改) 二、启动服务器的方法: ① 方法1: 在 “计算机管理”中的“服务”项目中启动与停止。② 方法2: 使用命令(net start mysql和net stop mysql) 三、连接MySQL 格式: mysql-h主机地址-u用户名 -p用户密码 ①先在打开DOS窗口,然后进入目录 mysqlbin(如果设置了环境变量,则直接输入命令即可。)②键入命令mysql-uroot-proot ③接回车即可进入到MYSQL中了 MYSQL的提示符是:mysql> 注明:直接打开Mysql command line client 四、MySQL注释符有三种: ①#...②“--...” ③ 五、忘记密码重新更改密码 先停止mysql服务,修改D:MySQLMySQL Server 5.0 目录下的my.ini文件,在[mysqld]下添加skip-grant-tables 启动mysql服务后就可以以空密码登录,之后别忘记修改root密码 use mysql update user set password=password('hanaixia')where user='root';(分号不能少)password('hanaixia')此处必须用函数设置。 修改密码后需要重新启动服务或者使用 flush privileges;语句,用于从mysql数据库中的授权表重新载入权限。 把 skip-grant-tables 这一句删掉再重启mysql服务。 Mysql命令:在mysql的bin目录下执行: Mysql –h host_name –u user_name –p password Use 数据库名;选定默认数据库(切换数据库)查询当前使用的数据库:select database(); Show databases;显示所有数据库; Show tables ;显示默认数据库下的所有表; Show status;显示服务器状态信息 c;放弃正在输入的命令; h;显示命令清单; s;显示mysql服务器状态信息; q;退出mysql; Describe 表名:查看表结构; 档案柜相当于数据库,抽屉相当于表,抽屉中的文件相当于记录; 0x:加1到9的数字或者a到f就可以构成16进制了。注意零x中的x不能大写。字符串:单引号或者双引号引起来的都是字符串; Tinyint是1字节; Smallint是2字节; Mediumint是3字节; Int是4字节 Bigint是8字节; 删除主表前,先删除子表。选择主键的原则: 1)最少性:尽量选择单个键做为主键 2)稳定性:尽量选择数值更新少的列作为主键。查看自定义函数创建信息: Show create function function_name;类型总结: Tinyint :占一个字节,它的范围是-128到127 Smallint:占2个字节,它的范围是-2的15次方到2的15次方减一; Mediumint:占3个字节,它的范围是-2的23次方到2的23次方减一; Int:占4个字节,它的范围是-2的31次方到2的31次方减一; Bigint:占8个字节,它的范围是-2的63次方到2的63次方减一; Float:占4个字节 Double:占8个字节 Decimal(m,n):占m个字节; Char(10)和char(10 char)是一样的; 数值列的完整性约束讲解: Auto increment(自动标识列):在需要产生唯一标示符号或者顺序值的时候,可用此属性。值从1开始,一般在插入null到auto increment列时,mysql会插入比当前列最大值大1的值。一个表中最多能有一个此属性的列。对于想使用此属性的列应该定义为not null,并定义为primary key或者定义为unique。 Null 和not null:默认是null,如果在插入数据时,指定了not null,那么在插入数据时必须要在此字段插入数据。如果指定了null ,那么在插入数据时,如果没有给此字段插入数据,此字段就插入null.mysql-h host-u user-p menagerie 注意,刚才显示的命令行中的menagerie不是你的 密码。如果你想要在命令行上在-p选项后提供 密码,则不能插入空格(例如,如-pmypassword,不是-p mypassword)。但是,不建议在命令行输入密码,因为这样会暴露 密码,能被在机器上登录的其它用户窥探到。 查询当前日期:使用curdate()函数,任何表都可以的。Select curdate()from cjym;可以通过year,month,day获取它的年月日。Select year(curdate())from cjym;Select month(curdate())from cjym;Select day(curdate())from cjym;Mysql中的_和%表示单个字符和零个或者多个字符; 有like 和not like比较操作符; 要想找出你的服务器支持哪个存储引擎,执行下面的语句: Show engines;Select 1/7;都可以; 日期和时间类型: Time :时间; Date:日期; Datetime:日期和时间; 创建表: Create table student(Student_id int(10)not null primary key auto_increment, Student_name varchar(20));注意在创建表的时候,如果是手动写sql语句的时候自动标示符要写这样的 auto_increment;有个下划线; 更改表结构操作: 给表添加一条字段:在最前面加字段用first,在最后面加用after;默认在最后加; Alter table student add age int first;给表设定默认值: Alter table student alter column_name set default default_value;给表中的字段添加主键;如果主键存在则出现错误; Alter table student add primary key(column_name);删除表中的一列: Alter table student drop column_name;删除表中的主键: Alter table student drop primary key;更改表的名字: Alter table student rename as new_tablename;修改表中的字段类型: Alter table student modify sno int;运算符: Between。。and用于检验一个值(一个求值表达式)是否存在一个指定的范围内; Select 10 between 1 and 100;结果是1:表示是真的; In 用于检验一个值(一个表达式)是否包含在一个指定的集合中。 Select 2 in(1,2,3,4,5,6),’a’ in(‘b’,’e’,.’h’);结果显示1和0;1表示真,0表示假; Is null和is not null来测定是否为空; 特殊的运算符:<=>:mysql称它为null安全的等于; Select null=null,null< = >null;结果显示null和1; Regexp运算符; Mysql中的元字符; 逻辑运算符:and(&&),or(||),not(!)插入数据时,插入多行值时: 插入多行数据: Insert into 表名(列名)Select 列名 From 表名; 更改记录的操作语法格式: Update 表名 set 列名=更新值 [where 更新条件] 删除记录的操作格式: Delete from 表名 [where 删除条件]; 表和字段的引用方式有两种: 绝对引用:数据库名.表名(.字段名);相对引用:表名.(字段名); Where子句使用的谓词: Between。。and。。在两数之间 Not between ….and ….不在两数之间 In:是否在特定的集合里。Not in :与上面相反。Like:是否匹配一个模式; Regexp:检查一个值是否匹配一个常规表达式; 复制表: Create table student select name,age from stu;复制表后,表中的字段和stu表中的字段一样并且记录数也是存在的; 学习地址:http:// Mysql的存储过程: Create procedure p()Begin End; delimiter // create procedure math_demo()begin declare i int default 0; declare d decimal(10,4)default 0; declare f float default 0; while i < 10000 do set d = d +.0001; set f = f +.0001E0; set i = i + 1; end while; select d,f;end // call math_demo(); mysql中的自定义方法的使用 delimiter // create function function_name()returns return_type;begin end;// 执行mysql自定义的函数用 Select function_name(); #mysql中的存储过程 delimiter // create procedure math_demo()begin declare i int default 0; declare d decimal(10,4)default 0;…….return return_value; declare f float default 0; while i < 10000 do set d = d +.0001; set f = f +.0001E0; set i = i + 1; end while; select d,f;end // call math_demo();// delimiter // create function xiaoxiao()returns int begin return 2;end;// #在mysql中创建的自定义函数要加的delimiter,都要一次性选中执行。每条语句都要用分号结束。delimiter // create function xiaoxiao1()returns int begin return 2;end // #执行mysql中的自定义函数 select xiaoxiao1(); 根据一个布尔值来检验一个值,在这里布尔值可以是true,false,unknown; 运算符: 等号:=,<=>,不等号:!=,<>;赋值号::=; XOR 逻辑XOR。当任意一个操作数为 NULL时,返回值为NULL。对于非 NULL 的操作数,假如一个奇数操作数为非零值,则计算所得结果为 1,否则为 0。 a XOR b 的计算等同于(a AND(NOT b))OR((NOT a)和 b)。 Coalesce();函数的使用方法: 返回值为列表中第一非null值,在没有非null值的情况下返回null。 Greatest();函数的使用及功能说明: 当函数有2个或者2个以上的参数时,返回参数中的最大参数值,比较参数所依据的规律同least()函数相同。 Interval();函数的使用及功能说明: INTERVAL(N,N1,N2,N3,...) 假如N < N1,则返回值为0;假如N < N2 等等,则返回值为1;假如N 为NULL,则返回值为-1。所有的参数均按照整数处理。为了这个函数的正确运行,必须满足 N1 < N2 < N3 < ……< Nn。其原因是使用了二分查找(极快速)。 Least();函数的使用及功能说明: · LEAST(value1,value2,...) 在有两个或多个参数的情况下,返回值为最小(最小值)参数。用一下规则将自变量进行对比: o 假如返回值被用在一个 INTEGER 语境中,或是所有参数均为整数值,则将其作为整数值进行比较。 假如返回值被用在一个 REAL语境中,或所有参数均为实值,则 将其作为实值进行比较。 o 假如任意一个参数是一个区分大小写的字符串,则将参数按照区分大小写的字符串进行比较。 o 在其它情况下,将参数作为区分大小写的字符串进行比较。o 假如任意一个自变量为NULL,则 LEAST()的返回值为NULL。 二,控制流函数 Case的使用: 格式1: Case value when [compare_value] then result_value when [compare_value2] then result_value2 else result_value3 end 格式2: case when value=[compare_value1] then result_value else result_value2 end IF(expr1,expr2,expr3) 如果 expr1 是TRUE(expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为expr2;否则返回值则为 expr3。IF()的返回值为数字值或字符串值,具体情况视其所在语境而定。 ASCII()函数查看对应符号的ascii码。 MySql问题解决总结 ERROR 1045(28000): Access denied for user 'root'@'localhost'(using password: YES)ERROR 1045(28000): Access denied for user 'root'@'localhost'(using password: NO) 这种问题就是mysql密码需要重置; 重置方式: 1.打开/etc/mysql/debian.cnf文件,里面存储了相关的密码,我的文件信息如下 sudovi /etc/mysql/debian.cnf# Automatically generated for Debian scripts.DO NOT TOUCH![client] host = localhost user = debian-sys-maint password = 6x1XG2B5p75WtFV2 socket = /var/run/mysqld/mysqld.sock [mysql_upgrade] host = localhost user = debian-sys-maint password = 6x1XG2B5p75WtFV2 socket = /var/run/mysqld/mysqld.sock basedir = /usr 在[client]段有user=以及password=这两行,这就是通过apt-get安装mysql,系统给我们设置的mysql登录名和密码 2.输入命令: mysql-udebian-sys-maint-pdebian-sys-maint即debian.cnf中user=后面的内容.回车后会提示输入密码,此时把password=后面的内容复制粘贴后回车即可进行mysql 控制台 3.进入控制台后.按以下步骤进行: use mysql;update user set password=PASSWORD('新密码')where user='root';FLUSH PRIVILEGES;此时可以输入quit;退出后用root帐号登录,也可以继续其他操作. 文档为doc格式 Mysql数据库学习心得 由于工作中需要使用mysql,笔者通过网上学习,动手实践,终于从一个"数据库菜鸟"变成了能熟练操作mysql的"准大虾"了,:)。现将学习心得整理如下。 MySQL是完...... 1 . 数据库创建 : Create database db_name; 数据库删除 : Drop database db_name; 删除时可先判断是否存在,写成 : drop database if exits db_name 2 . 建表 : 创建数据表...... 查询(R)Selec子句 书写顺序 Select distinct:要返回的列或表达式 From:从中检索数据的表 Where:行级过滤/分组前过滤 group by:分组说明 having:组级过滤/分组后过滤 order by:输...... 我的MYSQL学习心得(十一) 视图 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQ...... 我的MYSQL学习心得 一、使用视图的理由是什么? 1.安全性。一般是这样做的:创建一个视图,定义好该视图所操作的数据。之后将用户权限与视图绑定。这样的方式是使用到了一个特...... 1.安装Mysql注意:选择语言
2.Doc系统下进入Mysql
mysql -u用户名 -p密码
3.常用的命令:
1.查看mysql下所有的数据库:show databases;
2.创建数据库的命令:create database 数据...... PHP乱码?Mysql乱码?怎么解决?
PHP乱码或者mysql乱码,多半是因为没有统一编码,要解决PHP/mysql乱码,只要做到三码合一即可.
所谓三码,是指文件编码,页面编码声明和数据库字符...... 在 MySQL下,在进行中文模糊检索时,经常会返回一些与之不相关的记录,如查找 "%a%" 时,返回的可能有中文字符,却没有a字符存在。本人以前也曾遇到过类似问题,经详细阅读MySQL的Manua......] [
第三篇:MySQL学习心得
第四篇:mySql总结
第五篇:mysql问题解决总结
声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。 Mysql数据库学习心得
MySql知识点总结
mysql数据库要点总结
我的MYSQL学习心得
我的MYSQL学习心得
Mysql常用语句小结
PHP MySql乱码解决方案
MySQL中文模糊搜索解决方案