MYSQL下SQL的一些整理(适合新手)
Mysql之sql总结
前言
本文档是对SQL语法的一些总结,如没做特别说明,此SQL仅适用于MYSQL较高版本数据库。总结包括以下几个部分。
SQL指令:SQL如何被用来存储,读取,以及处理存放数据库之中的资料
表格处理:SQL如何来处理数据库中的表格
SQL语法:提列出部分常用的SQL语法
SQL分类
首先了解一下SQL分类,根据SQL的作用不同,可以分为以下三类
Ø 数据库定义语言(DDL)
Create ,alter,drop,truncate
Ø 数据库操纵语言(DML)
Select ,insert ,update,delete
Ø 数据库控制语言(DCL)
Grant,revoke,commit,rollback
DDL
定义数据库,定义表结构,视图时使用,如
Create table ttt…..
Alter index …..
Drop view…….
Truncate table …..(注意,此操作本质是先drop掉,在重新建表的过程,会重置高水位线)
DML
网上有几种版本,有的把select归结为DQL语言,实际上,这是个很迷糊的概念。举个例子来解释吧,人本来只分男和女,可偏偏有了李宇春,曾轶可,姚小君这样不男不女的人…..呵呵
如果要从数据表中查询出需要的结果,可以用select xxx from ttt where condition………子句。
插入数据:insert into tab_name (col1,col2…) values (val1,val2…..)
修改数据:update table set col=val1….
删除数据:delete from table where ……
DCL
对用户授权,回收特权,以及对事务的操作,例如
Grant insert,delete,update on db1.* to wokao@192.168.1.12 identified by ‘aiyaya’;
一些常用的SQL语法
在讲解SQL语法之前,先创建一张temp表
Create table temp(
Id int,
Dep varchar(20),
Name varchar(300)
)
select
select * from temp where condition
select version(); ----查询当前数据库版本
select now();------查询当前时间
select 100/1000;-------select数值运算
select distinct
select distinct dep,name from temp
distinct关键字对后面跟着的所有字段去重复
select where
select * from temp where id>100
sql and or
select * from temp where ( id>1 and id<100 ) or (id>400 and id <600)
--------查询出表tab_name中id在1到100和400到600之间的数据
in&exists(not in¬ exists)
select * from tab1 where id in (22,33,44)
select * from tab1 a where exists( select 1 from tab2 b where a.id=b.id)
sql between
select * from temp where id between 1 and 100
sql like
select * from temp where dep like ‘%运维%’
select * from temp where dep like ‘运维%’
select * from temp where dep like ‘%运维’
sql order by & group by &having
select * from temp order by id desc (按照ID排序,默认为升序)
select * from temp group by dep -----按dep分组
select id,dep,count(1) from temp order by id group by dep having count(1)>1
having 分组过滤,在查找重复数据时很有用。
sql union& union all
select * from temp where id<100
union
select * from temp where id >1000
union 和 union all 的区别是unoin会去重复
sql case
select case dep
when ‘运维部’ then 1
when ‘市场部’ then 2
when ‘财务部’ then 3
else null
end dep_n
sql if &ifnull & nullif
Sql中IF实现的判断
SELECT IF(1>2,2,3);如果1>2为真,则为2,否则为3。这个语句返回的结果为3
SELECT IF(1<2,'yes ','no');同上
Sql中IFNULL实现的判断
SELECT IFNULL(1,0);如果1=0,则返回1,否则返回0.这个语句返回的结果为0
SELECT IFNULL(NULL,10);同上
SELECT IFNULL(1/0,'yes');同上
Sql 中nullif实现的判断
SELECT NULLIF(1,2);如果1=2为真,则返回null,否则返回1,这个语句返回的结果为1
SELECT NULLIF(1,1);返回值为null
insert
inert into temp values(11,’运维部’,’myth’)
insert into temp select 11,’运维部’,’myth’;
insert into temp values
(11,’运维部’,’Myth’),
(12,’市场部’,’Bob’)
(13,’财务部’,’Kate’)
update
Update temp set name=’What’ where id=11;
Update temp1,temp2 set temp1.name=temp2.name
Where temp1.id=temp2.id;
delete
delete from temp where id=11;
delete from temp1,temp2 where temp1.id=temp2.id
limit
select * from temp order by id limit 10
limit常作为分页的关键字
select into outfile
把数据导入到操作系统外部文件
Select * from temp into outfile “/home/temp/temp.txt”
Load data infile
把外部文件中的数据导入到数据库,类似ORACLE的 sqlldr,MSSQL的DTS工具
Load data infile ‘/home/temp/temp.txt’ into table temp (col1,col2,col3….)
……………..
一些常见的系统命令
show
show是mysql里一个非常有用的指令。它不可以归结为sql命令。它是mysqlDB系统命令。通过这个命令可以查看数据库当前的一些信息,如
show database------------查看数据库列表
show tables---------查看当前数据下的表清单
show user;------查看当前连接用户
show variables;------查看系统变量
show processlist;-----查看当前链接信息
show status------查看系统当前信息
show grants for username-----查看用户的权限
use
show databse
use db_name
analyse
当频繁的对大数据表进行操作后,可能需要对索引进行修复,此时可以使用analyse语句。
Analyse table table_name;
Repair
用于修复表,仅对myIsam和archive表引擎有作用
Repair table table_name
Check
数据库发生错误,索引没有同步更新,写入磁盘出错。可能需要对表进行检查
Check table table_name
Optimize
经常更新数据的磁盘需要整理碎片,数据库也是这样,Optimize Table语句对MyISAM和InnoDB类型的表都有效。
Optimize table table_name
SP,Funcation,Trigger语法
Store procedure
创建SP语法:
CREATE PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
例如:
mysql> delimiter //
mysql> CREATE PROCEDURE simpleproc (OUT param1 INT)
-> BEGIN
-> SELECT COUNT(*) INTO param1 FROM t;
-> END
è //
mysql> CALL simpleproc(@a);
Funcation
创建funcation语法
CREATE FUNCTION sp_name ([func_parameter[,...]])
RETURNS type
[characteristic ...] routine_body
例如:
mysql> delimiter //
mysql> CREATE FUNCTION hello (s CHAR(20)) RETURNS CHAR(50)
-> RETURN CONCAT('Hello, ',s,'!');
-> //
Query OK, 0 rows
mysql> SELECT hello('world');
Trigger
创建存储过程语法:
CREATE TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt
例如:
DELIMITER
CREATE TRIGGER testref BEFORE INSERT ON test1
FOR EACH ROW BEGIN
INSERT INTO test2 SET a2 = NEW.a1;
DELETE FROM test3 WHERE a3 = NEW.a1;
UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;
END
DELIMITER ;
数据库管理
略