MYSql语句备忘
in with 0 comment

MYSql语句备忘

in with 0 comment

查询语句

col 字段名 col1 ,col2 .... tab 表名

select col1, col2 , clo3 from tab;
select * from table; 
select distinct col from tab;

检索不同的行

select distinct col from tab;
'distinct 关键字用来检索不同的行'

限制结果

select col from tab limit lim;
'lim 行数,例如 5 代表检索返回5行结果'
select col from tab limit limt,lims;
'limt 开始的行数, lims 一共检索的行数'
select col from tab limit limt offset lims;
'limt 开始的行数, lims 一共检索的行数 , 和上一条语句相同,便于理解'

排序数据

普通排序

select col from tab order by col;
'以col来排序查询的结果'
select * from tab order by col1,col2;
'先以col1来排序,col1相同的以col2来排序'
'即使没有查询某一列的数据也可以以他来排序'

指定排序方向

select * from tab order by col asc/desc;
'asc 升序 ,desc 降序 如果想在多个列上进行降序排序,必须 对每个列指定DESC关键字。'
select * from tab order by col desc , col2 desc;

'可以搭配limit使用'
select * from tab order by col desc limit 1;

过滤数据

where子语句操作符

操作符说明
<>不等于
!=不等于
<小于
<=小于等于
>大于
>=大于等于
between在指定的两个值之间

可以用AND 和 OR 连接多条where子语句,当多条子语句通过and和or连接时,先计算and连接的语句,可以通过给子语句设定()来使其优先计算。

Demo

select * from tab where col = value;
'只检索出col = value 的数据'

select * from user where user_name='zYinux';
'检索时默认不区分大小写'

select * from tab where col between value1 and value2;
'检索出col值在value1到value2之间的数据'
select * from tab where price between 5 and 10;

空值检查

select * from tab where col is null;

IN 操作符 :在值之中

select * from tab where col in (value1,value2,value3);
'当col的值为v1,v2,v3中的一个时,成功匹配'

NOT 操作符:否定后续条件

MySQL中的NOT MySQL支持使用NOT对IN、BETWEEN和 EXISTS子句取反,这与多数其他DBMS允许使用NOT对各种条件 取反有很大的差别。

select * from tab where col not in (val1,val2,val3);
'筛选出所有col不等于val1,val2,val3中的任何一个值的行'

使用通配符过滤数据

LIKE 操作符

LIKE指示MySQL, 后跟的搜索模式利用通配符匹配而不是直接相等匹配进行比较。

通配符

select * from users where name like 'zyinux%';
'匹配所有zyinux开头的字符串'
select  *  from users where name like 'z_';
'匹配以z开头的长度为2的任意字符串'

计算字段

拼接字段 Concat()

select Concat(name,'(',age,')') from users order by name;
'数据将会呈现出 zyinux(20) 这种样子'
'多数DBMS使用+或||来实现拼接, MySQL则使用Concat()函数来实现'

删除右侧多余空格 RTrim()

select Concat(RTrim(name),'( ',age,' )') from users;
'去除name字段右侧的空格'
'LTrim()去除左侧空格,Trim()去除两端空格'

使用别名 AS

select Concat( RTrim(name) , '( ' , age, ' )'  ) as user_title from users;
'对拼接出来的新列使用user_title别名,便于客户端引用'

执行算数计算( + , - , * , / )

select prod_id,quantity,price,quantity*price as item_price from orders where order_id = 20005;

'item_price为商品的单价乘以商品的购买数量得出的总价'

使用数据处理函数

文本处理函数

select upper('zyinux');
'字符串大写,输出: ZYINUX'
操作符说明
Left()返回串左边的字符
Length()返回串的长度
Locate()找出串的一个子串
Lower()将串转换为小写
LTrim()去掉串左边的空格
Right()返回串右边的字符
RTrim()去掉串右边的空格
Soundex()返回串的SOUNDEX值
SubString()返回子串的字符
Upper()将串转换为大写

SOUNDEX是一个将任何文 本串转换为描述其语音表示的字母数字模式的算法。SOUNDEX考虑了类似 的发音字符和音节,使得能对串进行发音比较而不是字母比较。 customers表中有一个顾 客Coyote Inc.,其联系名为Y.Lee。但如果这是输入错误,此联系名实 际应该是Y.Lie,怎么办?显然,按正确的联系名搜索不会返回数据.

select * from customers where soundex(cust_contact)=soundex('Y. Lie');

数据分组

创建分组 GROUP BY

select vend_id,count(*) as num_prods from products group by vend_id;
'按照vend_id分组出数据'

过滤分组 HAVING

select vend_id,count(*) from products where prod_price>=10 group by vend_id having count(*)>=2;
'having子语句能使用where子语句的所有功能。区别在于having过滤于分组级别,where过滤于行级别'

联结表

内部联结

select tab.name tab2.age from tab,tab2 where tab.id=tab2.id;
'从tab中检索出name并且检索出tab2中于tab中id相等的行的age值'

select tab.name tab2.age from tab inner join tab2 on tab.id=tab2.id;
'效果和上一句相同,这两句都可以隐藏掉select语句中的表名'

自联结

select t1.name ,t2.price from tab as t1 ,tab2 as t2 where t1.class_id=t2.class_id and t2.class_id='6';
''

自然联结

外部联结

联结包含了那些在相关表中没有关联行的行。这种 类型的联结称为外部联结。

select customers.cust_id ,orders.order_num from customers left outer join orders on customers.cust_id=orders.cust_id;

left outer join 从左边的表中检索出没有关联行的行,上代码中是 customers; right outer join 从右边的表中检索出没有关联行的行,上代码中是 orders ;

使用带聚集函数的联结

select customers.cust_name,
    -> customers.cust_id,
    -> count(orders.order_num) as num_ord
    -> from customers inner join orders
    -> on customers.cust_id = orders.cust_id group by customers.cust_id;

组合查询

使用UNION

select vend_id ,prod_id, prod_price
    -> from products
    -> where prod_price<=5
    -> union
    -> select vend_id, prod_id, prod_price
    -> from products
    -> where vend_id in (1001,1002);

UNION 连接多条select语句。查询结果一次性返回,自动去除重复的行。 UNION ALL 同上,但是不去重 ORDER BY 排序语句只能出现一次,出现在最后的select语句之后,不能多次出现

全文本搜索

并非所有引擎都支持全文本搜索 正如第21章所述,MySQL 支持几种基本的数据库引擎。并非所有的引擎都支持本书所描 述的全文本搜索。两个最常使用的引擎为MyISAM和InnoDB, 前者支持全文本搜索,而后者不支持。这就是为什么虽然本书 中创建的多数样例表使用InnoDB,而有一个样例表(productnotes表)却使用MyISAM的原因。如果你的应用中需 要全文本搜索功能,应该记住这一点。

插入数据

INSERT LOW_PRIORITY INTO 低优先级的插入数据

修改表

ALTER TABLE tab ADD name CHAR(20);
'给tab表添加name列'

ALTER TABLE tab DROP COLUMN name;
'删除tab表中的name列'

DROP TABLE tab;
'删除tab表'

RENAME TABLE tab TO tab2;
'重命名tab为tab2'

创建视图

CREATE VIEW viewname AS SELECT col1,col2,col3 FROM tab1,tab2,tab3 where tab1.id=tab2.id and tab2.mid = tab3.mid;
'这个时候可以把viewname视图当做普通表来查询'
SELECT * FROM viewname;
0评论