Linux下MySQL常用操作网络汇总总结

时间:2022-06-13 06:18:46
一查询数值型数据:
 SELECT * FROM tb_name WHERE sum > 100;
 查询谓词:>,=,<,<>,!=,!>,!<,=>,=<
 
二查询字符串
 SELECT * FROM tb_stu  WHERE sname  =  '小刘'
 SELECT * FROM tb_stu  WHERE sname like '刘%'
 SELECT * FROM tb_stu  WHERE sname like '%程序员'
 SELECT * FROM tb_stu  WHERE sname like '%PHP%'
 
三查询日期型数据
 SELECT * FROM tb_stu WHERE date = '2011-04-08'
 注:不同数据库对日期型数据存在差异: :
 (1)MySQL:SELECT * from tb_name WHERE birthday = '2011-04-08'
 (2)SQL Server:SELECT * from tb_name WHERE birthday = '2011-04-08'
 (3)Access:SELECT * from tb_name WHERE birthday = #2011-04-08#
 
四查询逻辑型数据
 SELECT * FROM tb_name WHERE type = 'T'
 SELECT * FROM tb_name WHERE type = 'F'
 逻辑运算符:and or not
 
五查询非空数据
 SELECT * FROM tb_name WHERE address <>'' order by addtime desc
 注:<>相当于PHP中的!=
 
六利用变量查询数值型数据
 SELECT * FROM tb_name WHERE id = '$_POST[text]' 
注:利用变量查询数据时,传入SQL的变量不必用引号括起来,因为PHP中的字符串与数值型数据进行连接时,程序会自动将数值型数据转变成字符串,然后与要连接的字符串进行连接
 
七利用变量查询字符串数据 
SELECT * FROM tb_name WHERE name LIKE '%$_POST[name]%' 
完全匹配的方法"%%"表示可以出现在任何位置
 
八查询前n条记录
 SELECT * FROM tb_name LIMIT 0,$N;
 limit语句与其他语句,如order by等语句联合使用,会使用SQL语句千变万化,使程序非常灵活
 
九查询后n条记录
 SELECT * FROM tb_stu ORDER BY id ASC LIMIT $n
 
十查询从指定位置开始的n条记录
 SELECT * FROM tb_stu ORDER BY id ASC LIMIT $_POST[begin],$n
 注意:数据的id是从0开始的
 
十一查询统计结果中的前n条记录
 SELECT * ,(yw+sx+wy) AS total FROM tb_score ORDER BY (yw+sx+wy) DESC LIMIT 0,$num
 
十二查询指定时间段的数据
 SELECT  要查找的字段 FROM 表名 WHERE 字段名 BETWEEN 初始值 AND 终止值
 SELECT * FROM tb_stu WHERE age BETWEEN 0 AND 18
 
十三按月查询统计数据
 SELECT * FROM tb_stu WHERE month(date) = '$_POST[date]' ORDER BY date ;
 注:SQL语言中提供了如下函数,利用这些函数可以很方便地实现按年、月、日进行查询
 year(data):返回data表达式中的公元年分所对应的数值
 month(data):返回data表达式中的月分所对应的数值
 day(data):返回data表达式中的日期所对应的数值
 
十四查询大于指定条件的记录
 SELECT * FROM tb_stu WHERE age>$_POST[age] ORDER BY age;
 
十五查询结果不显示重复记录
 SELECT DISTINCT 字段名 FROM 表名 WHERE 查询条件 
注:SQL语句中的DISTINCT必须与WHERE子句联合使用,否则输出的信息不会有变化 ,且字段不能用*代替
 
十六NOT与谓词进行组合条件的查询
 (1)NOT BERWEEN … AND … 对介于起始值和终止值间的数据时行查询 可改成 <起始值 AND >终止值
 (2)IS NOT NULL 对非空值进行查询 
 (3)IS NULL 对空值进行查询
 (4)NOT IN 该式根据使用的关键字是包含在列表内还是排除在列表外,指定表达式的搜索,搜索表达式可以是常量或列名,而列名可以是一组常量,但更多情况下是子查询
 
十七显示数据表中重复的记录和记录条数
 SELECT  name,age,count(*) ,age FROM tb_stu WHERE age = '19' group by date
 
十八对数据进行降序/升序查询
 SELECT 字段名 FROM tb_stu WHERE 条件 ORDER BY 字段 DESC 降序
 SELECT 字段名 FROM tb_stu WHERE 条件 ORDER BY 字段 ASC  升序
 注:对字段进行排序时若不指定排序方式,则默认为ASC升序
 
十九对数据进行多条件查询
 SELECT 字段名 FROM tb_stu WHERE 条件 ORDER BY 字段1 ASC 字段2 DESC  …
 注意:对查询信息进行多条件排序是为了共同限制记录的输出,一般情况下,由于不是单一条件限制,所以在输出效果上有一些差别。
 
二十对统计结果进行排序
 函数SUM([ALL]字段名) 或 SUM([DISTINCT]字段名),可实现对字段的求和,函数中为ALL时为所有该字段所有记录求和,若为DISTINCT则为该字段所有不重复记录的字段求和
 如:SELECT name,SUM(price) AS sumprice  FROM tb_price GROUP BY name
 
SELECT * FROM tb_name ORDER BY mount DESC,price ASC
 
二十一单列数据分组统计
 SELECT id,name,SUM(price) AS title,date FROM tb_price GROUP BY pid ORDER BY title DESC
 注:当分组语句group by排序语句order by同时出现在SQL语句中时,要将分组语句书写在排序语句的前面,否则会出现错误
 
二十二多列数据分组统计
 多列数据分组统计与单列数据分组统计类似 
SELECT *,SUM(字段1*字段2) AS (新字段1) FROM 表名 GROUP BY 字段 ORDER BY 新字段1 DESC
 SELECT id,name,SUM(price*num) AS sumprice  FROM tb_price GROUP BY pid ORDER BY sumprice DESC
 注:group by语句后面一般为不是聚合函数的数列,即不是要分组的列
 
二十三多表分组统计

 SELECT a.name,AVG(a.price),b.name,AVG(b.price) FROM tb_demo058 AS a,tb_demo058_1 AS b WHERE a.id=b.id GROUP BY b.type;

索引的操作

如何建立索引   ·索引通常被用于提高WHERE条件的数据行匹配或者执行联结操作时匹配其它表的数据行的搜索速度。所以我们选择索引的列也通常选择出现在WHERE子句、join子句、ORDERBY或GROUP BY子句中的列。 ·选择索引时,需要考虑数据列的基数。所谓基数,是指数据列所包含的不同的数据的个数。如果基数相对于数据表行数较高的话,索引的效果比较好。换句话说,就是指数据列的不同的值越多,索引效果越好。如果一个数据列只包含:0或者1两个值的话,索引的用处就不大。如果值出现的几率几乎相等,那么无论搜索哪个值都可能得到一半的数据行。在这些情况下,最好根本不要使用索引。 ·索引值较短的值,所选择的数据类型也尽可能的要小一些。譬如:如果TEXT能满足需求的话,我们就不需要用MEDIUTEXT。 ·如果建立联合索引的话,譬如对:t1,t2,t3建立联合索引的话,同时也是对t1和t1,t2建立了索引。但是如果单独指定t2、t3、t1t3、t2t3的值的话,都会用不到索引。
  sql语句中如何避免没有使用索引的情况   首先先了解一下mysql优化器的工作原理:MySQL查询优化器最主要的目标是尽可能地使用索引,并且使用最严格的索引来消除尽可能多的数据行。所以当我们提交查询语句时,如果优化器排除不符合条件的数据的速度越快,那么查询的结果也会越快。 ·尽量比较数据类型相同的数据列。例如,INT与BIGINT是不同的。CHAR(10)被认为是CHAR(10)或VARCHAR(10),但是与CHAR(12)或VARCHAR(12)不同。 ·尽量不要在where子句中对索引列使用表达式或者函数。如果你在索引列使用函数调用或者更复杂的算术表达式,MySQL就不会使用索引,因为它必须计算出每个数据行的表达式值。    WHERE mycol < 4 / 2使用索引
   WHERE mycol * 2 < 4没有使用索引
· 在使用LIKE时,尽量不要在开头使用通配符。     WHEREcol_name LIKE ’%string%’     WHEREcol_name LIKE ’abc%’ ·不要使用类型转换。如果某个索引列是int型,而在查询时,赋值为字符型,将使用不了索引。     SELECT* FROM mytbl WHERE num_col = 1;使用索引
    SELECT *FROM mytbl WHERE num_col = ‘1’;没有使用索引
·在SELECT语句中可以使用STRAIGHT_JOIN关键字来重载优化器的选择。     SELECTSTRAIGHT_JOIN ... FROM t1, t2, t3 ... ;
    SELECT ...FROM t1 STRAIGHT_JOIN t2 STRAIGHT_JOIN t3 ...

视图

视图是从一个或几个基本表(或视图)导出的表。它与基本表不同,是一个虚表。数据库只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中所以基本表中的数据发生变化,从视图中查询出的数据也就随之改变了。从这个意义上讲,视图就像一个窗口,透过它可以看到数据库中自己感兴趣的数据及其变化。
既然视图的定义是基于基本表的,哪为什么还要定义视图呢?这是因为合理地使用视图能够带来许多好处:
1、 视图能简化用户操作
    视图机制使用户可以将注意力集中在所关心地数据上。如果这些数据不是直接来自基本表,则可以通过定义视图,使数据库看起来结构简单、清晰,并且可以简化用户的的数据查询操作。例如,那些定义了若干张表连接的视图,就将表与表之间的连接操作对用户隐藏起来了。换句话说,用户所作的只是对一个虚表的简单查询,而这个虚表是怎样得来的,用户无需了解。
2、 视图使用户能以多种角度看待同一数据
    视图机制能使不同的用户以不同的方式看待同一数据,当许多不同种类的用户共享同一个数据库时,这种灵活性是非常必要的。
3、 视图对重构数据库提供了一定程度的逻辑独立性
    数据的物理独立性是指用户的应用程序不依赖于数据库的物理结构。数据的逻辑独立性是指当数据库重构造时,如增加新的关系或对原有的关系增加新的字段,用户的应用程序不会受影响。层次数据库和网状数据库一般能较好地支持数据的物理独立性,而对于逻辑独立性则不能完全的支持。
在关许数据库中,数据库的重构造往往是不可避免的。重构数据库最常见的是将一个基本表“垂直”地分成多个基本表。例如:将学生关系Student(Sno,Sname,Ssex,Sage,Sdept),
分为SX(Sno,Sname,Sage)和SY(Sno,Ssex,Sdept)两个关系。这时原表Student为SX表和SY表自然连接的结果。如果建立一个视图Student:
CREATE VIEW Student(Sno,Sname,Ssex,Sage,Sdept)
AS
SELECT SX.Sno,SX.Sname,SY.Ssex,SX.Sage,SY.Sdept
FROM SX,SY
WHERE SX.Sno=SY.Sno;
    这样尽管数据库的逻辑结构改变了(变为SX和SY两个表了),但应用程序不必修改,因为新建立的视图定义为用户原来的关系,使用户的外模式保持不变,用户的应用程序通过视图仍然能够查找数据。
当然,视图只能在一定程度上提供数据的逻辑独立,比如由于视图的更新是有条件的,因此应用程序中修改数据的语句可能仍会因为基本表构造的改变而改变。
4、视图能够对机密数据提供安全保护
    有了视图机制,就可以在设计数据库应用系统时,对不同的用户定义不同的视图,使机密数据不出现在不应该看到这些数据的用户视图上。这样视图机制就自动提供了对机密数据的安全保护功能。例如,Student表涉及全校15个院系学生数据,可以在其上定义15个视图,每个视图只包含一个院系的学生数据,并只允许每个院系的主任查询和修改本原系学生视图。
5、适当的利用视图可以更清晰地表达查询
    例如经常需要执行这样的查询“对每个学生找出他获得最高成绩的课程号”。可以先定义一个视图,求出每个同学获得的最高成绩:
CREATE VIEW VMGRADE
AS
SELECT Sno,MAX(Grade) Mgrade
FROM SC
GROUP BY Sno;
然后用如下的查询语句完成查询:
SELECT SC.Sno,Cno FROM SC,VMGRADE WHERE SC.Sno = VMGRADE.Sno AND SC.Grade = VMGRADE.Mgrade;

存储过程

是一组为了完成特定功能的SQL语句集,是利用SQL Server所提供的Transact-SQL语言所编写的程序。经编译后存储在数据库中,是在MySQL服务器中存储和执行的,可以减少客户端和服务器端的数据传输。存储过程是数据库中的一个重要对象,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是由流控制和SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,存储过程可由应用程序通过一个调用来执行,而且允许用户声明变量。同时,存储过程可以接收和输出参数、返回执行存储过程的状态值,也可以嵌套调用。

为什么要使用存储过程:

ü  存储过程是已经被认证的技术!

ü  存储过程会使系统运行更快!

ü  存储过程是可复用的组件!它是数据库逻辑而不是应用程序。

ü  存储过程将被保存!

存储过程的优点:

Ø  存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。

Ø  当对数据库进行复杂操作时(如对多个表进行UpdateInsertQueryDelete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。

Ø  存储过程可以重复使用,可减少数据库开发人员的工作量。

Ø  安全性高,可设定只有某此用户才具有对指定存储过程的使用权。

 

 

1、创建存储过程

  1. CREATE PROCEDURE
  2.     sp_name ([proc_parameter[,...]])
  3.     [characteristic ...] routine_body

  4. proc_parameter中的每个参数由3部分组成。
  5. 这3部分分别是输入输出类型、参数名称和参数类型,其形式如下:
  6. [ IN | OUT | INOUT ] param_name type


  1. CREATE PROCEDURE
  2. food_price_count (IN price_info1FLOAT,IN price_info2FLOAT, OUT count INT)
  3.    READS SQL DATA
  4.    BEGIN
  5.     DECLARE temp FLOAT;
  6.     DECLARE match_price CURSOR FOR SELECT price FROM food;
  7.     DECLARE EXIT HANDLER FOR NOT FOUND CLOSE match_price;
  8.     SET @sum=0;
  9.     SELECT COUNT(*)INTOcount FROM food
  10.      WHERE price>price_info1AND price<price_info2;
  11.     OPEN match_price;
  12.     REPEAT
  13.      FETCH match_price INTO temp;
  14.      IF temp>price_info1 AND temp<price_info2
  15.         THEN SET@sum=@sum+temp;
  16.     END IF;
  17.     UNTIL 0 END REPEAT;
  18.     CLOSE match_price;
  19.    END


  20. CALL food_price_count(2,18,@count);

  21. SELECT @count,@sum;

其中,IN表示输入参数;OUT表示输出参数; INOUT表示既可以是输入,也可以是输出; param_name参数是存储过程的参数名称;type参数指定存储过程的参数类型,该类型可以是MySQL数据库的任意数据类型。

characteristic参数有多个取值。其取值说明如下:

LANGUAGE SQL:说明routine_body部分是由SQL语言的语句组成,这也是数据库系统默认的语言。

[NOT] DETERMINISTIC:指明存储过程的执行结果是否是确定的。DETERMINISTIC表示结果是确定的。每次执行存储过程时,相同的输入会得到相同的输出。NOT DETERMINISTIC表示结果是非确定的,相同的输入可能得到不同的输出。默认情况下,结果是非确定的。

{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }:指明子程序使用SQL语句的限制。CONTAINS SQL表示子程序包含SQL语句,但不包含读或写数据的语句;NO SQL表示子程序中不包含SQL语句;READS SQL DATA表示子程序中包含读数据的语句;MODIFIES SQL DATA表示子程序中包含写数据的语句。默认情况下,系统会指定为CONTAINS SQL。

SQL SECURITY { DEFINER | INVOKER }:指明谁有权限来执行。DEFINER表示只有定义者自己才能够执行;INVOKER表示调用者可以执行。默认情况下,系统指定的权限是DEFINER。

COMMENT 'string':注释信息。

技巧:创建存储过程时,系统默认指定CONTAINS SQL,表示存储过程中使用了SQL语句。但是,如果存储过程中没有使用SQL语句,最好设置为NO SQL。而且,存储过程中最好在COMMENT部分对存储过程进行简单的注释,以便以后在阅读存储过程的代码时更加方便。

2、调用存储过程

MySQL中使用CALL语句来调用存储过程。调用存储过程后,数据库系统将执行存储过程中的语句。

然后,将结果返回给输出值。CALL语句的基本语法形式如下:
CALL  sp_name([parameter[,…]]) ;

3、查看存储过程的定义

   MySQL中可以通过SHOW CREATE语句查看存储过程和函数的状态。其基本语法形式如下:
SHOW CREATE { PROCEDURE |FUNCTION} sp_name ;
其中,“PROCEDURE”参数表示查询存储过程;“FUNCTION”参数表示查询存储函数;“sp_name”参数表示存储过程或函数的名称。

4、修改存储过程

修改存储过程和函数是指修改已经定义好的存储过程和函数。MySQL中通过ALTER PROCEDURE语句来修改存储过程。通过ALTER FUNCTION语句来修改存储函数。本小节将详细讲解修改存储过程和函数的方法。
MySQL中修改存储过程和函数的语句的语法形式如下:
ALTER {PROCEDURE | FUNCTION} sp_name [characteristic ...]
characteristic:
{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'

5、删除存储过程
删除存储过程和函数指删除数据库中已经存在的存储过程和函数。MySQL中使用DROP PROCEDURE语句来删除存储过程。通过DROP FUNCTION语句来删除存储函数。其基本形式如下:
DROP { PROCEDURE| FUNCTION } sp_name;

Linux 关于MySQL操作,From:http://blog.chinaunix.net/uid-26602509-id-3139913.html