sql部分语法

sql部分语法

​目录收起mysqldumpIF表达式IFNULL(expr1,expr2)IF ELSE 做为流程控制语句使用INNER JOINLEFT JOINRIGHT JOINFULL OUTER JOINcase when then

mysqldump

mysqldump用来备份数据库或在不同数据库之间迁移数据,mydqldump的备份内容包括用来创建表和装载表的SQL语句

MySQLdump是MySQL自带的导出数据工具,通常我们用它来导出MySQL中,但是有时候我们需要导出MySQL数据库中某个表的部分数据,这时该怎么办呢?
mysqldump命令中带有一个 --where/-w 参数,它用来设定数据导出的条件,使用方式和SQL查询命令中中的where基本上相同,有了它,我们就可以从数据库中导出你需要的那部分数据了。

命令格式如下:
mysqldump -u用户名 -p密码 数据库名 表名 --where="筛选条件" > 导出文件路径

例子:
从meteo数据库的sdata表中导出sensorid=11 且 fieldid=0的数据到 /home/xyx/Temp.sql 这个文件中
mysqldump -uroot -p123456 meteo sdata --where=" sensorid=11 and fieldid=0" > /home/xyx/Temp.sql
mysqldump -uroot -p123456 meteo sdata --where=" sensorid=11" > /home/xyx/Temp.sql
mysqldump -uroot -p123456 meteo sdata --where=" sensorid in (1,2,3) " > /home/xyx/Temp.sql

另外你还可以直接导出 文本文件*.txt
mysqldump -uroot -p123456 meteo sdata --where=" sensorid=11 and fieldid=0" > /home/xyx/Temp.txt

备份数据库

mysqldump 数据库名 >数据库备份名

mysqldump -A -u用户名 -p密码 数据库名>数据库备份名

mysqldump -d -A --add-drop-table -uroot -p >xxx.sql

1.导出结构不导出数据
mysqldump -d 数据库名 -uroot -p > xxx.sql

2.导出数据不导出结构
mysqldump -t 数据库名 -uroot -p > xxx.sql

3.导出数据和表结构
mysqldump 数据库名 -uroot -p > xxx.sql

4.导出特定表的结构
mysqldump -uroot -p -B数据库名 --table 表名 > xxx.sql

mysqldump [OPTIONS] database [tables]

详情看:http://blog.csdn.net/xin_yu_xin/article/details/7574662

导入数据:
由于mysqldump导出的是完整的SQL语句,所以用mysql客户程序很容易就能把数据导入了:

mysql 数据库名 < 文件名

or:

show databases;

然后选择被导入的数据库:

use ***;

source /tmp/xxx.sql

IF表达式

IF(expr1,expr2,expr3)
如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为expr2; 否则返回值则为 expr3。IF() 的返回值为数字值或字符串值,具体情况视其所在语境而定。
SELECT IF(sva=1,"男","女") AS s FROM table_name WHERE sva != '';

IFNULL(expr1,expr2)

假如expr1 不为 NULL,则 IFNULL() 的返回值为 expr1; 否则其返回值为 expr2。IFNULL()的返回值是数字或是字符串,具体情况取决于其所使用的语境。

SELECT IFNULL(1,0);
-> 1SELECT IFNULL(NULL,10);
-> 10SELECT IFNULL(1/0,10);-> 10SELECT IFNULL(1/0,'yes');-> 'yes'

IFNULL(expr1,expr2) 的默认结果值为两个表达式中更加“通用”的一个,顺序为STRING、 REAL或 INTEGER。

IF ELSE 做为流程控制语句使用

IF实现条件判断,满足不同条件执行不同的操作,这个我们只要学编程的都知道IF的作用了,下面我们来看看mysql 存储过程中的IF是如何使用的吧。
IF search_condition
THEN statement_list [ELSEIF search_condition THEN]
statement_list ... [ELSE statement_list] END IF
与PHP中的IF语句类似,当IF中条件search_condition成立时,执行THEN后的statement_list语句,否则判断ELSEIF中的条件,成立则执行其后的statement_list语句,否则继续判断其他分支。当所有分支的条件均不成立时,执行ELSE分支。search_condition是一个条件表达式,可以由“=、<、<=、>、>=、!=”等条件运算符组成,并且可以使用AND、OR、NOT对多个表达式进行组合。
例如,建立一个存储过程,该存储过程通过学生学号(student_no)和课程编号(course_no)查询其成绩(grade),返回成绩和成绩的等级,成绩大于90分的为A级,小于90分大于等于80分的为B级,小于80分大于等于70分的为C级,依次到E级。那么,创建存储过程的代码如下:

CREATE PROCEDURE dbname.proc_getGrade
(stu_no varchar(20),cour_no varchar(10)) BEGIN DECLARE stu_grade float; SELECT grade into stu_grade FROM grade WHERE student_no=stu_no AND course_no=cour_no; IF stu_grade>=90 THEN
SELECT stu_grade,'A';
ELSEIF stu_grade<90 AND stu_grade>=80 THEN
SELECT stu_grade,'B';
ELSEIF stu_grade<80 AND stu_grade>=70 THEN
SELECT stu_grade,'C';
ELSEIF stu_grade70 AND stu_grade>=60 THEN
SELECT stu_grade,'D'; ELSE
SELECT stu_grade,'E'; END IF; END

注意:IF作为一条语句,在END IF后需要加上分号“;”以表示语句结束,其他语句如CASE、LOOP等也是相同的。

INNER JOIN

内连接是最常见的一种连接,只连接匹配的行。
inner join语法
select column_name(s)from table 1INNER JOIN table 2ONtable 1.column_name=table 2.column_name
注释:INNER JOIN与JOIN是相同

INNER JOIN产生的结果集中,是1和2的交集。

LEFT JOIN

LEFT JOIN返回左表的全部行和右表满足ON条件的行,如果左表的行在右表中没有匹配,那么这一行右表中对应数据用NULL代替。
LEFT JOIN 语法
select column_name(s)from table 1LEFT JOIN table 2ON table 1.column_name=table 2.column_name
注释:在某些数据库中,LEFT JOIN 称为LEFT OUTER JOIN

LEFT JOIN产生表1的完全集,而2表中匹配的则有值,没有匹配的则以null值取代。

RIGHT JOIN

RIGHT JOIN返回右表的全部行和左表满足ON条件的行,如果右表的行在左表中没有匹配,那么这一行左表中对应数据用NULL代替。
RIGHT JOIN语法
select column_name(s)from table 1RIGHT JOIN table 2ON table 1.column_name=table 2.column_name
注释:在某些数据库中,RIGHT JOIN 称为RIGHT OUTER JOIN

RIGHT JOIN产生表2的完全集,而1表中匹配的则有值,没有匹配的则以null值取代

FULL OUTER JOIN

FULL JOIN 会从左表 和右表 那里返回所有的行。如果其中一个表的数据行在另一个表中没有匹配的行,那么对面的数据用NULL代替
FULL OUTER JOIN语法
select column_name(s)from table 1FULL OUTER JOIN table 2ON table 1.column_name=table 2.column_name

FULL OUTER JOIN产生1和2的并集。但是需要注意的是,对于没有匹配的记录,则会以null做为值。

case when then

SELECT a.username as 用户名,
(select dmnr from yinzhang.t_sys_code where dmbh =
(select case seal_type
WHEN 10 THEN 'SealType'
WHEN 20 THEN 'sealzystype'
when 30 then 'SealType'
when 40 then 'SealType'
when 50 then 'other_seal'
when 60 then 'SealType'
END
from yinzhang.b_order where orderid=a.orderid) and dmz = (select case seal_type
WHEN 20 THEN (select s_type from yinzhang.b_order_seal_2 where orderid = a.orderid)
when 50 then (select s_type from yinzhang.b_order_seal_5 where orderid = a.orderid)
else seal_type
END
from yinzhang.b_order where orderid=a.orderid)
) as 印章类型,
a.telephone as 电话 , a.address as 地址,
ifnull(d.content,'') as 发票户头
FROM yinzhang.b_order as a
left join yinzhang.b_order_invoice_detail c on a.orderid=c.orderid
left join yinzhang.b_order_invoice d on c.invoiceid=d.id
where a.validflag = 1 order by a.username;

  1. case when then else end 的使用:
    SQL> select
    2 count(case when u.sex=1 then 1 end)男性,
    3 count(case when u.sex=2 then 1 end)女,
    4 count(case when u.sex <>1 and u.sex<>2 then 1 end)性别为空
    5 from users u;

男性 女 性别为空---------- ---------- ----------
3 2 0
SQL> select
2 sum(case u.sex when 1 then 1 else 0 end)男性,
3 sum(case u.sex when 2 then 1 else 0 end)女性,
4 sum(case when u.sex <>1 and u.sex<>2 then 1 else 0 end)性别为空
5 from users u;

男性 女性 性别为空---------- ---------- ----------
3 2 0
SQL> select u.id,u.name,
2 (case u.sex
3 when 1 then '男'
4 when 2 then '女'
5 else '空的'
6 end
7 )性别
8 from users u;

ID NAME 性别--------------------------------------- -------------------- ------
1 张一 空的
2 张二 男
3 张三 空的
4 张四 空的
5 张五 女
6 张六 男
7 张七 女
8 张八 男
8 rows selected

posted @ 2023-04-21 10:22  cps666  阅读(14)  评论(0编辑  收藏  举报