视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
关于MySql的SQL语言-MySQL入门教程
2025-09-28 00:20:08 责编:小OO
文档
关于 MySql 的 SQL 语言

  目前常用的数据库有 Oracle 公司的 Oracle , Microsoft 公司的 SQL Server , IBM 公司的 DB2 和 MySql 公司的 MySql, 而免费的数据库目前只有 MySql ,当然盗版的不算。 

  SQL (Structured Query Language) 结构化查询语言是目前一个国际上标准的数据库专用语言。 

不过不同的数据库所使用的 SQL 语句都会稍有一些不同,但基本的标准还是会遵循 SQL ,例如: 

用与 SQL Server 的叫做 PL-SQL ,用于 Oracle 的叫做 T-SQL ,它们都是 SQL 的子类,或者说是派生类。用于 MySql 的我还不知道它叫做什么 SQL ,不过个人觉得它反而最接近标准的 SQL 语言,不过,从另一方面来说,它对 SQL 所做的扩展最少。 

  就我现在的理解 SQL 语言就是用来使用数据库和操作数据用的,不包括操作数据库,那些操作数据库的代码应该叫做命令,如:启动,关闭数据库,设置字符集,设置访问连接用户数等,这些不属于 SQL 语言,不同的数据库都有自己的命令,这些命令是生产企业制定的。下面,我大概来说一下 SQL 所做的事情创建数据库,创建表,插入、修改、删除数据, 

查询数据(最主要的是这个功能,方便数据的储存和查询是人们发明数据库的理由)。 

当然,我下面介绍的 SQL 都是用于 MySql 的。 

                              SQL 基础知识 

一、 数据类型 

INT [ 常用 ] 整数 BIGIN 大整数 FLOAT ( 单精密 ) 浮点数字 DOUBLE [ 常用 ] ( 双精密 ) 浮点数字 

NUMERIC(M,D) [ 常用 ] 未压缩 (unpack) 的浮点数字, “ 未压缩 ” 意味着数字作为一个字符串被存储,值的每一位使用一个字符。例: NUMERIC(16,2) 表示这个 浮点数字的储存空间为 16 个字节,精度为 2 (即小数点后保留 2 位数字)。 

DATE [ 常用 ] 日期   DATETIME [ 常用 ] 日期和时间组合   CHAR(M) 一个定长字符串 

TIMESTAMP(M) [ 常用 ] 时间戳记。以 YYYYMMDDHHMMSS 、 YYMMDDHHMMSS 、 YYYYMMDD 或 YYMMDD 格式来显示 TIMESTAMP 值,例: TIMESTAMP(14) 格式为YYYYMMDDHHMMSS、TIMESTAMP(8) 格式为YYYYMMDD 

VARCHAR(M) [ 常用 ] 可变长度的字符串   BLOB 大对象存储类型 

TEXT [ 常用 ] 大文本存储类型, 最大长度为 65535(2^16-1) 个字符 

我觉得用的多的类型用 [ 常用 ] 标记了一下,相关时间的那几个各有各的优点,就看你的需要了。 

二、 变量 

declare @iAge int -- 声明变量 

set @iAge = 12 -- 给变量附值 

print @iAge -- 打印变量 

select @ iAge:= ’iage’ from employe where name=’Bill’ ; 将查询到字段给变量附值 

注意 : 这里, select 语句中我们不得不使用 := 句法,因为 = 是为比较保留的 

三、 逻辑控制 

-- IF 条件判断 

declare @i int 

set @i = 12 

if (@i > 10) 

    begin                

        print 'Dadadada!' 

        print 'Dadadada!' 

    end                

else 

    begin 

        print 'XiaoXiao!' 

        print 'XiaoXiao!' 

    end 

-- While 循环控制 

declare @i int; 

set @i = 12; 

print @i 

return; 

while (@i < 18) 

begin 

    print @i; 

    set @i = @i + 1; 

    if @i < 17 

        continue; 

    if @i > 15 

        break; 

end; 

-- CASE 分支判断 

select au_lname, state, ' 犹他州 ' from authors where state = 'UT' 

select au_lname, state, ' 密西西比州 ' from authors where state = 'MI' 

select au_lname, state, ' 肯塔基州 ' from authors where state = 'KS' 

select au_lname, state, 

    case state 

    when 'UT' then ' 犹他州 ' 

    when 'MI' then ' 密西西比州 ' 

    when 'KS' then ' 肯塔基州 ' 

    when 'CA' then ' 加利福利亚 ' 

    else state 

    end 

from authors 

四、 函数 

这部分的内容很多 , 我也不是很熟这里就我所知道的列一点 : 

-- 获取给定字符串的长度 

print length('abcdef') 

-- 大小写转换 

print lower('ABCDEF') 

print upper('abcdef') 

-- 去空格 

print ltrim('    abcd  dfd  df  ') 

print rtrim('    abcd  dfd  df  ') 

-- 求绝对值 

print abs(-12) 

-- 幂 

-- 3 的 2 次方 

print power(3,2) 

-- 随机数 

-- 0 - 1000 之间的随机数 

print rand() * 1000 

-- 获取圆周率 

print pi() 

-- 获取系统时间 

print now() 

-- 获取指定时间之间相隔多少年 

print datediff(year, '2005-01-01', '2008-01-01') 

-- 字符串合并 

print 'abc' + 'def' 

print 'abc' + '456' 

-- 获取指定时间的特定部分 

print datepart(year, now()) 

-- 获取字符串中的一段 

print SUBSTRING( ‘ abcdef ’ ,1,3) 

-- 获取纪录个数 

select count(*) from employe; 

-- 获取指定工资的和 

select sum(salary) from employe; 

-- 获取年龄大于 30 岁员工的最高工资 

select max(salary) from employe where iage>30; 

等等 

五、 注释 

  # 单行注释   -- 单行注视   /* 内容 */ 多行注释 

SQL 常规应用 

一、 创建数据库 

用给定的名字创建一个数据库 

CREATE DATABASE db_name 

删除数据库中给定名字的数据库(慎重使用) 

DROP DATABASE [IF EXISTS] db_name 

调出要用的数据库 

USE db_name 

下面是一个完整的创建例子,同时创建了一个数据库 log 文件 

-- 指定数据库名称 

-- ( 注:如果数据库名中包含空格可以使用 [] 将其标示 ) 

create database [Super WC] 

-- 关于数据文件的定义 

on 

name = Super_WC_Data,                -- 逻辑名 

filename = 'C:\\Super_WC_Data.MDF',        -- 物理路径以及物理名 

size = 2MB,                    -- 初始大小 

maxsize = 4MB,                    -- 最大 

filegrowth = 1MB                                            -- 增长大小 

-- 关于日志文件的定义 

log on 

name = Super_WC_Log, 

filename = 'C:\\Super_WC_Log.LDF', 

size = 3MB, 

maxsize = 7MB, 

filegrowth = 20%                                            -- 增长比例 

二、 创建表 

drop table if exists auto_incr_test; -- 先把以前数据库中有可能存在的表删除 

create table auto_incr_test ( 

id int not null auto_increment,  -- 这里的 not null 代表这一列的值不能为空默认是 null 

name char(40), 

timestamp timestamp, 

primary key (id)  -- 创建主键 

foreign key (name) references students (no),  -- 创建外键 

/* 上面出现的 auto_increment 代表了 id 这个列是一个自动增长列 */ 

要删除这个表就用 drop table auto_incr_test; 就可以了 . 

下面是包含约束的情况(设置约束可以增强数据库的完整性,但需要事先精确的设计,因为改动起来实在是太麻烦了): 

create table students 

no        char(4)      not null    auto_increment primary key, 

name      nvarchar(8)     not null, 

birthday  datetime      check(datediff(year, birthday, now()) >= 18), 

age       as datediff(year, birthday, now ()), 

sex      nchar(1)        not null default(' 女 ') check(sex = ' 女 ' or sex = ' 男 '), 

phone     char(11)         check((phone is null) or (length(phone) = 11)), 

address   nvarchar(24) 

注意:表创建后修改起来比较麻烦,如果不是一定要修改的话可以删了再创建,尽量设计时就把握好需求,设计完美一点。 

三、 数据操作 ( 添、删、改、查 )  传说中著名的添删改查 

添加操作 (insert) 的语法格式: 

Insert [into] 数据表 ( 字段 ) values ( 数据 )  -- [into] 可以省略 

例:INSERT tbl_name (col1,col2) VALUES(15, ’abc’ ); 

  

修改操作 (update) 的语法格式: 

Update 数据表 set 字段 = 新值 where 条件 

例:UPDATE tbl_name SET col2=  ’BBB’ WHERE col2=’abc’;

删除操作 (delete) 的语法格式: 

Delete [from] 数据表 where 条件   -- [] 内的可写可不写,最好是写,不过懒人都不写 

例:DELETE tbl_name  WHERE col2=’abc’  ; 

  

  查询操作 (select) 的语法格式: 

select 字段 from 数据表 where 条件 order by 字段 desc/asc 

/* 这里的 order by 是用来指定排序依赖列, desc 是指以降序排列(默认的是 asc 升序) */ 

例:SELECT col1,col2 FROM tbl_name  WHERE col2=’abc’ ORDER BY col1 DESC ; 

     

注意:方便数据的储存和查询是人们发明数据库的理由,所以查询操作是 SQL 中的精髓之一,我上面的格式只是列出了较常用的格式,但只要是程序功能要求稍微复杂点的就要用到许多查询语句的高级特性了,我会在后面介绍我所能了解的。 

SQL 高级应用 

一、 高级查询 

1 .高级查询(就是把 SQL 定义的 SELECT 语句的语法都用到了的) 

SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [HIGH_PRIORITY]   

[DISTINCT | DISTINCTROW | ALL] 

select_expression,... 

[INTO {OUTFILE | DUMPFILE} 'file_name' export_options] 

[FROM table_references 

[WHERE where_definition] 

[GROUP BY col_name,...] 

[HAVING where_definition] 

[ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] ,...] 

[LIMIT [offset,] rows] 

[PROCEDURE procedure_name] ] 

GROUP BY 用于分组查询 

HAVING 用于聚合函数的查询条件 

LIMIT 用于SELECT语句返回的行数 

2 .多表查询(又叫联合查询) 

查找与多个表相关的数据,例: 

Select name,iage,city from students a inner join address b where a.addressid=b.id and name= ’Bill’ ; 

3 .子查询(很多内容,我不能尽举) 

有两种类型的子查询:“嵌套”子查询和“相关”子查询。 

例: 

-- 子查询 

-- 根据作者的名查找其编写的书籍 

-- 先通过子查询获取作者编号 

-- 然后,将其作为查询条件,找出相应的书籍编号 

-- 最后,在利用所得到的书籍编号来得到书籍信息 

select au_id, title_id from titleauthor 

where au_id = 

    (select au_id from authors where au_lname = 'Green') 

select * from titles 

where title_id in 

    ( 

    select title_id from titleauthor 

        where au_id = 

        (select au_id from authors where au_lname = 'Green') 

    ) 

二、 视图 

CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] 

    VIEW view_name [(column_list)] 

    AS select_statement 

    [WITH [CASCADED | LOCAL] CHECK OPTION] 

例: 

CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t; 

三、 存储过程 

CREATE PROCEDURE sp_name ([proc_parameter[,...]]) 

    [characteristic ...] routine_body 

例: 

create procedure proGetJobsByPage 

@CurrentPageSize int, 

@PageSize int, 

@CurrentPage int 

as 

Declare @strSql nvarchar(400) 

set @strSql = 'select * from 

        (select top ' + convert(nvarchar(4), @CurrentPageSize) + ' * 

        from (select top ' + convert(nvarchar(4),(@PageSize * @CurrentPage)) + ' * from jobs) as tt 

        order by job_id desc) as stt 

        order by job_id' 

exec sp_executesql @strSql 

四、 触发器 

CREATE TRIGGER trigger_nametrigger_timetrigger_event 

ON tbl_name FOR EACH ROW trigger_stmt 

例: 

-- 创建插入触发器 

create trigger emp_marins 

on emp_mgr 

for insert 

as 

declare @e char(30),@m char(30) 

declare cur_mgr cursor for 

    select emp_mgr.emp 

    from emp_mgr,inserted 

    where emp_mgr.emp = inserted.mgr 

open  cur_mgr 

fetch next from cur_mgr into @e 

while @@fetch_status = 0 

begin 

    update emp_mgr 

    set emp_mgr.NoOfReports = emp_mgr.NoOfReports + 1 

    where emp_mgr.emp = @e 

    

    fetch next from cur_mgr into @e 

end 

close cur_mgr 

deallocate cur_mgr 

五、 索引(很有用,可以提高查询语句的执行效率) 

CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name 

    [USING index_type] 

    ON tbl_name (index_col_name,...) 

例: 

此处展示的语句用于创建一个索引,索引使用列 name 。 

CREATE INDEX part_of_name ON customer (name); 

OK ,先些这些啦,累死了,呵呵 … 

(如有错误,请大家不吝赐教 … )下载本文

显示全文
专题