《2022年2022年简单SQL查询 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年简单SQL查询 .pdf(8页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Mysql 查询语言一、为什么需要查询语言? 1.查询出另一种关系,得到我想要的数据和结果. 2.查询出的数据更直观,更简洁二、查询 (检索 )数据的四个问题1.你想得到什么结果? 回答这个问题需要从存储在数据库中的多个表中选择数据列,当然 ,需要知道所有的列名 .一般而言 ,最难的部分是搞清楚所有表,并且找到确实需要查询的列.如果数据库有几百个表和几千个列,问题将更为复杂. 2.已经知道什么 (或者有哪些 (限制 )约束 )? 大部分情况下查询带有多个限制条件.例如 ,只对某一特定日期或者某一部门的销售感兴趣 .查询条件需要转换成标准的布尔表达式(用And 和 or 连接的表达式 ),以帮助
2、理解查询的目的. 3.涉及哪些表 ? 很多查询可能只涉及一个表,所以不需要考虑表的连接例: 如果想得到整个公司的销售总额,而非某一个特定员工的总销售额,所以可能没有任何 (条件 )限制 . 对于较少的表,这个问题很容易.对于数百个表.需要确定究竟需要哪些表.那么表的命名是否准确地反映了内容和目的也是至关重要的. 4.如何连接表 ? 这个问题和数据规范化问题相关,并且是关系数据库的核心.具有相似列的表可以连接. 三、查询的种类根椐查询的表数量:可以分为单表查询与多表查询根椐查询的复杂程序: 可以分为简单查询与复杂查询根椐查询的种类: 可以分为子查询与复杂查询四、单表查询的语法Select *|
3、列列表 from 表名 where 条件 group by 分组 order by 排序 having 分组后条件 五、简单查询与单表查询的具体应用1.查询全部行 (记录 ) 语法 1: select * from 表名 ; / * 代表所有的列语法 2: select 所有的列名显式列出from 表名2.查询部分列 (记录 ) 语法 : select 列名 , 列名 1 from 表名 ; /只需列出你想显示的列名3.去掉重复查询distinct 关键字前面介绍的最基本的查询方式会返回从表格中搜索到的所有行的数据,而不管这些数据是否重复, 这常常不是用户所希望看到的。使用 DISTINCT关
4、键字就能够从返回的结果数据集合中删除重复的行,使返回的结果更简洁。在使用DISTINCT关键字后,如果表中有多个为NULL 的数据,服务器会把这些数据视为相等。语法 : Select distinct 列 1, 列 2 from 表; 注: distinct 必须放在所有的列之前,代表几个列组合不重复, 使用 distinct 会减慢名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 8 页 - - - - - - - - - 查询速度,数量大的查询更明显4.更改列名的查询语
5、法 : select 列as 别名 from 表名例如 :select stuName 姓名, stuSex 性别 , stuAge 年龄from student; 注 : 更改别名的意义是为了可读性, 别名可以一致在这里顺带提一下表名也可以更改别名,主要的意义用于多表查询时。5.使用计算列查询(这里讲讲mysql的算术运算符(+, - , * , /) 在进行数据查询时,经常需要对查询到的数据进行再次计算处理。T-SQL 允许直接在 SELECT 语句中使用计算列。计算列并不存在于表格所存储的数据中,它是通过对某些列的数据进行演算得来的结果。Select 单价 *数量 as 金额from s
6、tudent; 注: 一般情况下 , 计算列可以取别名。6.MySQL 聚集函数查询 (aggregate function) 1、 有时候需要计算某一个数据集的行数,某一数据栏所有数据的总和时就需要用到聚集函数。常见的聚集函数有:2、 聚集函数应用详解: Count()用法 : 得到行的数量,有几种不同的用法: select count(*) from student; / 返回一张表中的所有行select COUNT(stuSex) from student; /* 返回这张表中这一列的数量,不包含null*/ select COUNT(distinct stuSex) from stud
7、ent; /* 去掉这一列的重复列,再得到数量 */ avg() 用法 : avg 是求一张表中一列的平均值语法select avg(distinct 列名 ) from 表名 ; 注: avg 只对用于数值型的列有意义.对其它类型无意义Max() 用法 : 求某一列的最大值语法 : select max(列名 ) from 表;列名可以是字符串类型或者数字类型,字符串类型比较的是ASCII 码, 数字类型比较的是大小。max() 用法 : 求某一列的最大值语法 : select max(列名 ) from 表;列名可以是字符串类型或者数字类型,字符串类型比较的是ASCII 码, 数字类型比较
8、的是大小。Sum()用法 : 求所有列的数值总和语法 , select sum(列) from 表注: 只适用于数值类型聚集函数返回的是某一个单独的值,而不是象有些sql 语句一样返回多行的记名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 8 页 - - - - - - - - - 录。7.查询 SELECT 语句返回指定的记录数Select * from table limit offset, rows; 例如 : mysql SELECT * FROM table L
9、IMIT 5,10; / 检索记录行 6-15 /为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:mysql SELECT * FROM table LIMIT 95,-1; / 检索记录行 96-last. /如果只给定一个参数,它表示返回最大的记录行数目:mysql SELECT * FROM table LIMIT 5; /检索前 5 个记录行/换句话说, LIMIT n 等价于 LIMIT 0,n 。8.mysql 条件查询 (where 子句 ) 比较运算符 :比较运算符是用于比较表达式或者值。比较的结果可能是布尔值(1)或者伪值 (0)。 MySQL
10、支持以下的比较运算符:=(等于 ) , (小于 ) (大于 ) =(大于等于 ) != ( 不等于 ) 例如 : select * from student where stuAge 35; /* 查询年龄大于35 岁的*/ 例如 : select * from student where stuName 在中 ; /* 可以用于字符比较*/ 表达式BETWEEN 最小值AND 最大值: BETWEEN运算符是测试在某个范围内是否存在一个数值或者日期值的有用方式。这个运算符接受两个参数最大值和最小值,并测试所提供的值是否在这两个值的范围之内。如果在这个范围之内,运算符就返回一个布尔值真;否则,
11、它就返回一个伪值如果表达式大于或等于并且表达式小于或等于, BETWEEN 返回1,否则返回 0 。mysql select 5 between 5 and 6; mysql select N between M and O; 表达式 NOT BETWEEN AND 与此类似,但是要取否(NOT ) 。GREATEST和 LEAST GREATEST 和 LEAST运算符为判断一组数字或者时间值中最大和最小值提供了一个便捷的途径。你一看名字就知道这两个运算符的作用下面是一个对一组日期使用GREATEST 运算符例子:mysql SELECT GREATEST(20000601, 2000052
12、9, 20000604); 而下面是一个对一组数值使用LEAST运算符的例子:mysql SELECT LEAST(100, 200, 50, -6, -73, 1000); mysql 中的逻辑与操作是and ,逻辑或操作符是or,逻辑非操作符是not mysql SELECT * FROM pet WHERE species = dog AND sex = f; mysql SELECT * FROM pet WHERE species = snake OR species = bird; mysql SELECT * FROM pet WHERE not species = snake
13、; 比较运算符常与逻辑运算符结合在一起使用。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 8 页 - - - - - - - - - In 与 Not In 可选值列表模型查询 (Like 与 not like) 模式匹配的格式。SQL的模式匹配允许你使用 “ _”匹配任何单个字符,而“% ”匹配任意数目字符 ( 包括零个字符) 。在 MySQL中,SQL的模式缺省是忽略大小写的。下面显示一些例子。注意在你使用SQL模式时,你不能使用 =或!= ;而使用 LIKE 或
14、NOT LIKE比较操作符。为了找出以“ b”开头的名字:mysql SELECT * FROM pet WHERE name LIKE b%; 为了找出以“ fy ”结尾的名字:mysql SELECT * FROM pet WHERE name LIKE %fy; 为了找出包含一个“w”的名字:mysql SELECT * FROM pet WHERE name LIKE %w%; 为了找出包含正好5 个字符的名字,使用“ _”模式字符:mysql SELECT * FROM pet WHERE name LIKE _; 由 MySQL 提供的模式匹配的其他类型是使用扩展正则表达式。当你对
15、这类模式进行匹配测试时,使用 REGEXP 和 NOT REGEXP 操作符 ( 或 RLIKE和 NOT RLIKE ,它们是同义词 ) 。扩展正则表达式的一些字符是:“. ”匹配任何单个的字符。一个字符类 “.”匹配在方括号内的任何字符。例如,“abc ”匹配“a”、 “b”或“c”。为了命名字符的一个范围,使用一个“- ”。“ a-z ”匹配任何小写字母,而“0-9 ”匹配任何数字。“ * ”匹配零个或多个在它前面的东西。例如,“x*”匹配任何数量的 “x”字符,“0-9*”匹配的任何数量的数字,而“.* ”匹配任何数量的任何东西。正则表达式是区分大小写的,但是如果你希望,你能使用一个字
16、符类匹配两种写法。例如,“aA ”匹配小写或大写的“a”而“a-zA-Z”匹配两种写法的任何字母。如果它出现在被测试值的任何地方,模式就匹配( 只要他们匹配整个值,SQL模式匹配 ) 。为了定位一个模式以便它必须匹配被测试值的开始或结尾,在模式开始处使用“”或在模式的结尾用“ $”。为了说明扩展正则表达式如何工作,上面所示的LIKE 查询在下面使用REGEXP 重写:为了找出以 “b”开头的名字, 使用“” 匹配名字的开始并且 “bB ”匹配小写或大写的 “b” :mysql SELECT * FROM pet WHERE name REGEXP bB; 为了找出以“ fy ”结尾的名字,使用
17、“$”匹配名字的结尾:mysql SELECT * FROM pet WHERE name REGEXP fy$; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 8 页 - - - - - - - - - 为了找出包含一个“w”的名字,使用“ wW”匹配小写或大写的“w”:mysql SELECT * FROM pet WHERE name REGEXP wW; 既然如果一个正规表达式出现在值的任何地方,其模式匹配了,就不必再先前的查询中在模式的两方面放置一个通配符以使
18、得它匹配整个值,就像如果你使用了一个SQL模式那样。为了找出包含正好5 个字符的名字,使用“ ”和“ $”匹配名字的开始和结尾,和5 个“. ”实例在两者之间:mysql SELECT * FROM pet WHERE name REGEXP .$; 你也可以使用“ n ”“重复 n 次”操作符重写先前的查询:mysql SELECT * FROM pet WHERE name REGEXP .5$; 空查询 (null 与not null) select * from student where stuSex is not null; select * from student where
19、stuSex not null; 9.MYSQL GROUP BY 和 HAVING子句group by 分组通用数据库具有基于表的特定列对数据进行分析的能力。可按照在 GROUP BY 子句中定义的组对行进行分组。以其最简单的形式,组由称为分组列的列组成。 SELECT 子句中的列名必须为分组列或列函数。列函数对于 GROUP BY 子句定义的每个组各返回一个结果。下列示例产生一个列出每个部门编号的最高薪水的结果:SELECT DEPT, MAX(SALARY) AS MAXIMUM FROM STAFF GROUP BY DEPT 此语句产生下列结果:DEPT MAXIMUM - - 10
20、 22959.20 15 20659.80 20 18357.50 38 18006.00 42 18352.80 51 21150.00 66 21000.00 84 19818.00 注意:计算的是每个部门(由 GROUP BY 子句定义的组)而不是整个公司的 MAX(SALARY) 。将 WHERE 子句与 GROUP BY 子句一起使用分组查询可以在形成组和计算列函数之前具有消除非限定行的标准 WHERE 子句。必须在GROUP BY 子句之前指定 WHERE 子句。例如:SELECT WORKDEPT, EDLEVEL, MAX(SALARY) AS MAXIMUM FROM EMP
21、LOYEE WHERE HIREDATE 1979-01-01 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 8 页 - - - - - - - - - GROUP BY WORKDEPT, EDLEVEL ORDER BY WORKDEPT, EDLEVEL 结果为:WORKDEPT EDLEVEL MAXIMUM - - - D11 17 18270.00 D21 15 27380.00 D21 16 36170.00 D21 17 28760.00 E11 12
22、15340.00 E21 14 26150.00 注意:在 SELECT 语句中指定的每个列名也在 GROUP BY 子句中提到。未在这两个地方提到的列名将产生错误。GROUP BY 子句对 WORKDEPT 和 EDLEVEL 的每个唯一组合各返回一行。在 GROUP BY 子句之后使用 HAVING 子句可应用限定条件进行分组,以便系统仅对满足条件的组返回结果。为此,在GROUP BY 子句后面包含一个 HAVING 子句。 HAVING 子句可包含一个或多个用 AND 和 OR 连接的谓词。 每个谓词将组特性(如 AVG(SALARY) )与下列之一进行比较:该组的另一个特性例如:HAV
23、ING AVG(SALARY) 2 * MIN(SALARY) 常数例如:HAVING AVG(SALARY) 20000 例如,下列查询寻找雇员数超过 4 的部门的最高和最低薪水:SELECT WORKDEPT, MAX(SALARY) AS MAXIMUM, MIN(SALARY) AS MINIMUM FROM EMPLOYEE GROUP BY WORKDEPT HAVING COUNT(*) 4 ORDER BY WORKDEPT 此语句产生下列结果:WORKDEPT MAXIMUM MINIMUM - - - D11 32250.00 18270.00 D21 36170.00 1
24、7250.00 E11 29750.00 15340.00 有可能(虽然很少见)查询有 HAVING 子句但没有 GROUP BY 子句。在此情况下, DB2 将整个表看作一个组。因为该表被看作是单个组,所以最多可以有一个结果行。如果 HAVING 条件对整个表为真, 则返回选择的结果(该结果必须整个由列函数组成);否则不返回任何行。官方讲是按组操作, 或者好理解点就是按类操作. 看个例子你就明白了, 表如下 : 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 8 页 -
25、 - - - - - - - - ID 名称 仓库 数量01 西瓜 一号 10 02 西瓜 二号 30 03 大米 一号 30 04 苹果 一号 40 05 苹果 二号 45 06 苹果 三号 5 Select name,Sun(price) From 表 Group By name 以上 SQL将返回各种商品的总数量, 而不管是哪个仓库的. 结果 : 西瓜 ,40 大米 ,30 苹果 ,90 10.order by 子句功能 : 对查询进行排序显示语法 : select * from 表名 order by 列名 asc|desc, 列名 1 asc|desc Asc: 代表升序排序, 如果
26、列名后不写的情况下,默认也是升序排序。Desc: 代表降序排序当多个列进行排序时, 只有当第一个列相同的时候,才根椐第二个列进行排序操作。六、mysql 的表的复制与数据导入与导出1.MySQL 表的复制创建表的副本:创建一个完全和上表表结构一样,数据也一样的新表,语法: create table new_nickname select * from nickname; 注:但约束不会被创建. 只创建含有特定字段的表副本:create table new_nickname select name, desc from nickname; 只创建含有约束条件的值的表副本:create table
27、 new_nickname select * from nickname where id 3; 相当于只复制于id 3的数据和表结构只复制表结构,咱爷们不要表数据:create table new_nickname select * from nickname where 0 = 1; 上面的方法是取巧,因为没有合格的数据符合限制条件,所以被复制的当然只有表结构了。另外MySQL 提供了一个现成的语法,那就是:create table new_talbe_name like old_table_name;/* 应用 create table like 语法,只复制表结构*/ create t
28、able new_nickname like nickname; 复制旧表部分结构,同时增加新字段:create table new_nickname (create_time date not null, status enum(1,2) select name, desc from nickname; 2.导出数据名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 8 页 - - - - - - - - - 导出表中所有数据到C盘根目录outfile.txt中如下:Select * into outfile c:outfile.txt from test; 导出表中指定查询条件2005-06-08号的数据到C盘根目录outfile1.txt中如下:Select * into outfile c:outfile.txt from test where beginDate=2008-06-08; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 8 页 - - - - - - - - -