sql必知必会

1:sql语句不区分大小写,比如select和SELECt。

2:在处理sql语句时,其中所有空格都被忽略,如下面三种写法作用是一样的:

a: select prod_
name from products;
b:select prod_name from products;
c:select prod_name from
products;

3:limit 5 offset 5 表示返回从第5行起的5行数据,第一个数字是指从哪儿开始,第二个数字是检索的行数。
所以,单个limit是指返回的行数,如limit 5 表示返回5行数据,带offset的limit表示从哪儿开始。
第一个被检索的行是第0行,而不是第一行,因此,limit 1 offset 1会检索出第二行数据,而不是第一行的数据。

4: select * from products order by prod_price,prod_name;
上面的例子仅在多个行具有相同的prod_price值时才对产品按prod_name进行排序,如果prod_price列中所有的值都是唯一的,则不会按prod_name进行排序。

5:desc关键字只应用到直接位于其前面的列名。
如:select * from products order by prod_price,prod_name desc;这里的desc只对prod_name有效,也就是说prod_price是按升序排序的。如果想对多个列进行降序排序,必须对每一列指定desc关键字。在字典排序顺序中,A被视为与a相同,也就是说在排序里不区分大小写。

6:between匹配范围中的所有值,包括指定的开始值和结束值。

7:确定值是否为null,不能简单的使用=null,必须使用is null。

8:我想列出价格为10美元及以上,且由Dll01或Brs01制作的所有产品,select prod_name,prod_price from products where vend_id=‘Dll01’ or vend_id=‘Brs01’ and prod_price>=10;这sql会得出错误的结果,因为
mysql在处理or操作前,会优先处理and操作符。上面的sql语句mysql会理解为由供应商Brs01制作的价格为10美元以上的所有产品,或由供应商Dll01制作的所有产品。此问题的解决方法是使用圆括号对操作符进行明确分组。
如:
select prod_name,prod_price from products where (vend_id=‘Dll01’ or vend_id=‘Brs01’) and prod_price>=10;

9:where子句中,not用来否定其后条件的关键字。如:列出除DLL01之外的所有供应商制作的产品。
select prod_name from products where not vend_id = ‘DLL01’;
上面的sql语句可以改写成:select prod_name from products where vend_id <> ‘DLL01’;

10:显示表结构信息:show columns from 表名;

11:显示服务器状态信息:show status;

12:显示当前用户权限信息:show grants;

13:不能部分使用distinct,distinct关键字应用于所有列而不仅是前置它的列。如果给出select distinct vend_id,prod_price,除非指定的两个列都不同,否则所有行都将被检索出来。
如:表数据:
在这里插入图片描述
select distinct(age),ship_name from sdb_b2c_te;
结果:
在这里插入图片描述
可以看出,虽然我们指定distinct只应用于age列,但其实mysql会默认让它应用于你select后面列出的所有列。
而且distinct必须位于所有字段的最前面,如下面的sql语句会报错:select order_id,distinct age from sdb_b2c_te;
在这里插入图片描述
14:空格可能会干扰通配符匹配,如:select * from sdb_b2c_te where ship_name like ‘% zhangsan’;匹配不到任何行,因为zhangsan前面有个空格;
%:匹配多个字符
_:匹配单个字符

15:日期函数:
Date():返回日期时间的日期部分:select Date(create_at) from sdb_activities_bank_activity
在这里插入图片描述
DateDiff():计算两个日期之差:select DateDiff(create_at,update_at) from sdb_activities_bank_activity
在这里插入图片描述
Day():返回一个日期的天数部分。select Day(create_at) from sdb_activities_bank_activity
在这里插入图片描述
16:
avg():返回某列的平均值,会忽略列值为null的行。
count(*):对表中行的数目进行计算,不管表列中包含的是否有空值、null。
count(column):对特定列中具有值得行进行计算,忽略空值及null。

17:如果分组中具有null值,则null将作为一个分组返回,如果列中有多行null值,它们将分为一组。

18:where能过滤指定的行而不能过滤分组,事实上where没有分组的概念。那么怎么过滤分组呢,mysql有一个having子句可以解决这个问题,having可以过滤分组。
如:过滤两个以上的订单:select cust_id,count() as orders from orders group by cust_id having count() >= 2;
也就是说where在数据分组前进行过滤,having在数据分组后进行过滤。
如:列出具有2个及以上、价格大于等于10的产品的供应商:
select vend_id,count() as num_prods from products where prod_price >= 10 group by vend_id having count() >= 2;
一般在使用group by子句时,如果要对分组后的数据进行排序,应该给出order by子句,这是保证数据正确排序的唯一方法。千万不要仅依赖group by排序数据。

19:显示customers表中每个客户的订单总数:
select cust_name,cust_state,
(select count(*) from orders where orders.cust_id=customer.cust_id) as orders
from customers;

20:由没有联结条件的表关系返回的结果为笛卡尔积。检索出行的数目将是第一个表中的行数乘以第二表中的行数。

21:union会从查询结果集中自动去除重复的行。如果想返回所有匹配行,可以使用union all。
在用union组合查询时,只能使用一条order by子句,它必须出现在最后一条select语句之后,对于结果集,不存在用一种方式排序一部分,而又用另一种方式排序另一部分的情况,因此不允许使用多条order by子句。
如:select vend_id from products where prod_price <=5 union select vend_id from products where vend_id in (1001,1002) order by vend_id,prod_price;
这条union在最后一条select语句后使用了order by子句,虽然order by似乎只是最后一条select语句的组成部分,但实际上mysql将用它来排序所有select语句返回的所有结果。

22:insert一般用来给表插入一个指定列值得行。但是,insert还存在另一种形式,可以利用它将一条select语句的结果插入到表中,这就是所谓的insert select.
如:你想从另一个表中合并客户列表到你的customers表

insert into customers(cust_id,cust_contact) select cust_id,cust_contact from custnew;

23:如果想从表中删除所有行,不要使用delete。可以使用truncate table语句,它更快,truncate实际上是删除原来的表并重新建立一个表,而不是逐行删除表中的数据。

24:视图是虚拟的表,与包含数据的表不一样,视图只包含使用时动态检索数据的查询。也就是说视图里面是没有数据的,它只是一条sql语句,执行视图时会动态的去实际的表查询数据。
作用:
1:重用sql;
2:简化复杂的sql操作。在编写查询后,可以方便的重用它而不必知道他的查询细节。

25:存储过程简单来说,就是为以后的使用而保存的一条或多条mysql语句的集合。

26:触发器是mysql响应以下任意语句而自动执行的一条sql语句:delete、insert、update。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值