GVKun编程网logo

MySQL基础(mysql基础语句大全)

29

在本文中,我们将详细介绍MySQL基础的各个方面,并为您提供关于mysql基础语句大全的相关解答,同时,我们也将为您带来关于Mysql入门MySQL基础教程之IN的用法详解、Mysql入门MySQL基

在本文中,我们将详细介绍MySQL基础的各个方面,并为您提供关于mysql基础语句大全的相关解答,同时,我们也将为您带来关于Mysql入门MySQL基础教程之IN的用法详解、Mysql入门MySQL基础教程第一篇 mysql5.7.18安装和连接教程、Mysql入门Mysql基础知识点汇总、mysql入门之1小时学会MySQL基础的有用知识。

本文目录一览:

MySQL基础(mysql基础语句大全)

MySQL基础(mysql基础语句大全)

数据库管理系统

库级操作语句

进入数据库:

MysqL u p 

退出数据库:

 

 

显示所有库:

 

创建库:

显示库创建信息:

删除库:

;  

切换当前库:

 表级操作语句

显示所有表:

  

创建表:

   [if not exists] (create_deFinition,...); 

 

显示表创建信息:

show

tb_name;  

删除表:

  tb_name; 

表增删改查

指定插入:

  tb_name(col_names) (col_values); 

全列插入:

  tb_name (all_values); 

多行插入:

  tb_name(col_names) (value_1),(value_2),…; 

指定列查询:

  col_names tb_name; 

全列查询:

  tb_name; 

带条件查询:

  col_names tb_name conditions;  

  col_names tb_name id ;  

改:

 

删:

   tb_name a_field a_value; 

删除或改变全部数据

<div>

        id 默认长度11
      name (),#指定长度,最多65535个字符。         sex  (),#指定长度,最多255个字符。           price (,      detail       dates ,#日期时间类型 YYYYMM      ping  ENUM(,  
 裤子这条裤子超级好!!!Now(),好评

Mysql入门MySQL基础教程之IN的用法详解

Mysql入门MySQL基础教程之IN的用法详解

《MysqL入门MysqL基础教程之IN的用法详解》要点:
本文介绍了MysqL入门MysqL基础教程之IN的用法详解,希望对您有用。如果有疑问,可以联系我们。

MysqL学习MysqL IN 语法

MysqL学习IN 运算符用于 WHERE 表达式中,以列表项的形式支持多个选择,语法如下:

MysqL学习
WHERE column IN (value1,value2,...)
WHERE column NOT IN (value1,...)

MysqL学习当 IN 前面加上 NOT 运算符时,表示与 IN 相反的意思,即不在这些列表项内选择.

MysqL学习IN 使用实例

MysqL学习选取 uid 为 2、3、5 的用户数据:

MysqL学习
SELECT * FROM user WHERE uid IN (2,3,5)

MysqL学习返回查询结果如下:

uid username password email regdate
2 小明 a193686a53e4de85ee3f2ff0576adf01 xiao@163.com 1278063917
3 Jack 0193686a35e4de85ee3f2ff0567adf490 jack@gmail.com 1278061380
5 5idev a193686a53e4de85ee3f2ff0576adf01 5idev@5idev.com 1291107029

MysqL学习IN 子查询

MysqL学习更多情况下,IN 列表项的值是不明确的,而可能是通过一个子查询得到的:

MysqL学习
SELECT * FROM article WHERE uid IN(SELECT uid FROM user WHERE status=0)

MysqL学习在这个 sql 例子里,我们实现了查出所有状态为 0 的用户(可能是被禁止)的所有文章.首先通过一个查询得到所有所有 status=0 的用户:

MysqL学习
SELECT uid FROM user WHERE status=0

MysqL学习然后将查询结果作为 IN 的列表项以实现最终的查询结果,注意在子查询中返回的结果必须是一个字段列表项.

MysqL学习IN 运算符补充说明

MysqL学习IN 列表项不仅支持数字,也支持字符甚至时间日期类型等,并且可以将这些不同类型的数据项混合排列而无须跟 column 的类型保持一致:

MysqL学习
SELECT * FROM user WHERE uid IN(1,2,'3','c')

MysqL学习一个 IN 只能对一个字段进行范围比对,如果要指定更多字段,可以使用 AND 或 OR 逻辑运算符:

MysqL学习
SELECT * FROM user WHERE uid IN(1,2) OR username IN('admin','manong')

MysqL学习使用 AND 或 OR 逻辑运算符后,IN 还可以和其他如 LIKE、>=、= 等运算符一起使用.

MysqL学习 关于 IN 运算符的效率问题

MysqL学习如果 IN 的列表项是确定的,那么可以用多个 OR 来代替:

MysqL学习
SELECT * FROM user WHERE uid IN (2,5)

MysqL学习// 等效为:

MysqL学习
SELECT * FROM user WHERE (uid=2 OR aid=3 OR aid=5)

MysqL学习一般认为,如果是对索引字段进行操作,使用 OR 效率高于 IN,但对于列表项不确定的时候(如需要子查询得到结果),就必须使用 IN 运算符.另外,对于子查询表数据小于主查询的时候,也是适用 IN 运算符的.

MysqL学习 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Mysql入门MySQL基础教程第一篇 mysql5.7.18安装和连接教程

Mysql入门MySQL基础教程第一篇 mysql5.7.18安装和连接教程

《MysqL入门MysqL基础教程第一篇 MysqL5.7.18安装和连接教程》要点:
本文介绍了MysqL入门MysqL基础教程第一篇 MysqL5.7.18安装和连接教程,希望对您有用。如果有疑问,可以联系我们。

从这篇开始,用一个新的系列文章去介绍和学习MysqL.为什么要学习MysqL,从产品角度来说,大部分软件的数据库服务还是采取关系型数据库,主要的数据库产品有Oracle、微软的MSsql、IBM的DB2、和我们要介绍的MysqL.MysqL是很多中小型的网站服务器中数据库的首选,它有免费版,也有商业版,目前是Oracle的产品.从测试人员的角度来说,越来越多的软件产品是和数据有关,例如电商,和一些某一个领域内的数据库服务查询的软件产品.测试人员除了要做基本的软件功能测试之外,公司更希望测试人员可以了解更多的业务知识,通常这些业务数据,大部分时候是要和数据库打交道.所以,测试人员,要掌握一些数据库的基本操作和会写SQL查询语句,会写SQL查询语句在很多职位介绍里都有提到.
MysqL数据库

简单的增删改查sql语句,网上有很多文章和举例.我这里是想通过安装MysqL和简单使用,然后再练习一下sql的查询编写,这样才比较有系统掌握sql语句.很多时候,你有网上的sql练习语句,但是你没有sql Server环境,你不好去理解和快速掌握sql语句.所以,我们第一篇从安装MysqL 服务端和客户端,创建数据库和连接数据库开始.
MysqL数据库

一. MysqL Server的下载和安装
MysqL数据库

1. 打开网址:https://dev.MysqL.com/downloads/MysqL/,这里我们下载的社区免费版本
MysqL数据库

2.下拉页面,找到Donwload这个按钮,根据你的机器操作系统版本,选择32还是64位版本,当前最新版本是5.7.18
MysqL数据库

3.下载完后,默认安装,我们就选择安装MysqL Server,其他的组件不勾选.
MysqL数据库

4.安装过程,给root创建一个密码,我这里设置密码为root,如下图.MysqL数据库

Mysql入门MySQL基础教程第一篇 mysql5.7.18安装和连接教程

MysqL数据库

需要点击Add User,添加一个DAB账号:test/123456,输入用户名和密码,如下图MysqL数据库

Mysql入门MySQL基础教程第一篇 mysql5.7.18安装和连接教程

MysqL数据库

点击下一步,默认到安装结束.安装MysqL Server后,以后每次启动电脑,就开始了数据库相关服务.现在数据库服务器端我们安装好了,接下来,我们需要安装一个可视化,图形界面客户端去连接数据库.这里我们用MysqL Workbench.
MysqL数据库

二.MysqL Workbench的下载和安装
MysqL数据库

1. 打开网址https://dev.MysqL.com/downloads/workbench/
MysqL数据库

2. 找到“Windows (x86,64-bit),MSI Installer”
MysqL数据库

3. 点击Download下载按钮
MysqL数据库

4.在新页面,下拉,我们不需要登录账户,点击No thanks,just start my download.
MysqL数据库

5.开始下载.
MysqL数据库

6.下载结束后,开始安装,界面如下:MysqL数据库

Mysql入门MySQL基础教程第一篇 mysql5.7.18安装和连接教程

MysqL数据库

三.MysqL Workbench上连接数据库
MysqL数据库

打开MysqL Workbench,界面如下MysqL数据库

Mysql入门MySQL基础教程第一篇 mysql5.7.18安装和连接教程

MysqL数据库

如果安装正常,MysqL Workbench会在MysqL Connections下显示本地数据库可以连接,如下图.MysqL数据库

Mysql入门MySQL基础教程第一篇 mysql5.7.18安装和连接教程

MysqL数据库

点击这个灰色背景区域,就弹出输入root的密码,上面我们安装MysqL Server的时候,设置密码是root,输入密码后,点击连接,可以成功连接本地数据库.如果没有这个灰色,你点击旁边的+按钮,根据面板内容,选择本地服务的数据库,应该可以连接上.
MysqL数据库

1.创建一个我们自己的数据库db1MysqL数据库

Mysql入门MySQL基础教程第一篇 mysql5.7.18安装和连接教程

MysqL数据库

点击上图红框,根据提示创建一个新数据库,名称输入db1,编码选择utf-8,创建的数据库,在左侧面板下面可以看到.MysqL数据库

Mysql入门MySQL基础教程第一篇 mysql5.7.18安装和连接教程

MysqL数据库

上图中db1是我们新建的数据库,sys是MysqL Server安装完后,默认的一个数据库.以后我们都用MysqL Workbench来连接我们数据库,然后手动或者sql语句去创建表等相关数据,整体界面如下.MysqL数据库

Mysql入门MySQL基础教程第一篇 mysql5.7.18安装和连接教程

MysqL数据库

基本的sql环境就介绍到这里,下一篇讲如何在db1这个数据库下创建表和表中的列的过程.MysqL数据库

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小编PHP.MysqL数据库

Mysql入门Mysql基础知识点汇总

Mysql入门Mysql基础知识点汇总

《MysqL入门MysqL基础知识点汇总》要点:
本文介绍了MysqL入门MysqL基础知识点汇总,希望对您有用。如果有疑问,可以联系我们。

MysqL入门1.什么是sql语句

MysqL入门sql语言:结构化的查询语言.(Structured Query Language),是关系数据库管理系统的标准语言.

MysqL入门它是一种解释语言:写一句执行一句,不需要整体编译执行.

MysqL入门语法特点:

MysqL入门1.没有“ ”,字符串使用‘ '包含
2.没有逻辑相等,赋值和逻辑相等都是=
3.类型不再是最严格的.任何数据都可以包含在‘ '以内
4.没有bool值的概念,但是在视图中可以输入true/false
5.它也有关系运算符:> < >= <= = <> !=,它返回一个bool值
6.它也有逻辑运算符: !(not) &&(and) ||(or)
7.它不区别大小写

MysqL入门2.使用sql语句创建数据库和表

MysqL入门语法:

MysqL入门
create database 数据库名称
on primary --默认在主文件组上
(
name='逻辑名称_data',--当你发现它不是一句完整的sql语句,而仅仅是一个处理结构中的某一句的时候,就需要添加,size=初始大小,--数值不包含在‘'以内
filegrowth=文件增长,maxsize=最大容量,filename='物理路径'
)
log on
(
name='逻辑名称_log',--一般来说日志文件不限制最大容量
filename='物理路径'
)

MysqL入门
--判断数据库文件是否已经存在 :数据库的记录都存储在master库中的sysdatabases表中
--自动切换当前数据库
--使用代码开启外围应该配置器

MysqL入门
exec sp_configure 'show advanced options',1
RECONfigURE
exec sp_configure 'xp_cmdshell',1
RECONfigURE

MysqL入门--自定义目录  xp_cmdshell可以创建出目录   'mkdir f:\project':指定创建目录
exec xp_cmdshell 'mkdir f:\project'

MysqL入门use master
--exists 函数判断()中的查询语句是否返回结果集,如果返回了结果集则得到true,否则得到false

MysqL入门
if exists( select * from sysdatabases where name='School')
  drop database School --删除当前指定名称的数据库
create database School
on primary
(
 name='School_data',--逻辑名称.说明最多能够存储100mb数据,如果没有限制就可以将硬盘存储满
 size=3mb,--初始大小
 maxsize=100mb,--最大容量
 filegrowth=10%,--文件增长一次增长10%
 filename='f:\project\School_data.mdf'  
),

MysqL入门--创建文件组

MysqL入门
filegroup mygroup
(
 name='School_data1',--文件增长一次增长10%
 filename='F:\qiyi\School_data1.ndf'  
)
log on
(
 name='School_log',--逻辑名称
 size=3mb,--初始大小
 --maxsize=100mb,--文件增长一次增长10%
 filename='f:\project\School_log.ldf'  
),(
 name='School_log1',--文件增长一次增长10%
 filename='F:\qiyi\School_log1.ldf'  
)

MysqL入门3.创建数据表

MysqL入门语法:

MysqL入门create table 表名
(
字段名称 字段类型 字段特征(是否为null,默认值 标识列 主键 唯一键 外键 check约束),
字段名称 字段类型 字段特征(是否为null,默认值 标识列 主键 唯一键 外键 check约束)
)
创建老师表Teacher :Id、Name、Gender、Age、Salary、Birthday

MysqL入门
use School
if exists(select * from sysobjects where name='Classes')
 drop table Classes
create table Classes
(
 Classid int identity(1,1),ClassName nvarchar(50) not null 
)
if exists(select * from sysobjects where name='teacher')
 drop table teacher
create table Teacher
(
 Id int identity(1,--可以同时创建多个特征,用空格 分隔开. identity是标识列,第一个参数是种子,第二个是增量
Name nvarchar(50) not null,-- not null标记它的值不能为null--不能不填写
ClassId int not null,Gender bit not null,Age int,Salary money,--如果不标记为 not null.那么就相当于标记了null
Birthday datetime 
)

MysqL入门4.数据完整性约束

MysqL入门实体完整性:实体就是指一条记录.这种完整性就是为了保证每一条记录不是重复记录.是有意义的

MysqL入门主键:非空和唯一.一个表只有一个主键,但是一个主键可以是由多个字段组成的 组合键
标识列:系统自动生成,永远不重复
唯一键:唯一,但是可以为null,只能null一次
域完整性:域就是指字段,它是为了保证字段的值是准和有效,合理值

MysqL入门类型 是否null,默认值,check约束,关系
自定义完整性:

MysqL入门check约束,存储过程 触发器
引用完整性:一个表的某个字段的值是引用自另外一个表的某个字段的值.引用的表就是外键表,被引用的表就是主键表

MysqL入门1.建立引用的字段类型必须一致
2.建立引用的字段的意义一样
3.建立主外键关系的时候选择 外键表 去建立主外键关系
4.建立主外键关系的字段在主表中必须是主键或者唯一键

MysqL入门5.对于操作的影响

MysqL入门①.在添加数据时,先添加主键表再添加外键表数据
②.在删除的时候先外键表数据再删除主键表数据

MysqL入门级联的操作:不建议使用:会破坏数据完整性
不执行任何操作:该报错就报错,该删除就删除
级联:删除主表记录,从表引用该值的记录也被删除
设置null:删除主表记录,从表对应的字段值设置为null,前提是可以为null
设置为default:删除主表记录,从表对应的字段值设置为default,前提是可以为default
主键约束(PK Primary key)唯一键约束(UQ unique) 外键约束(FK foreign key) 默认值约束(DF default) check约束(CK check)

MysqL入门语法:

MysqL入门alter table 表名
add constraint 前缀_约束名称 约束类型 约束说明(字段 关系表达式 值)
use School
if exists(select * from sysobjects where name='PK_Classes_Classid')
 alter table classes  drop constraint PK_Classes_Classid
alter table classes
add constraint PK_Classes_Classid primary key(classid)
--为id添加主键
alter table teacher
add constraint PK_teacher_id primary key(id)
--为name添加唯一键
alter table teacher
add constraint UQ_Teacher_Name unique(Name)
--同时创建salary的默认约束和age的check约束
alter table teacher
add constraint DF_Teacher_Salary default(5000) for salary,
constraint CK_Teacher_Age check(age>0 and age<=100)
--为teacher表的classid字段创建主外键
if exists(select * from sysobjects where name='FK_Teacher_Classes_Classid')
 alter table teacher  drop constraint FK_Teacher_Classes_Classid
alter table teacher
with nocheck --不检查现有数据
add constraint FK_Teacher_Classes_Classid foreign key(classid) references classes(classid)
--on delete set default  级联操作
--不执行任何操作:该报错就报错,该删除就删除  --no action --默认选择
--级联:删除主表记录,从表引用该值的记录也被删除 --cascade
--设置null:删除主表记录,前提是可以为null   --set null
--设置为default:删除主表记录,前提是可以为default  --set default

MysqL入门5.四中基本字符类型说明

MysqL入门--len(参数) --获取指定参数内容的字符个数
select LEN('abcd') 【4】运行结果
select LEN('中华人民共和国') 【7】

MysqL入门--DataLength(参数):获取指定内占据的字节数--空间大小
select DataLength('abcd') 【4】
select DataLength('中华人民共和国') 【14】

MysqL入门--char类型:当空间分配后,不会因为存储的内容比分配的空间小就回收分配的空间.但是如果存储的内容超出了指定的空间大小,就会报错,当你存储的内容的长度变化区间不大的时候可以考虑使用char
select LEN(char) from CharTest 【2】
select DataLength(char) from CharTest 【10】

MysqL入门--varchar  var--变化的:当你存储的内容小于分配的空间的时候,多余的空间会自动收缩.但是如果存储的内容超出了指定的空间大小,就会报错 当存储的内容波动区间比较大时候使用varchar
select LEN(varchar) from CharTest 【2】
select DataLength(varchar) from CharTest 【2】

MysqL入门--nchar--  n代表它是一个unicode字符.规定不管什么样的字符都占据两个字节.  char:空间是固定的
select LEN(nchar) from CharTest 【10】
select DataLength(nchar) from CharTest 【20】

MysqL入门--nvarchar  n  var  char
select LEN(nvarchar) from CharTest 【2】
select DataLength(nvarchar) from CharTest 【4】

MysqL入门6.sql基本语句

MysqL入门数据插入

MysqL入门调用方法 一 一对应原则:类型对应,数量对应,顺序对应.

MysqL入门语法: 形参 实参

MysqL入门insert into 表名([字段列表]) values(值列表) --数据必须要符合数据完整性
插入操作是单个表的操作
插入操作insert一次只能插入一条记录
use School
--插入teacher所有字段的数据.如果在表后没有指定需要插入的字段名称,那么就默认为所有字段添加值
--但是一定需要注意的是:标识列永远不能自定义值--不能人为插入值
--仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'Teacher'中的标识列指定显式值.
insert into Teacher values('张三',5,1,30,4000,'1984-9-11')
insert into Teacher(Name,ClassId,Gender,Age,Salary,Birthday) values('张三','1984-9-11')
--不为可以为null的字段插入值  :可以null的字段可以不赋值
--列名或所提供值的数目与表定义不匹配
insert into Teacher(Name,Salary) values('李四',4000)
--非空字段一定需要赋值 :不能将值 NULL 插入列 'Gender',表 'School.dbo.Teacher';列不允许有 Null 值.INSERT 失败
insert into Teacher(Name,4000)
--为有默认值的字段插入值:
--1.不写这一列让系统自动赋值
insert into Teacher(Name,Age) values('王五',30)
--指定 null或者default
insert into Teacher(Name,Birthday) values('赵六',default,null)
--数据必须完全符合表的完整性约束
insert into Teacher(Name,Birthday) values('赵六1',300,null)

MysqL入门--任意类型的数据都可以包含在''以内,     不包括关键字
insert into Teacher(Name,Birthday) values('马鹏飞','5','0','15',null)
--但是字符串值如果没有包含在''以内.会报错   列名 '兰鹏' 无效.
insert into Teacher(Name,Birthday) values('兰鹏',null)
--但是数值组成的字符串可以不使用''包含
insert into Teacher(Name,Birthday) values(123,null)
--日期值必须包含在'‘以内,否则就是默认值
insert into Teacher(Name,Birthday) values('邹元标2','1991-9-11')
数据删除

MysqL入门语法:

MysqL入门delete [from] 表名 where 条件
delete from Teacher where Age<20
--特点:
--1.删除是一条一条进行删除的
--2.每一条记录的删除都需要将操作写入到日志文件中
--3.标识列不会从种子值重新计算,以从上次最后一条标识列值往下计算
--4.这种删除可以触发delete触发器

MysqL入门--truncate table 表名 --没有条件,它是一次性删除所有数据
--特点:
--1.一次性删除所有数据,没有条件,那么日志文件只以最小化的数据写入
--2.它可以使用标识列从种子值重新计算
--3.它不能触发delete触发器
truncate table teacher
数据更新(数据修改):一定需要考虑是否有条件

MysqL入门语法:

MysqL入门update 表名 set 字段=值,字段=值 ..where 条件
update Teacher set Gender='true'
--修改时添加条件
update Teacher set Gender=0 where Id=20
--多字段修改
update Teacher set ClassId=4,Age+=5,Salary=5000 where Id=22
--修改班级id=4,同时年龄》20岁的人员工资+500
update Teacher set Salary=Salary+500 where ClassId=4 and Age>20
数据检索--查询

MysqL入门语法: *代表所有字段

MysqL入门select */字段名称列表 from 表列表
select StudentNo,StudentName,Sex,[Address] from Student
--可以为标题设置  别名,别名可以是中文别名
select StudentNo as 学号,StudentName 姓名,性别=Sex,[Address] from Student
--添加常量列
select StudentNo as 学号,[Address],国籍='中华人民共和国' from Student
--select的作用
--1.查询
--2.输出
select 1+1
--+是运算符,系统会自动为你做类型转换
select 1+'1'
select '1'+1
--如果+两边都是字符串,那么它就是一字符串连接符
select '1'+'1'
select 'a'+1
--可以输出多列值
select 1,2,34,3,545,67,567,6,7
--Top、distinct
select * from Student
--top可以获取指定的记录数,值可以大于总记录数.但是不能是负值
select top 100 * from Student
--百分比是取ceiling()
select top 10 percent * from Student

MysqL入门--重复记录与原始的数据表数据无关,只与你查询的结果集有关系 distinct可以去除结果集中的重复记录--结果集中每一列的值都一样
select distinct LoginPwd,Email from Student
select distinct Sex from Student

MysqL入门select的作用
--聚合函数:
--1.对null过滤
--2.都需要有一个参数
--3.都是返回一个数值
--sum():求和:只能对数值而言,对字符串和日期无效
--avg():求平均值
--count():计数:得到满足条件的记录数
--max():求最大值:可以对任意类型的数据进行聚合,如果是字符串就比较拼音字母进行排序
--min():求最小值
--获取学员总人数
select COUNT(*) from Student
--查询最大年龄值
select  MIN(BornDate) from Student
select  max(BornDate) from Student

MysqL入门--查询总分
select SUM(StudentResult) from Result where StudentNo=2
--平均分
select avg(StudentResult) from Result where SubjectId=1
--注意细节:
select  SUM(StudentName) from Student
select  SUM(BornDate) from Student

MysqL入门select  min(StudentName) from Student
select  max(StudentName) from Student

MysqL入门--查询学号,姓名,性别,年龄,电话,地址 ---查询女生
select StudentNo,BornDate,Address from Student where Sex='女' and BornDate >'1990-1-1' and Address='广州传智播客'
--指定区间范围
select StudentNo,Address from Student where  BornDate >='1990-1-1' and BornDate<='1993-1-1'
--between...and  >=  <=
select StudentNo,Address from Student where BornDate  between '1990-1-1' and '1993-1-1'
--查询班级id  1  3 5  7的学员信息
select * from Student where ClassId=1 or ClassId=3 or ClassId=5 or ClassId=7
--指定具体的取值范围--可以是任意类型的范围.值的类型需要一致--可以相互转换
select * from Student where ClassId in(1,7)
select * from Student where ClassId not in(1,7)

MysqL入门聚合函数
--带条件的查询-模糊查询-- 只针对字符串而言

MysqL入门--查询  姓 林 的女生信息
--=是一种精确查询,需要完全匹配
select * from Student where Sex='女' and StudentName='林'
--通配符--元字符
--%:任意个任意字段  window:*  正则表达式 :.*
--_:任意的单个字符
--[]:代表一个指定的范围,范围可以是连续也可以是间断的.与正则表达式完全一样[0-9a-zA-Z].可以从这个范围中取一个字符
--[^]:取反值
select * from Student where Sex='女' and StudentName='林%'
--通配符必须在模糊查询关键的中才可以做为通配符使用,否则就是普通字符
--like   像 ....一样
select * from Student where Sex='女' and StudentName  like '林%'
select * from Student where Sex='女' and StudentName  like '林_'
--[]的使用  学号在11~15之间的学员信息
select * from Student where StudentNo like '[13579]'

MysqL入门---处理null值
--null:不是地址没有分配,而是不知道你需要存储什么值  所以null是指   不知道.但是=只能匹配具体的值,而null根本就不是一个值
select COUNT(email) from Student where Email !=null
select COUNT(email) from Student where Email  is null
select count(email) from Student where Email  is not null
--将null值替换为指定的字符串值
select StudentName,ISNULL(Email,'没有填写电子邮箱') from Student where ClassId=2

MysqL入门模糊查询
--当你看到  每一个,各自,不同,分别  需要考虑分组
--查询每一个班级的男生人数
--与聚合函数一起出现在查询中的列,要么也被聚合,要么被分组
select classid,COUNT(*) from Student where Sex='男' group by ClassId,sex
--查询每一个班级的总人数,显示人数>=2的信息
--1.聚合不应出现在 WHERE 子句中--语法错误
select ClassId,COUNT(*) as num from Student where Email is not null   GROUP by ClassId having COUNT(*)>=2 order by num desc
--完整的SQL查询家庭
 --5                            1                      2                                 3                                     4                                           6                                                
--select 字段列表 from 表列表  where 数据源做筛选 group by 分组字段列表 having 分组结果集做筛选 Order by  对结果集做记录重排

MysqL入门select ClassId,COUNT(*) as num from Student where Email is not null   GROUP by ClassId order by ClassId desc

MysqL入门--关于top的执行顺序 排序之后再取top值
select top 1 ClassId,COUNT(*) as num from Student  GROUP by ClassId  order by num desc

MysqL入门分组统计

MysqL入门7.类型转换函数

MysqL入门--select :输出为结果集--虚拟表
--print:以文本形式输出  只能输出一个字符串值.

MysqL入门print 1+'a'
select 1,2

MysqL入门select * from Student

MysqL入门--类型转换
--Convert(目标类型,源数据,[格式]) --日期有格式
print '我的成绩是:'+convert(char(3),100)

MysqL入门print '今天是个大日子:'+convert(varchar(30),getdate(),120)
select getdate()
select len(getdate())

MysqL入门--cast(源数据  as  目标类型)  它没有格式
print '我的成绩是:'+cast(100 as char(3))

MysqL入门8.日期函数

MysqL入门--getdate():获取当前服务器日期
select GETDATE()
--可以在源日期值是追加指定时间间隔的日期数
select DATEADD(dd,-90,GETDATE())
--dateDiff:找到两个日期之间指定格式的差异值
select StudentName,DATEDIFF(yyyy,BornDate) as age from Student order by  age
--DATENAME:可以获取日期的指定格式的字符串表现形式
select DATENAME(dw,getdate())
--DATEPART:可以获取指定的日期部分
select cast(DATEPART(yyyy,getdate()) as CHAR(4))+'-' +cast(DATEPART(mm,getdate()) as CHAR(2))+'-' +cast(DATEPART(dd,getdate()) as CHAR(2))

MysqL入门9.数学函数

MysqL入门--rand:随机数:返回0到1之间的数,理论上说可以返回0但是不能返回1
select RAND()
--abs:absolute:取绝对值
select ABS(-100)
--ceiling:获取比当前数大的最小整数
select CEILING(1.00)
--floor:获取比当前数小的最大整数
select floor(1.99999)
power:
select POWER(3,4)
--round():四舍五入.只关注指定位数后一位
select ROUND(1.549,1)
--sign:正数==1  负数 ==-1  0=0
select SIGN(-100)

MysqL入门select ceiling(17*1.0/5)

MysqL入门10.字符串函数

MysqL入门--1.CHARINDEX --IndexOf():能够返回一个字符串在源字符串的起始位置.找不到就返回0,如果可以找到就返回从1开始的索引--没有数组的概念
--第一个参数是指需要查询的字符串,第二个是源字符串,第三个参数是指从源字符的那个索引位置开始查找
select CHARINDEX('人民','中华人民共和国人民',4)
--LEN():可以返回指定字符串的字符个数
select LEN('中华人民共和国')
--UPPER():小写字母转换为大写字母  LOWER():大写转小写
select LOWER(UPPER('sadfasdfa'))
--LTRIM:去除左空格  RTIRM:去除右空格
select lTRIM(RTRIM('                   sdfsd             '))+'a'
--RIGHT:可以从字符串右边开始截取指定位数的字符串  如果数值走出范围,不会报错,只会返回所有字符串值,但是不能是负值
select RIGHT('中华人民共和国',40)
select LEFT('中华人民共和国',2)
--SUBSTRING()
select SUBSTRING('中华人民共和国',2)
--REPLACE 第一个参数是源字符串,第二个参数是需要替换的字符串,第三个参数是需要替换为什么
select REPLACE('中华人民共和国','人民','居民')
select REPLACE('中        华      人民       共        和       国',' ','')
--STUFF:将源字符串中从第几个开始,一共几个字符串替换为指定的字符串
select STUFF('中华人民共和国','你懂的')

MysqL入门--sudyfsagfyas@12fasdf6.fsadfdsaf

MysqL入门declare @email varchar(50)='sudyfsagfyas@12fasdf6.fsadfdsaf'
select CHARINDEX('@',@email)
select LEFT(@email,CHARINDEX('@',@email)-1)

MysqL入门--使用right
select right(@email,len(@email)-CHARINDEX('@',@email))
--使用substring
select SUBSTRING(@email,@email)+1,LEN(@email))
--使用stuff
select STUFF(@email,@email),'')

MysqL入门11.联合结果集union

MysqL入门--联合结果集union
select * from Student where Sex='男'
--union
select * from Student where Sex='女'

MysqL入门--联合的前提是:
--1.列的数量需要一致:使用 UNION、INTERSECT 或 EXCEPT 运算符合并的所有查询必须在其目标列表中有相同数目的表达式
--2.列的类型需要可以相互转换
select StudentName,Sex from Student --在字符串排序的时候,空格是最小的,排列在最前面
union
select cast(ClassId as CHAR(3)),classname from grade

MysqL入门--union和union all的区别
--union是去除重复记录的
--union all不去除重复 :效率更高,因为不需要判断记录是否重复,也没有必须在结果庥是执行去除重复记录的操作.但是可以需要消耗更多的内存存储空间
select * from Student where ClassId=2
union all
select * from Student where ClassId=2

MysqL入门--查询office这科目的全体学员的成绩,同时在最后显示它的平均分,最高分,最低分
select ' '+cast(StudentNo as CHAR(3)),cast(SubjectId as CHAR(2)),StudentResult from Result where SubjectId=1
union
select '1','平均分',AVG(StudentResult) from Result where SubjectId=1
union
select '1','最高分',max(StudentResult) from Result where SubjectId=1
union
select '1','最低分',min(StudentResult) from Result where SubjectId=1

MysqL入门--一次性插入多条数据
--1.先将数据复制到另外一个新表中,删除源数据表,再将新表的数据插入到源数据表中
--1.select */字段  into 新表 from 源表
--1.新表是系统自动生成的,不能人为创建,如果新表名称已经存在就报错
--2.新表的表结构与查询语句所获取的列一致,但是列的属性消失,只保留非空和标识列.其它全部消失,如主键,唯一键,关系,约束,默认值
select * into newGrade from grade

MysqL入门truncate table grade
select *  from newGrade
--select * into grade from newGrade
--2.insert into  目标表  select 字段列表/* from  数据源表
--1、目标表必须先存在,如果没有就报错
--2.查询的数据必须符合目标表的数据完整性
--3.查询的数据列的数量和类型必须的目标的列的数量和对象完全对应
insert into grade select classname from newGrade
delete from admin
--使用union一次性插入多条记录
--insert into 表(字段列表)
--select 值.... 用户自定义数据
--union
--select 值 ....
insert into Admin
select 'a','a'
union all
select 'a',null

MysqL入门12.CASE函数用法

MysqL入门相当于switch case---c#中的switch...case只能做等值判断
这可以对字段值或者表达式进行判断,返回一个用户自定义的值,它会生成一个新列.
2.要求then后面数据的类型一致
1.第一种做等值判断的case..end

MysqL入门case 字段或者表达式
when .值..then .自定义值
when .值..then .自定义值
.....
 else 如果不满足上面所有的when就满足这个else
end
--显示具体班级的名称
select StudentNo,
case ClassId  --如果case后面接有表达式或者字段,那么这种结构就只能做等值判断,真的相当于switch..case
  when 1 then '一班'
  when 2 then '2班'
  when 3 then '3班'
  when null  then 'aa' --不能判断null值
  else  '搞不清白'
end,
sex
 from Student
--2.做范围判断,相当于if..else,它可以做null值判断
--case  --如果没有表达式或者字段就可实现范围判断
-- when  表达式  then 值   --不要求表达式对同一字段进行判断
-- when  表达式  then 值 
-- .....
--else  其它情况 
--end
select StudentNo,
case
 when BornDate>'2000-1-1' then '小屁孩'
 when BornDate>'1990-1-1' then '小青年'
 when BornDate>'1980-1-1' then '青年' 
 --when Sex='女'  then '是女的'
 when BornDate is null then '出生不详'
 else  '中年'
end
 from Student

MysqL入门--百分制转换为素质教育  90 -A   80--B  70 --C  60 --D  <60 E  NULL--没有参加考试
select StudentNo,SubjectId,
case
    when StudentResult>=90 then 'A'
    when StudentResult>=80 then 'B'
    when StudentResult>=70 then 'C'
    when StudentResult>=60 then 'D'
    when StudentResult is null then '没有参加考试'
    else 'E'
end 成绩,
ExamDate
 from Result

MysqL入门13.IF ELSE语法

MysqL入门1.没有{},使用begin..end.如果后面只有一句,可以不使用begin..end包含
2.没有bool值,只能使用关系运算符表达式
3.也可以嵌套和多重
4.if后面的()可以省略

MysqL入门declare @subjectname nvarchar(50)='office' --科目名称
declare @subjectId int=(select Subjectid from Subject where SubjectName=@subjectname) --科目ID
declare @avg int --平均分
set @avg=(select AVG(StudentResult) from Result where SubjectId=@subjectId and StudentResult is not null) --获取平均分
print @avg
if @avg>=60
 begin
   print '成绩不错,输出前三名:'
   select top 3 * from Result where SubjectId=@subjectId order by StudentResult desc
 end
else
  begin
    print '成绩不好,输出后三名:'
    select top 3 * from Result where SubjectId=@subjectId order by StudentResult 
  end

MysqL入门14.WHILE循环语法

MysqL入门1.没有{},使用begin..end
2.没有bool值,需要使用条件表达式
3.可以嵌套
4.也可以使用break,continue

MysqL入门
go
declare @subjectName nvarchar(50)='office' --科目名称
declare @subjectId int--科目ID
declare @classid int =(select classid from Subject where SubjectName=@subjectName) --查询当前科目属于那一个班级
set @subjectId=(select SubjectId from Subject where SubjectName=@subjectName) --获取科目ID
declare @totalCount int --总人数 :那一个班级需要考试这一科目 
set @totalCount=(select COUNT(*) from Student where ClassId=@classid)
print @totalcount --14
declare @unpassNum int --不及格人数
set @unpassNum=(select COUNT(distinct Studentno) from Result where SubjectId=@subjectId and StudentNo in(select StudentNo from Student where ClassId=@classid) and StudentResult<60)
while(@unpassNum>@totalCount/2)
begin
 --执行循环加分
 update Result set StudentResult+=2 where SubjectId=@subjectId and StudentNo in(select StudentNo from Student where ClassId=@classid) and StudentResult<=98
 --重新计算不及格人数
 set @unpassNum=(select COUNT(distinct Studentno) from Result where SubjectId=@subjectId and StudentNo in(select StudentNo from  Student where ClassId=@classid) and StudentResult<60)
end
go
declare @subjectName nvarchar(50)='office' --科目名称
declare @subjectId int--科目ID
declare @classid int =(select classid from Subject where SubjectName=@subjectName) --查询当前科目属于那一个班级
set @subjectId=(select SubjectId from Subject where SubjectName=@subjectName) --获取科目ID
declare @totalCount int --总人数
set @totalCount=(select COUNT(*) from Student where ClassId=@classid)
print @totalcount --14
declare @unpassNum int --不及格人数
while(1=1)
 begin
   set @unpassNum=(select COUNT(distinct Studentno) from Result where SubjectId=@subjectId and StudentNo in(select StudentNo  from  Student where ClassId=@classid) and StudentResult<60)
  if(@unpassNum>@totalCount/2)   
    update Result set StudentResult+=2 where SubjectId=@subjectId and StudentNo in(select StudentNo from Student where ClassId=@classid) and StudentResult<=98
  else
     break
 end

MysqL入门15.子查询

MysqL入门子查询:一个查询中包含另外一个查询.被包含的查询就称为子查询,包含它的查询就称父查询.
1.子查询的使用方式:使用()包含子查询
2.子查询分类:

MysqL入门独立子查询:子查询可以直接独立运行.
查询比“王八”年龄大的学员信息
select * from Student where BornDate<(select BornDate from Student where StudentName='王八')
相关子查询:子查询使用了父查询中的结果
--子查询的三种使用方式
--1.子查询做为条件,子查询接在关系运算符后面  >  < >= <= = <> !=,如果是接这关系运算符后面,必须保证 子查询只返回一个值
--查询六期班的学员信息
select * from Student where ClassId=(select ClassId from grade where classname='八期班')
--子查询返回的值不止一个.当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的.
select * from Student where ClassId=(select ClassId from grade)
--查询八期班以外的学员信息
--当子查询返回多个值(多行一列),可以使用in来指定这个范围
select * from Student where ClassId in(select ClassId from grade where classname<>'八期班')
--当没有用 EXISTS 引入子查询时,在选择列表中只能指定一个表达式.如果是多行多列或者一行多列就需要使用exists
--使用 EXISTS 关键字引入子查询后,子查询的作用就相当于进行存在测试.外部查询的 WHERE 子句测试子查询返回的行是否存在
select * from Student where  EXISTS(select * from grade)
select * from Student where  ClassId in(select * from grade)

MysqL入门--2.子查询做为结果集--
select top 5 * from Student --前五条
--使用top分页
select top 5 * from Student where StudentNo not in(select top 5 studentno from Student)
--使用函数分页  ROW_NUMBER() over(order by studentno),可以生成行号,排序的原因是因为不同的排序方式获取的记录顺序不一样
select ROW_NUMBER() over(order by studentno),* from Student
--查询拥有新生成行号的结果集  注意:1.子查询必须的别名  2.必须为子查询中所有字段命名,也就意味着需要为新生成的行号列命名
select * from (select ROW_NUMBER() over(order by studentno) id,* from Student) temp where temp.id>0 and temp.id<=5
select * from (select ROW_NUMBER() over(order by studentno) id,* from Student) temp where temp.id>5 and temp.id<=10
select * from (select ROW_NUMBER() over(order by studentno) id,* from Student) temp where temp.id>10 and temp.id<=15

MysqL入门--3.子查询还可以做为列的值
select (select studentname from student where studentno=result.studentno),(select subjectname from subject where subjectid=result.SubjectId),StudentResult from Result

MysqL入门--使用Row_number over()实现分页
--1.先写出有行号的结果集
select ROW_NUMBER() over(order by studentno),* from Student
--2.查询有行号的结果集 子查询做为结果集必须添加别名,子查询的列必须都有名称
select * from (select ROW_NUMBER() over(order by studentno) id,* from Student) temp where id>0 and id<=5
--查询年龄比“廖杨”大的学员,显示这些学员的信息
select * from Student where BornDate<(select BornDate from Student where StudentName='廖杨')
--查询二期班开设的课程
select * from Subject where ClassId=(select ClassId from grade where classname='二期班')
--查询参加最近一次“office”考试成绩最高分和最低分
--1查询出科目 ID
select subjectid fromSubjectwhereSubjectName='office'--2.查询出这一科目的考试日期select MAX(ExamDate)fromresultwhereSubjectId=(select subjectid fromSubjectwhereSubjectName='office')--3,写出查询的框架select MAX(StudentResult),MIN(StudentResult)fromresultwhereSubjectId=()andExamDate=()--4.使用子查询做为条件select MAX(StudentResult),MIN(StudentResult)fromresultwhereSubjectId=(select subjectid fromSubjectwhereSubjectName='office')andExamDate=(select MAX(ExamDate)fromresultwhereSubjectId=(select subjectid fromSubjectwhereSubjectName='office'))

MysqL入门16.表连接Join

MysqL入门--1.inner join :能够找到两个表中建立连接字段值相等的记录
--查询学员信息显示班级名称
select Student.StudentNo,Student.StudentName,grade.classname
from Student
inner join grade on Student.ClassId=grade.ClassId

--左连接: 关键字前面的表是左表,后面的表是右表
--左连接可以得到左表所有数据,如果建立关联的字段值在右表中不存在,那么右表的数据就以null值替换
select PhoneNum.*,PhoneType.*
from   PhoneNum 
left join  PhoneType on PhoneNum.pTypeId=PhoneType.ptId
--右连接: 关键字前面的表是左表,后面的表是右表
--右连接可以得到右表所有数据,如果建立关联的字段值在右左表中不存在,那么左表的数据就以null值替换
select PhoneNum.*,PhoneType.*
from   PhoneNum 
right join  PhoneType on PhoneNum.pTypeId=PhoneType.ptId
--full join :可以得到左右连接的综合结果--去重复
select PhoneNum.*,PhoneType.*
from   PhoneNum 
full join  PhoneType on PhoneNum.pTypeId=PhoneType.ptId

MysqL入门17.事务

MysqL入门一种处理机制.以事务处理的操作,要么都能成功执行,要么都不执行.

MysqL入门事务的四个特点 ACID:

MysqL入门A:原子性:事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行.它是一个整体,不能再拆分
C:一致性:事务在完成时,必须使所有的数据都保持一致状态..某种程度的一致
I:隔离性:事务中隔离,每一个事务是单独的请求将单独的处理,与其它事务没有关系,互不影响
D:持久性:如果事务一旦提交,就对数据的修改永久保留
使用事务:

MysqL入门将你需要操作的sql命令包含在事务中.

MysqL入门1.在事务的开启和事务的提交之间
2.在事务的开启和事务的回滚之间

MysqL入门三个关键语句:

MysqL入门开启事务:begin transaction
提交事务:commit transaction
回滚事务:rollback transaction
declare @num int =0 --记录操作过程中可能出现的错误号
begin transaction
  update bank set cmoney=cmoney-500 where name='aa'
  set @num=@num+@@ERROR
  --说明这一句的执行有错误  但是不能在语句执行的过程中进行提交或者回滚
  --语句块是一个整体,如果其中一句进行了提交或者回滚,那么后面的语句就不再属于当前事务,
  --事务不能控制后面的语句的执行

MysqL入门
 update bank set cmoney=cmoney+500 where name='bb'
 set @num=@num+@@ERROR
 select * from bank
  if(@num<>0 ) --这个@@ERROR只能得到最近一一条sql语句的错误号
   begin 
   print '操作过程中有错误,操作将回滚' 
   rollback transaction
  end 
  else 
   begin 
   print '操作成功' 
   commit transaction 
  end

MysqL入门    --事务一旦开启,就必须提交或者回滚
    --事务如果有提交或者回滚,必须保证它已经开启

MysqL入门18.视图

MysqL入门视图就是一张虚拟表,可以像使用子查询做为结果集一样使用视图.

MysqL入门select * from vw_getinfo
使用代码创建视图.

MysqL入门语法:

MysqL入门create view vw_自定义名称
as
查询命令
go
--查询所有学员信息
if exists(select * from sysobjects where name='vw_getAllStuInfo')
 drop view vw_getAllStuInfo
go --上一个批处理结果的标记
create view vw_getAllStuInfo
as
--可以通过聚合函数获取所以记录数
 select top (select COUNT(*) from Student) Student.StudentNo,grade.ClassId,grade.classname from Student
inner join grade on Student.ClassId=grade.ClassId  order by StudentName --视图中不能使用order by
--select * from grade --只能创建一个查询语句
--delete from grade where ClassId>100 --在视图中不能包含增加删除修改
go

MysqL入门--使用视图..就像使用表一样
select * from vw_getAllStuInfo
--对视图进行增加删除和修改操作--可以对视图进行增加删除和修改操作,只是建议不要这么做:所发可以看到:如果操作针对单个表就可以成功,但是如果 多张的数据就会报错:不可更新,因为修改会影响多个基表.
update vw_getAllStuInfo set classname='asdas',studentname='aa' where studentno=1

MysqL入门19.触发器

MysqL入门触发器:执行一个可以改变表数据的操作(增加删除和修改),会自动触发另外一系列(类似于存储过程中的模块)的操作.

MysqL入门语法:

MysqL入门create trigger tr_表名_操作名称
on 表名 after|instead of 操作名称
as
go
if exists(select * from sysobjects where name='tr_grade_insert')
 drop trigger tr_grade_insert
go
create trigger tr_grade_insert
on grade for  insert  ---为grade表创建名称为tr_grade_insert的触发器,在执行insert操作之后触发
as
declare @cnt int
set @cnt = (select count(*) from student)
 select *,@cnt from student
select * from grade
go
--触发器不是被调用的,而是被某一个操作触 发的,意味着执行某一个操作就会自动触发 触发器
insert into grade values('fasdfdssa')
---替换触 发器:本来需要执行某一个操作,结果不做了,使用触 发器中的代码语句块进行替代

MysqL入门if exists(select * from sysobjects where name='tr_grade_insert')
 drop trigger tr_grade_insert
go
create trigger tr_grade_insert
on grade instead of insert  ---为grade表创建名称为tr_grade_insert的触发器,@cnt from student
select * from grade
go

MysqL入门insert into grade values('aaaaaaaaaaaa')
go

MysqL入门---触 发器的两个临时表:
--inserted: 操作之后的新表:所有新表与原始的物理表没有关系,只与当前操作的数据有关
--deleted:操作之前的旧表:所有新表与原始的物理表没有关系,只与当前操作的数据有关

MysqL入门if exists(select * from sysobjects where name='tr_grade_insert')
 drop trigger tr_grade_insert
go
create trigger tr_grade_insert
on grade after insert
as
 print '操作之前的表:操作之前,这一条记录还没有插入,所以没有数据'
 select * from deleted
 print '操作之后的表:已经成功插入一条记录,所有新表中有一条记录'
 select * from inserted 
go
--测试:
insert into grade values('aaaaa')

MysqL入门if exists(select * from sysobjects where name='tr_grade_update')
 drop trigger tr_grade_update
go
create trigger tr_grade_update
on grade after update
as
 print '操作之前的表:存储与这个修改操作相关的没有被修改之前的记录'
 select * from deleted
 print '操作之后的表:存储这个操作相关的被修改之后 记录'
 select * from inserted 
go
--测试
update grade set classname=classname+'aa' where  ClassId>15

MysqL入门if exists(select * from sysobjects where name='tr_grade_delete')
 drop trigger tr_grade_delete
go
create trigger tr_grade_delete
on grade after delete
as
 print '操作之前的表:存储与这个修改操作相关的没有被删除之前的记录'
 select * from deleted
 print '操作之后的表:存储这个操作相关的被删除之后 记录--没有记录'
 select * from inserted 
go

MysqL入门--测试
delete from grade where ClassId>15

MysqL入门20.存储过程

MysqL入门存储过程就相当于c#中的方法
参数,返回值,参数默认值,参数:值的方式调用
在调用的时候有三个对应:类型对应,顺序对应.

MysqL入门创建语法:

MysqL入门create proc usp_用户自定义名称
对应方法的形参 --(int age,out string name)
as
对应方法体:创建变量,逻辑语句,增加删除修改和查询..return返回值
go
调用语法:

MysqL入门exec 存储过程名称 实参,实参,实参 ...
--获取所有学员信息
if exists(select * from sysobjects where name='usp_getAllStuInfo')
 drop proc usp_getAllStuInfo
go
create procedure usp_getAllStuInfo
as
 select * from Student
go
--调用存储过程,获取的有学员信息
execute usp_getAllStuInfo

MysqL入门--exec sp_executesql  'select * from Student'

MysqL入门--查询指定性别的学员信息
go
if exists(select * from sysobjects where name='usp_getAllStuInfoBySex')
 drop proc usp_getAllStuInfoBySex
go
create procedure usp_getAllStuInfoBySex
 @sex nchar(1) --性别  参数不需要declare
as
 select * from Student where Sex=@sex
go
--调用存储过程,获取指定性别的学员信息
Exec usp_getAllStuInfoBySex '女'

MysqL入门--创建存储过程获取指定班级和性别的学员信息
go
if exists(select * from sysobjects where name='usp_getAllStuInfoBySexandClassName')
 drop proc usp_getAllStuInfoBySexandClassName
go
create procedure usp_getAllStuInfoBySexandClassName
 @classname nvarchar(50),--班级名称
 @sex nchar(1)='男'--性别   有默认的参数建议写在参数列表的最后
as
 declare  @classid int ---班级ID
set @classid=(select classid from grade where classname=@classname) --通过参数班级名称获取对应的班级ID
 select * from Student where Sex=@sex and ClassId=@classid
go
--执行存储过程获取指定班级和性别的学员信息
--exec usp_getAllStuInfoBySexandClassName '八期班'
exec usp_getAllStuInfoBySexandClassName default,'八期班'  --有默认值的参数可以传递default
exec usp_getAllStuInfoBySexandClassName @classname='八期班'    --也可以通过参数=值的方式调用
exec usp_getAllStuInfoBySexandClassName @classname='八期班' ,@sex='女'
exec usp_getAllStuInfoBySexandClassName @classname='八期班',@sex='女'

MysqL入门--创建存储过程,获取指定性别的学员人数及总人数
go
if exists(select * from sysobjects where name='usp_getCountBySexandClassName')
 drop proc usp_getCountBySexandClassName
go
create procedure usp_getCountBySexandClassName
@cnt int=100 output,--output标记说明它是一个输出参数.output意味着你向服务器请求这个参数的值,那么在执行的时候,服务器发现这个参数标记了output,就会将这个参数的值返回输出
@totalnum int =200output,--总人数
@className nvarchar(50),--输入参数没有默认值,在调用的时候必须传入值
@sex nchar(1)='男'--输入参数有默认值,用户可以选择是否传入值
as
 declare  @classid int ---班级ID
 set @classid=(select classid from grade where classname=@classname) --通过参数班级名称获取对应的班级ID
 select * from Student where Sex=@sex and ClassId=@classid
set @cnt= (select COUNT(*) from Student where Sex=@sex and ClassId=@classid) --获取指定班级和性别的总人数
set @totalnum=(select COUNT(*) from Student) ----获取总人数
go
--调用存储过程,获取指定性别的学员人数及总人数
declare @num int,@tnum int
exec usp_getCountBySexandClassName @cnt=@num output,@totalnum=@tnum output,@className='八期班'
print @num
print @tnum
print '做完了'
---获取指定班级的人数
if exists(select * from sysobjects where name='usp_getCount')
 drop proc usp_getCount
go
create procedure usp_getCount
 @className nvarchar(50)='八期班'
as
declare @classid int=(select classid from grade where classname=@className)
 declare @cnt int
set @cnt =(select COUNT(*) from Student where ClassId=@classid)
--return 只能返回int整数值
--return '总人数是'+cast(@cnt as varchar(2))
return @cnt
go

MysqL入门--调用存储过程,接收存储过程的返回值
declare @count int
--set @count=(exec usp_getCount)
exec @count=usp_getCount '八期班'
print @countif exists(select*from sysobjects where name='usp_getClassList')
 drop proc usp_getClassList
go
create procedure usp_getClassList
asselect classid,classname from grade
go

MysqL入门21.分页存储过程

mysql入门之1小时学会MySQL基础

mysql入门之1小时学会MySQL基础

MysqL入门

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

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

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

MysqL所使用的 sql 语言是用于访问数据库的最常用标准化语言。MysqL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MysqL 作为网站数据库。
由于其社区版的性能卓越,搭配 PHP 和 Apache 可组成良好的开发环境。

1. 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据。

2. 使用关系型数据库管理系统(RDBMS)来存储和管理的大数据量。关系型数据库是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。

3. RDBMS特点:

1.数据以表格的形式出现

2.每行为各种记录名称

3.每列为记录名称所对应的数据域

4.许多的行和列组成一张表单

5.若干的表单组成database

4. RDBMS 术语

冗余:存储两倍数据,冗余可以使系统速度更快。

主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。

外键:外键用于关联两个表。

复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。

索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。

参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性

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

MysqL管理

6. 启动及关闭 MysqL服务器:

(1) 检查MysqL服务器是否启动:

ps -ef | grepMysqLd

(2) 启动MysqL服务器:

root@host# cd/usr/bin

./safe_MysqLd&

(3) 关闭目前运行的 MysqL 服务器:

root@host# cd/usr/bin

./MysqLadmin-u root -p shutdown

Enterpassword: ******

7. MysqL 用户设置

在 MysqL 数据库中的 user 表添加新用户:

root@host# MysqL -u root Cp //选择数据库
Enter password:*******
MysqL> use MysqL;
Database changed

MysqL> INSERT INTO user
(host,user,password,select_priv,insert_priv,update_priv) //设置权限Y
VALUES ('localhost','guest',PASSWORD('guest123'),'Y','Y');

Query OK,1 row affected (0.20 sec)

MysqL> FLUSH PRIVILEGES;

注意需要执行 FLUSH PRIVILEGES 语句。这个命令执行后会重新载入授权表。

另外一种添加用户的方法为通过sql的 GRANT命令

MysqL> GRANTSELECT,INSERT,UPDATE,DELETE,CREATE,DROP
-> ON TUTORIALS.*
-> TO 'zara'@'localhost'
-> IDENTIFIED BY'zara123';

8. 管理MysqL的命令

USE 数据库名 :选择要操作的MysqL数据库:

MysqL> use W3CSCHOOL;

Database changed

SHOW DATABASES: 列出 MysqL 数据库管理系统的数据库列表:

MysqL> SHOWDATABASES;

SHOW TABLES: 显示指定数据库所有表,用该命令前需用 use 命令选择操作的数据库。

MysqL> useW3CSCHOOL;

Database changed

MysqL> SHOW TABLES;

SHOW COLUMNS FROM 数据表:显示数据表的属性,属性类型,主键信息,是否NULL,默认值等其他信息。

MysqL> SHOW COLUMNSFROM W3Cschool_tbl;

+-----------------+--------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-----------------+--------------+------+-----+---------+-------+

SHOW INDEX FROM 数据表:显示数据表的详细索引信息,包括PRIMARY KEY(主键)。

SHOW TABLE STATUS LIKE 数据表\G: 该命令将输出MysqL数据库管理系统的性能及统计信息。

MysqL> SHOW TABLESTATUS FROM W3CSCHOOL; # 显示数据库 W3CSCHOOL 中所有表的信息

MysqL> SHOW TABLESTATUS from W3CSCHOOL LIKE 'W3Cschool%'; #表名以W3Cschool开头的表的信息

MysqL> SHOW TABLESTATUS from W3CSCHOOL LIKE 'W3Cschool%'\G; #加上 \G,查询结果按列打印

9. PHP MysqL函数格式:MysqL_function(value,value,...);

MysqL 连接

10.使用MysqL二进制方式连接

[root@host]# MysqL -uroot -p
Enter password:******
登录成功后会出现MysqL> 命令提示窗口,你可以在上面执行任何 sql 语句。
退出 MysqL> 命令提示窗口可以使用exit 命令:MysqL> exit

11.使用 PHP脚本连接 MysqL

PHP 提供了 MysqL_connect() 函数来连接数据库。
connectionMysqL_connect(server,passwd,new_link,client_flag);5各参数均可选
使用PHP的MysqL_close() 函数来断开与MysqL数据库的链接。
bool MysqL_close (resource $link_identifier );
通常不要用MysqL_close(),因为已打开的非持久连接会在脚本执行完毕后自动关闭。
MysqL_close() 不会关闭由 MysqL_pconnect() 建立的持久连接

$conn = MysqL_connect($dbhost,$dbuser,$dbpass);
if(! $conn )
{
die('Could not connect: ' .MysqL_error());
}
echo 'Connected successfully';
MysqL_close($conn);

MysqL 创建/删除数据库

12.使用 MysqLadmin创建数据库

用root用户登录,root用户拥有最高权限,可以使用 MysqL MysqLadmin 命令来创建数据库。
[root@host]#MysqLadmin -u root -pcreate/drop W3CSCHOOL
Enter password:***** 

13.使用 PHP脚本创建数据库

PHP使用 MysqL_query 函数来创建或者删除 MysqL 数据库。

bool MysqL_query( sql,connection);
 
$conn = MysqL_connect($dbhost,$dbpass);
if(! $conn )
{
 die('连接错误: ' . MysqL_error());
}
echo '连接成功<br />';
$sql= 'CREATE/DROP DATABASE W3CSCHOOL';
$retval= MysqL_query( $sql,$conn );
if(! $retval )
{
 die('创建数据库失败: ' . MysqL_error());
}
echo "数据库 W3CSCHOOL创建成功\n";
MysqL_close($conn);

MysqL 选择数据库

14.使用PHP脚本选择MysqL数据库

PHP 提供了函数 MysqL_select_db来选取一个数据库。

bool MysqL_select_db( db_name,connection );
$conn = MysqL_connect($dbhost,$dbpass);
if(! $conn )
{
 die('连接失败: ' . MysqL_error());
}

echo '连接成功';
MysqL_select_db('W3CSCHOOL' );
MysqL_close($conn);

MysqL 创建/删除数据表

15.MysqL 创建数据表

创建MysqL数据表需要以下信息:

表名

表字段名

定义每个表字段

创建语法:CREATE TABLE table_name (column_name column_type);

删除语法:DROP TABLE table_name ;

以下例子中我们将在 W3CSCHOOL 数据库中创建数据表w3cschool_tbl:

tutorials_tbl(
 tutorial_id INT NOT NULL AUTO_INCREMENT,tutorial_title VARCHAR(100) NOT NULL,tutorial_author VARCHAR(40) NOT NULL,submission_date DATE,PRIMARY KEY ( w3cschool_id )
);

16.通过命令提示符创建表

使用 sql 语句 CREATE TABLE 来创建数据表。

MysqL> CREATE TABLE w3cschool_tbl(
 -> w3cschool_id INT NOTNULL AUTO_INCREMENT,-> w3cschool_titleVARCHAR(100) NOT NULL,-> w3cschool_authorVARCHAR(40) NOT NULL,-> submission_date DATE,-> PRIMARY KEY (w3cschool_id )
 -> );

MySQL命令终止符为分号 (;) 。 

17.使用PHP脚本创建/删除数据表或插入数据

语法:bool MysqL_query( sql,connection);

$sql = "CREATE TABLEtutorials_tbl( "创建
  "tutorial_id INT NOTNULL AUTO_INCREMENT,".
  "tutorial_titleVARCHAR(100) NOT NULL,".
  "tutorial_authorVARCHAR(40) NOT NULL,".
  "submission_dateDATE,".
  "PRIMARY KEY (tutorial_id )); "
;
$sql = "DROP TABLEw3cschool_tbl";删除
 
MysqL_select_db( 'TUTORIALS' );
$retval = MysqL_query( $sql,$conn);   //判断是否成功而设置的参数;
if(! $retval )
{
 die('数据表创建失败: ' . MysqL_error());
}
echo "数据表创建成功\n";
MysqL_close($conn);

MysqL 插入数据

18.向MysqL数据表插入数据通用的 INSERT INTO sql语法:

INSERT INTO table_name (field1,field2,...fieldN )
                       VALUES
                       ( value1,value2,...valueN );

如果数据是字符型,必须使用单引号或者双引号,如:"value"。

 

w3cschool_tbl表插入一条数据:

MysqL> INSERT INTOw3cschool_tbl
     ->(w3cschool_title,w3cschool_author,submission_date)
     ->VALUES
     ->("Learn PHP","JohnPoul",Now());

(->)不是sql语句的一部分,它仅表示一个新行,如sql语句太长,可通过回车键创建一个新行编写sql语句,sql语句的命令结束符为分号(;)。

 

19.使用PHP脚本插入数据

  $sql = "INSERT INTO w3cschool_tbl ".
       "(w3cschool_title,submission_date) ".
       "VALUES ".
      "('$w3cschool_title','$w3cschool_author','$submission_date')";

MysqL 查询数据

20.为在MysqL数据库中查询数据通用的 SELECT语法:

SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[OFFSET M ][LIMIT N]

可以通过SELECT 命令读取一条或者多条记录。

可以通过OFFSET指定SELECT语句开始查询的数据偏移量默认情况下偏移量为0。

可以使用 LIMIT 属性来设定返回的记录数。

你可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据

MysqL> SELECT * from w3cschool_tbl

 
21.使用PHP脚本来获取数据

使用PHP函数的MysqL_query()及sql SELECT命令来获取数据。
该函数用于执行sql命令,然后通过 PHP 函数 MysqL_fetch_array() 来使用或输出所有查询的数据。

 

尝试以下实例来显示数据表w3cschool_tbl 的所有记录

$sql = 'SELECT w3cschool_id,w3cschool_title,
               w3cschool_author,submission_date
      FROM w3cschool_tbl';
MysqL_select_db('W3CSCHOOL');
$retval = MysqL_query( $sql,$conn );
if(! $retval )
{
  die('Could not get data: ' .MysqL_error());
}
while($row =MysqL_fetch_array($retval,MysqL_ASSOC))
while($row =MysqL_fetch_assoc($retval))

用MysqL_NUM参数显示数据表

while($row =MysqL_fetch_array($retval,MysqL_NUM))

用MysqL_NUM参数显示数据表

{
    echo "Tutorial ID:{$row['w3cschool_id']}  <br>".
         "Title:{$row['w3cschool_title']} <br> ".
         "Author:{$row['w3cschool_author']} <br> ".
         "Submission Date : {$row['submission_date']}<br> ".
        "--------------------------------<br>";
}
MysqL_free_result($retval);     释放游标内存
echo "Fetched data successfully\n";
MysqL_close($conn);


MysqL_ASSOC, 设置该参数查询结果返回关联数组,你可以使用字段名称来作为数组的索引。

MysqL 选择数据

22.从MysqL表中使用sql SELECT语句来读取数据。

如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句中
以下是sql SELECT语句使用 WHERE 子句从数据表中读取数据的通用语法:

SELECT field1,...fieldN FROM table_name1,table_name2...
[WHERE condition1 [AND[OR]] condition2.....

WHERE子句也可以运用于sql的 DELETE 或者 UPDATE 命令。
使用 LIKE 来比较字符串,否则MysqL的WHERE子句的字符串比较是不区分大小写的。 你可以使用 BINARY 关键字来设定WHERE子句的字符串比较是区分大小写的。

 23.使用PHP脚本读取数据

使用PHP函数的MysqL_query()及相同的sql SELECT 带上 WHERE 子句的命令来获取数据。该函数用于执行sql命令,然后通过 MysqL_fetch_array() 来输出所有查询的数据。

$sql = 'SELECT w3cschool_id,submission_date
        FROM w3cschool_tbl
        WHEREw3cschool_author="Sanjay"';

 MysqL UPDATE

24.修改或更新MysqL中的数据,我们可以使用sql UPDATE 命令来操作。

通用sql语法:

UPDATE table_name SET field1=new-value1,field2=new-value2

[WHERE Clause]

 

更新数据表中 w3cschool_id 为 3 的 w3cschool_title 字段值:

MysqL>UPDATE w3cschool_tbl
   -> SET w3cschool_title='Learning JAVA'
-    > WHERE w3cschool_id=3;

使用PHP脚本更新数据

$sql = 'UPDATE w3cschool_tbl
         SETw3cschool_title="Learning JAVA"
          WHERE w3cschool_id=3';

MysqL DELETE

25.DELETE FROM table_name[WHERE Clause

如果没有指定 WHERE 子句,MysqL表中的所有记录将被删除。

可以在 WHERE 子句中指定任何条件

删除w3cschool_tbl 表中 w3cschool_id 为3 的记录

MysqL> DELETE FROMw3cschool_tbl WHERE w3cschool_id=3;

用 PHP 脚本删除数据

$sql = 'DELETE FROMw3cschool_tbl
        WHERE w3cschool_id=3';

MysqL LIKE 子句

QL LIKE 子句中使用百分号(%)字符来表示任意字符

没有使用百分号(%),LIKE 子句与等号(=)的效果是一样的。
26.QL SELECT语句使用 LIKE子句从数据表中读取数据的通用语法:
SELECT field1,...fieldN table_name1,table_name2...
WHERE field1 LIKEcondition1 [AND [OR]] filed2 = 'somevalue'
LIKE 通常与 % 一同使用,类似于一个元字符的搜索


在PHP脚本中使用 LIKE 子句

$sql = 'SELECTw3cschool_id,submission_date
        FROM w3cschool_tbl
        WHERE w3cschool_author LIKE"%jay%"';

MysqL 排序

SELECT field1,table_name2...

ORDER BY field1,[field2...] [ASC [DESC]]

ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。默认情况下,它是按升排列。

 

MysqL 分组

SELECT column_name,function(column_name)
FROM table_name
WHERE column_nameoperator value
GROUP BY column_name;

WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)。

coalesce 来设置一个可以取代NUll 的名称,coalesce 语法:

select coalesce(a,b,c);

参数说明:如果a==null,则选择b;如果b==null,则选择c;如果a!=null,则选择a;如果a b c 都为null ,则返回为null(没意义)。

MysqL> SELECTcoalesce(name,'总数'),SUM(singin) as singin_countFROM  employee_tbl GROUP BY name WITHROLLUP;

+--------------------------+--------------+

| coalesce(name,'总数') | singin_count |

+--------------------------+--------------+

| 小丽                   |            2 |

| 小明                   |            7 |

| 小王                   |            7 |

| 总数                   |           16 |

+--------------------------+--------------+

 MysqL 多表查询

27.在SELECT,UPDATE 和 DELETE 语句中使用 MysqL 的 JOIN 来联合多表查询。

JOIN 按照功能大致分为如下三类:

INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
RIGHT JOIN(右连接):与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。

| w3cschool_author |w3cschool_count |

+-----------------+----------------+

| mahran          |             20 |

| mahnaz          |           NULL |

| Jen             |           NULL |

| Gill            |             20 |

| John Poul       |              1 |

| Sanjay          |              1 |

+-----------------+----------------+

MysqL> SELECT * fromw3cschool_tbl;

+-------------+----------------+-----------------+-----------------+

| w3cschool_id | w3cschool_title | w3cschool_author |submission_date |

+-------------+----------------+-----------------+-----------------+

|           1 | Learn PHP      | John Poul       |2007-05-24      |
|           2 | LearnMysqL    | Abdul S         | 2007-05-24      |
|           3 | JAVATutorial  | Sanjay          | 2007-05-06      |

连接以上两张表来读取w3cschool_tbl表中所有w3cschool_author字段在tcount_tbl表对应的w3cschool_count字段值:

MysqL> SELECTa.w3cschool_id,a.w3cschool_author,b.w3cschool_count FROM w3cschool_tbl aINNER JOIN tcount_tbl b ON a.w3cschool_author = b.w3cschool_author;

+-----------+---------------+--------------+

| w3cschool_id | w3cschool_author | w3cschool_count |

+-----------+---------------+--------------+

|         1 | John Poul     |            1 |

|         3 | Sanjay        |            1 |

 

w3cschool_tbl 为左表,tcount_tbl 为右表,

MysqL> SELECTa.w3cschool_id,b.w3cschool_count FROM w3cschool_tbl a LEFTJOIN tcount_tbl b ON a.w3cschool_author = b.w3cschool_author;

+-------------+-----------------+----------------+

| w3cschool_id | w3cschool_author | w3cschool_count |

+-------------+-----------------+----------------+

|           1 | John Poul       |             1 |

|           2 | Abdul S         |           NULL |

|           3 | Sanjay          |              1 |

 

左边的数据表w3cschool_tbl的所有选取的字段数据,即便在右侧表tcount_tbl中没有对应的w3cschool_author字段值Abdul S。

MysqL NULL

IS NULL: 当列的值是NULL,此运算符返回true。
IS NOT NULL: 当列的值不为NULL,运算符返回true。

NULL值与任何其它值的比较(即使是NULL)永远返回false,

使用PHP脚本处理 NULL 值:

PHP脚本中你可以在 if...else 语句来处理变量是否为空,并生成相应的条件语句。

MysqL 正则表达式

28.MysqL中使用 REGEXP 操作符来进行正则表达式匹配。

^     匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。
$     匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。
.      匹配除"\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。

实例(表名:person_tbl )来加深我们的理解:

查找name字段中以'st'为开头的所有数据:

MysqL> SELECT name FROM person_tbl WHERE name REGEXP '^st';

查找name字段中以'ok'为结尾的所有数据:

MysqL> SELECT name FROM person_tbl WHERE name REGEXP 'ok$';

查找name字段中包含'mar'字符串的所有数据:

MysqL> SELECT name FROM person_tbl WHERE name REGEXP 'mar';

查找name字段中以元音字符开头或以'ok'字符串结尾的所有数据:

MysqL> SELECT name FROM person_tbl WHERE name REGEXP'^[aeIoU]|ok$';

 MysqL 事务

29.MysqL 事务主要用于处理操作量大,复杂度高的数据。

在MysqL中只有使用了Innodb数据库引擎的数据库或表才支持事务

事务处理可以用来维护数据库的完整性,保证成批的sql语句要么全部执行,要么全部不执行

事务用来管理insert,update,delete语句

事务必须满足4个条件(ACID): Atomicity(原子性)、Consistency(稳定性)、Isolation(隔离性)、Durability(可靠性)

1、事务的原子性:一组事务,要么成功;要么撤回。

2、稳定性: 有非法数据(外键约束之类),事务撤回。

3、隔离性:事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。

4、可靠性:软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit选项 决定什么时候吧事务保存到日志里。

 在MysqL控制台使用事务来操作:

1,开始一个事务

start transaction

2,做保存点

savepoint 保存点名称

3,操作

4,可以回滚,可以提交,没有问题,就提交,有问题就回滚。

 PHP中使用事务实例

MysqL_query("SETAUTOCOMMIT=0");//设置为不自动提交,因为MysqL默认立即执行MysqL_query("BEGIN");//开始事务定义

if(!MysqL_query("insertinto trans (id) values('2')"))
{
MysqL_query("ROOLBACK");//判断当执行失败时回滚
}
MysqL_query("COMMIT");//执行事务
MysqL_close($handler);
MysqL ALTER

30.修改数据表名或者修改数据表字段时,就需要使用到MysqL ALTER命令。

 

使用了 ALTER 命令及 DROP 子句来删除以上创建表的 i字段:

MysqL> ALTER TABLEtestalter_tbl  DROP i;

数据表中只剩余一个字段则无法使用DROP来删除字段。

ADD 子句来想数据表中添加列,在表 testalter_tbl 中添加 i 字段,并定义数据类型:

MysqL> ALTER TABLEtestalter_tbl ADD i INT;

 

以下 ALTERTABLE 语句,在执行成功后,使用 SHOW COLUMNS 查看表结构的变化:

ALTER TABLEtestalter_tbl DROP i;
ALTER TABLEtestalter_tbl ADD i INT FirsT;
ALTER TABLEtestalter_tbl DROP i;
ALTER TABLEtestalter_tbl ADD i INT AFTER c;

FirsT 和 AFTER 关键字只占用于 ADD 子句,所以如果你想重置数据表字段的位置就需要先使用 DROP 删除字段然后使用 ADD 来添加字段并设置位置。

 

修改字段类型及名称:

31.在ALTER命令中使用 MODIFY 或 CHANGE 子句 。

把字段 c 的类型从 CHAR(1) 改为 CHAR(10),可以执行以下命令:
MysqL> ALTER TABLEtestalter_tbl MODIFY c CHAR(10);
使用 CHANGE 子句,语法有很大的不同。 在 CHANGE 关键字之后,紧跟着的是你要修改的字段名,然后指定新字段的类型及名称。尝试如下实例:
MysqL> ALTER TABLEtestalter_tbl CHANGE i j BIGINT;
<p如果你现在想把字段 j 从 BIGINT 修改为 INT,sql语句如下:
MysqL> ALTER TABLEtestalter_tbl CHANGE j j INT;

 

ALTER修改字段的默认值,MysqL> ALTER TABLEtestalter_tbl ALTER i SET DEFAULT 1000;
ALTER 及DROP删除字段的默认值,ALTER TABLEtestalter_tbl ALTER i DROP DEFAULT;
ALTER及 TYPE修改数据表类型,MysqL> ALTER TABLEtestalter_tbl TYPE = MYISAM;
ALTER TABLE 使用RENAME修改数据表的名称,MysqL> ALTER TABLEtestalter_tbl RENAME TO alter_tbl;

MysqL 索引

索引可以大大提高MysqL的检索速度
索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索包含多个列。
创建索引,确保该索引是应用在 sql 查询语句的条件(一般作为 WHERE 子句的条件)。
索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MysqL不仅要保存数据,还要保存一下索引文件。
3方式创建普通索引

CREATE INDEX indexName ONmytable(username(length));

如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。

修改表结构

ALTER mytable ADD INDEX[indexName] ON (username(length))

创建表的时候直接指定

CREATE TABLE mytable( 
ID INT NOT NULL,username VARCHAR(16) NOTNULL,INDEX [indexName](username(length)) 
); 

删除索引的语法

DROP INDEX [indexName] ONmytable;

 唯一索引:前面加UNIQUE

 使用ALTER 命令添加和删除索引

有四种方式来添加数据表的索引:

ALTER TABLE tbl_name ADD PRIMARYKEY (column_list):该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。
ALTER TABLE tbl_name ADD UNIQUEindex_name (column_list):这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。
ALTER TABLE tbl_name ADD INDEXindex_name (column_list):添加普通索引,索引值可出现多次。
ALTER TABLE tbl_name ADD FULLTEXTindex_name (column_list):该语句指定了索引为 FULLTEXT ,用于全文索引。

 使用 ALTER 命令添加和删除主键

主键只能作用于一个列上,添加主键索引时,你需要确保该主键默认不为空(NOT NULL)。实例如下:

MysqL> ALTER TABLEtestalter_tbl MODIFY i INT NOT NULL;

MysqL> ALTER TABLEtestalter_tbl ADD PRIMARY KEY (i);

你也可以使用 ALTER 命令删除主键:

MysqL> ALTER TABLEtestalter_tbl DROP PRIMARY KEY;

 

SHOW INDEX 命令列出表中的相关的索引信息。可以通过添加 \G 来格式化输出信息。

MysqL> SHOW INDEX FROMtable_name\G

 

MysqL 临时表

临时表只在当前连接可见,当关闭连接时,MysqL会自动删除表并释放所有空间。

MysqL> CREATE TEMPORARY TABLE SalesSummary

MysqL> DROP TABLE SalesSummary;

MysqL 复制表

创建新的克隆表clone_tbl。如果你想拷贝数据表的数据你可以使用 INSERT INTO... SELECT 语句来实现。

MysqL> INSERT INTOclone_tbl (w3cschool_id,
    ->                        w3cschool_title,
    ->                        w3cschool_author,
    ->                        submission_date)
    -> SELECT w3cschool_id,
    ->       w3cschool_author,submission_date
->FROM w3cschool_tbl;

 MysqL 元数据

想知道MysqL以下三种信息:

查询结果信息: SELECT,UPDATE 或 DELETE语句影响的记录数。
数据库和数据表的信息: 包含了数据库及数据表的结构信息。
MysqL服务器信息: 包含了数据库服务器的当前状态,版本号等。

(1)使用do( ) 执行  $query

my $count = $dbh->do($query);

(2)使用prepare( )及 execute( ) 执行  $query

my $sth =$dbh->prepare ($query);

my $count =$sth->execute ( ); 

在PHP中,使用MysqL_affected_rows( ) 函数获取查询语句影响的记录数。

$result_id =MysqL_query ($query,$conn_id);
# 如果查询失败返回
$count = ($result_id ?MysqL_affected_rows ($conn_id) : 0);
print ("$countrows were affected\n");

 数据库和数据表列表

PERL 实例

# 获取当前数据库中所有可用的表。

my @tables =$dbh->tables ( );
foreach $table (@tables){
 print "Table Name $table\n";
}

PHP 实例:

$db_list =MysqL_list_dbs($con);
while ($db = MysqL_fetch_object($db_list))
{
 echo $db->Database . "<br/>";
}

MysqL 序列

MysqL序列是一组整数:1,2,3,...,

用 MysqLAUTO_INCREMENT 来定义列。

MysqL> CREATE TABLEinsect

    -> (

    -> id INT UNSIGNED NOT NULLAUTO_INCREMENT,

 

用 sql中的LAST_INSERT_ID() 函数来获取最后的插入表中的自增列的值。

 PERL实例

使用MysqL_insertid 属性来获取 AUTO_INCREMENT 的值。实例如下:

$dbh->do("INSERT INTO insect (name,date,origin)

VALUES('moth','2001-09-14','windowsill')");

my $seq =$dbh->{MysqL_insertid};

PHP实例

PHP 通过 MysqL_insert_id ()函数来获取执行的插入sql语句中 AUTO_INCREMENT列的值。

MysqL_query("INSERT INTO insect (name,origin)
VALUES('moth','windowsill')",$conn_id);
$seq = MysqL_insert_id($conn_id);

重置序列

删除了数据表中的多条记录,并对剩下数据的AUTO_INCREMENT列进行重新排列,那么你可以通过删除自增的列,然后重新添加来实现。

MysqL> ALTER TABLEinsect DROP id;

MysqL> ALTER TABLEinsect

    -> ADD id INT UNSIGNED NOT NULLAUTO_INCREMENT FirsT,

    -> ADD PRIMARY KEY (id);

一般情况下序列的开始值为1,但如果你需要指定一个开始值100:

-> id INT UNSIGNednOT NULL AUTO_INCREMENT = 100,

或在表创建成功后,通过以下语句来实现:

MysqL> ALTER TABLE tAUTO_INCREMENT = 100;

 MysqL 处理重复数据

防止表中出现重复数据

在MysqL数据表中设置指定的字段为PRIMARY KEY(主键)或者UNIQUE(唯一)索引保证数据的唯一性。

设置表中字段first_name,last_name数据不能重复,你可以设置双主键模式来设置数据的唯一性, 如果你设置了双主键,那么那个键的默认值不能为NULL,可设置为NOT NULL。如下所示:

CREATE TABLE person_tbl
(
 first_name CHAR(20) NOT NULL,last_name CHAR(20) NOT NULL,sexCHAR(10),PRIMARY KEY (last_name,first_name)
);

INSERT IGnorEINTO与INSERT INTO的区别就是INSERT IGnorE会忽略数据库中已经存在的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据。这样可以保留数据库中已经存在数据,达到在间隙中插入数据的目的。

用了INSERT IGnorE INTO,执行后不会出错,也不会向数据表中插入重复数据:

MysqL> INSERT IGnorE INTO person_tbl(last_name,first_name)

    ->VALUES( 'Jay','Thomas');

Query OK,1 row affected (0.00 sec)

 

REPLACE INTO into如果存在primary 或 unique相同的记录,则先删除掉。再插入新记录。

   UNIQUE(last_name,first_name)

 

查询重复记录

select user_name,count(*) as count fromuser_table group by user_name having count>1;

select * from people

where peopleId in (select peopleId from peoplegroup by peopleId having count(peopleId) > 1)

 

统计重复数据

统计表中 first_name 和 last_name的重复记录数:

MysqL> SELECT COUNT(*) as repetitions,last_name,first_name

 ->FROM person_tbl
 ->GROUP BY last_name,first_name
 ->HAVING repetitions > 1;

 过滤重复数据

读取不重复的数据可以在SELECT 语句中使用 disTINCT 关键字来过滤重复数据。

MysqL> SELECT disTINCT last_name,first_name

    ->FROM person_tbl

    ->ORDER BY last_name;

 

也可以使用 GROUP BY 来读取数据表中不重复的数据:

MysqL> SELECT last_name,first_name
 ->FROM person_tbl
 ->GROUP BY (last_name,first_name);

 删除重复数据

删除数据表中的重复数据,你可以使用以下的sql语句:

MysqL> CREATE TABLE tmp SELECT last_name,first_name,sex

 ->     FROMperson_tbl;

 ->     GROUP BY(last_name,first_name);

MysqL> DROP TABLE person_tbl;

MysqL> ALTER TABLE tmp RENAME TO person_tbl;

也可以在数据表中添加 INDEX(索引) 和 PRIMAY KEY(主键)这种简单的方法来删除表中的重复记录。方法如下:

MysqL> ALTER IGnorE TABLE person_tbl
 ->ADD PRIMARY KEY (last_name,first_name);

MysqL 及 sql 注入

没有过滤特殊字符时,出现的sql情况:

// 设定$name 中插入了我们不需要的sql语句

$name = "Qadir';DELETE FROM users;";

MysqL_query("SELECT* FROM users WHERE name='{$name}'");

以上的注入语句中,我们没有对 $name 的变量进行过滤,$name中插入了我们不需要的sql语句,将删除 users 表中的所有数据。

 

防止sql注入,注意以下几个要点:

1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双"-"进行转换等。

2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。

3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。

4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。

5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装

6.sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御sql注入,XSS攻击等。

 在脚本语言,如Perl和PHP可以对用户输入的数据进行转义从而来防止sql注入。

PHP的MysqL扩展提供了MysqL_real_escape_string()函数来转义特殊的输入字符。

if (get_magic_quotes_gpc())
{
 $name = stripslashes($name);
}

$name =MysqL_real_escape_string($name);
MysqL_query("SELECT * FROMusers WHERE name='{$name}'");

Like语句中的注入

like查询时,如用户输入的值有"_"和"%",则会出现这种情况:用户本只想查询"abcd_",查询结果中却有"abcd_"、"abcde"、"abcdf"等等;用户要查询"30%"(注:百分之三十)时也会出现问题。

在PHP脚本中我们可以使用addcslashes()函数来处理以上情况,如下实例:

$sub =addcslashes(MysqL_real_escape_string("%something_"),"%_");

// $sub == \%something\_

MysqL_query("SELECT * FROMmessages WHERE subject LIKE '{$sub}%'");

addcslashes() 函数在指定的字符前添加反斜杠。

语法格式:

addcslashes(string,characters) 

MysqL 导出数据

使用 SELECT ...INTO OUTFILE 语句导出数据

将数据表w3cschool_tbl 数据导出到 /tmp/tutorials.txt 文件中:

MysqL> SELECT * FROMtutorials_tbl

    -> INTO OUTFILE '/tmp/tutorials.txt';

生成一个文件,各值用逗号隔开。这种格式可以被许多程序使用。

SELECT a,a+b INTOOUTFILE '/tmp/result.text'
FIELDS TERMINATED BY',' OPTIONALLY ENCLOSED BY '"'
LInes TERMINATED BY'\n'
FROM test_table;

SELECT ... INTO OUTFILE 语句有以下属性:

LOAD DATA INFILE是SELECT ... INTO OUTFILE的逆操作,SELECT句法。为了将一个数据库的数据写入一个文件,使用SELECT ... INTO OUTFILE,为了将文件读回数据库,使用LOAD DATA INFILE。

SELECT...INTO OUTFILE 'file_name'形式的SELECT可以把被选择的行写入一个文件中。该文件被创建到服务器主机上,因此您必须拥有FILE权限,才能使用此语法。

输出不能是一个已存在的文件。防止文件数据被篡改。

你需要有一个登陆服务器的账号来检索文件。否则SELECT ... INTO OUTFILE 不会起任何作用。

在UNIX中,该文件被创建后是可读的,权限由MysqL服务器所拥有。这意味着,虽然你就可以读取该文件,但可能无法将其删除

 导出表作为原始数据

MysqLdump是MysqL用于转存储数据库的实用程序。

将数据表tutorials_tbl 导出到 /tmp 目录中:

$ MysqLdump -u root -p--no-create-info \

            --tab=/tmp W3CSCHOOL w3cschool_tbl

password ******

导出整个数据库的数据,可以使用以下命令:

$ MysqLdump -u root -pW3CSCHOOL > database_dump.txt

password ******

备份所有数据库,可以使用以下命令:

$ MysqLdump -u root -p--all-databases > database_dump.txt

password ******

在 MysqLdump 命令中指定数据库名及数据表。

在源主机上执行以下命令,将数据备份至 dump.txt 文件中:

$ MysqLdump -u root -pdatabase_name table_name > dump.txt

password *****

将备份的数据库导入到MysqL服务器中,可以使用以下命令,使用以下命令你需要确认数据库已经创建:

$ MysqL -u root -pdatabase_name < dump.txt password *****

以下命令将导出的数据直接导入到远程的服务器上,但请确保两台服务器是相通的,是可以相互访问的:</p>

$ MysqLdump -u root -pdatabase_name \

       | MysqL -h other-host.com database_name

 MysqL 导入数据

从当前目录中读取文件dump.txt ,将该文件中的数据插入到当前数据库的 mytbl 表中。

MysqL> LOAD DATALOCAL INFILE 'dump.txt' INTO TABLE mytbl;

如果用户指定一个FIELDS 子句,它的子句(TERMINATED BY、[OPTIONALLY] ENCLOSED BY 和 ESCAPED BY) 也是可选的,不过,用户必须至少指定它们中的一个。

MysqL> LOAD DATALOCAL INFILE 'dump.txt' INTO TABLE mytbl

  -> FIELDS TERMINATED BY ':'

  -> LInes TERMINATED BY '\r\n';

指定列的顺序。

如,在数据文件中的列顺序是a,c,但在插入表的列顺序为b,c,a,则数据导入语法如下:

MysqL> LOAD DATALOCAL INFILE 'dump.txt'

    -> INTO TABLE mytbl (b,a);

 

使用mysqlimport 导入数据

mysqlimport客户端提供了LOADDATA INFILEQL语句的一个命令行接口。mysqlimport的大多数选项直接对应LOAD DATA INFILE子句。

从文件 dump.txt 中将数据导入到 mytbl数据表中,可以使用以下命令:

$ mysqlimport -u root-p --local database_name dump.txt

password *****

mysqlimport命令可以指定选项来设置指定格式,命令语句格式如下:

$ mysqlimport -u root-p --local --fields-terminated-by=":" \

   --lines-terminated-by="\r\n"  database_name dump.txt

password *****

mysqlimport 语句中使用 --columns 选项来设置列的顺序:

$ mysqlimport -u root-p --local --columns=b,a \

    database_name dump.txt

password *****

关于MySQL基础mysql基础语句大全的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于Mysql入门MySQL基础教程之IN的用法详解、Mysql入门MySQL基础教程第一篇 mysql5.7.18安装和连接教程、Mysql入门Mysql基础知识点汇总、mysql入门之1小时学会MySQL基础的相关信息,请在本站寻找。

本文标签: