MYSQL必知必会
distinct:检索不同的值使用
limit:限制输出的行数
limit 4 offset 3 :返回从第3行开始的4行数据(第一个数字是检索的行数第一个被检索的行数是第零行并不是第一行,第二个数字从哪开始的)这句sql能简化成 limit3,4逗号前面是offset,逗号后面的值对应的是limit 是反着来的
注释:两个-号(可以在sql之后写上注释) #注释一行
order by:排序默认是升序,降序使用DESC, 需要保证order by子句的位置是在select语句中最后一条子句,如果不是将会报错(但是limit可以在order by之后 先排序 后限制取值)
order by 2,3:按照select的位置顺序进行排序而非表中列的位置顺序排序
就像这就sql 他是先按照select中第二个字段prod_price进行排序,如果price的字段相同在对第三个字段prod_name进行排序这里注意注意不是按照表中字段的顺序进行排序
between:范围值检查 between 5 and 10 检查5到10之间所有的值
is null:判空 将那些为null的字段返回
and:使用and操作符可以给where语句进行条件的附加,and的前后的条件都需要被满足才能被检索出来譬如where id=‘dll01’ and price<=4
or:匹配任意一个条件就不会计算第二个条件了
and&or:两者可以相互结合进行高级查询,现在需要查询价格在十美元以上以及有dll01或brs01制造的所有产品 sql:where vend_id=‘dll01’ or vend_id=‘brs01’ and price>=10 但是由于sql会优先处理and,就像加减乘除先处理乘除一样,sql会优先处理and其次再处理or,所以这句话在他看来就是厂商为brs01制造的10元以上的产品或者dll01的所有产品>>>>>解决:where(vend_id=‘dll01’ or vend_id=‘brs01’ ) and price>=10 这样就会优先处理括号里面内容
in:用来指定取值的范围 where vend_id in (1,2) 检索出id为1跟2的id<跟or很像 但是使用起来比or香>
not:否定操作符,否定跟在其后面的条件 where not id = ‘dll01’ 除了id为dll01之外所有的id
like&%:where prod_name like ‘Fish%’ 常查产品名为Fish开头的产品<大小写敏感>,'fish%'跟Fish bean toy就不会匹配
%bean bag%:匹配任何位置上包含bean bag的值
f%y:f开头y结尾
注意:%可以匹配一个或者多个字符 但是也可以匹配零个字符,但是不会匹配null值
-:下划线通配符,一个下划线一个字符 where prod_name like ‘-- inch teddy bear’ 他会检索出开头为12以及18的值,为什么?因为他使用了两个下划线所以8 inch teddy bear不会被检索出来
当你需要的字段信息在表中不同的字段的时候此时就需要进行拼接操作,譬如你需要知道详细地址,但是表中将省市县都是分开的存储的,在mysql中就需要用,进行拼接,不同的引擎所使用的的方法也不一样
rtrim会去掉右边的空格,去掉左边的空格使用ltrim
as就是给你创建的列起个名字
执行算术操作:查询订单为20008的商品
select prod_id,quantity,item_price from orderitems where order_num=20008
这个时候我们有了单价price以及数量quantity 这个时候我们想要查询一个总价
select prod_id,quantity,item_price ,quantity*item_price as keio
from orderitems where order_num=20008;
其余的还可以进行加减乘除的操作
函数的处理操作个人认为还是csdn一波比较方便 因为不同的搜索引擎函数会有比较大的差异
avg(列名):求平均值,avg只能用于单个列,如果需要获得多个列的平均值就需要使用多个avg,忽略列值为null的行
count():有两种使用方式
- 使用count(*)对表中所有的行数进行技术总合,不管是不是null都进行计算
- 使用count(列名)对特定的字段进行计数,如果是null那么则忽略
max(列名):计算出列名中最大数值或者日期值,也会返回文本的最大值,在用于文本数据的时候返回该列排序后的最后一行,max函数忽略null的行
min(列名):计算出列名中的最小值或者日期,也会返回文本的最小值,用于文本数据的时候返回该列排序后最前面的行,min函数忽略null的行
sum(列名):计算总合,sun函数忽略值为null的行
这五个函数你使用之后都需要as取个别名, 如果使用表中实际的列名 虽然是合法的但是很多sql实现是不支持的,会产生模糊的错误消息
distinct&函数:select avg(distinct pord_price) as avg_price from products where vend_id=‘dll01’
这句sql里的avg函数列名只会选取不同的price值,因为使用了distinct,因此只考虑各个不同的价位
distinct不能用于count(*)只能用于count(列名)
group by:进行分组的
having:跟where语义差不多一般配合group by使用,where过滤行,having过滤组所以一般顺序是where>group by>having
查询orders表中cust_id字段 并按照cust_id进行分组并且查询出分组之后count大于等于2的cust_id
查询products表中vend_id字段,将vend_id进行分组,分组之前过滤掉价格行小于4的数据,分组后过滤掉count小于2的id,计算那些count大于等于2的id,之后如果需要进行排序需要在最后面加上order by子句
截止到目前为止select的子句顺序为
- select
- from
- where
- group by
- having
- order by
子查询:子查询就是在一个查询的where或者in中嵌套一个select语句,嵌套的语句查询出来的结果作为了一个筛选条件但是在实际的使用过程中不能嵌套太多的子查询,因为会影响sql的查询性能,而且作为子查询的sql语句只能查询单列,而且在使用的时候where语句的筛选列需要是完全限定列名(表名.列名)
联结表:from的不是单表而是多表,表与表之间使用逗号隔开,并且在where是时候需要使用完全限定列名(为啥要使用完全先限定列名?因为可能一个列在多个表中都有存在,你如果不指定表名.列名,sql引擎就会因为不知道你说的列名是在那张表中就会导致sql报错),如果在写联结表的时候不写where语句就会产生笛卡尔积的现象
内连接:
on等同于where,只不过on只能作用于联结的条件下使用(联结是虚拟的 并非真实存在这样的一张表)真实的表用作过滤的话还是使用where关键字
联结多张表:
就是在from下写多个表的名字并且在where中写上表跟表之间的字段关系就好了(可以用来代替子查询)
结果:
视图:视图是虚拟的表,不包含数据,而是提供了一种封装select语句的层次
- 创建视图使用create view viewname AS (你想要的封装的select语句)
- 视图中不能使用order by语句
- 视图就是对一句sql进行封装,然后可以达到复用简化sql的目的
union:组合查询
- 写出多条sql语句并在sql语句之间加上union即可
- union的每个查询字段必须相同,当然,顺序可以不一样
- union会自动去重,如果你不想这样的话可以使用union all
- union跟where很相似,但是你如果需要匹配不去重的sql则需要使用到union all而不是where
- 只允许有一条order by子句
存储过程就理解为为了以后使用而保存的一条或者多条sql语句即可
- execute addnewproduct …
- 使用了一个名为addnewproduct 的存储过程
事务管理
- 保证批量的sql要么都执行要么都不执行
- 可以使用rollback语句进行回退但是要注意不能回退select语句(也没有必要)
- 事务管理用来管理insert delete update语句(↑select不行↑),也不能回退drop以及create
BEGIN TRANSATION(开始事务)
…
中间可以设置保留点,越多越好,代表你的sql灵活度很高
save REANSATION keio(保留点)
…
if @@ERROE <>0 ROLLBACK TRANSATION keio;
(sql server中可以检查一个名为@@error的变量,如果不等于0就代表有错误发生,那么就通过rollback进行回滚到keio这个保留点)
…
COMMIT TRANSATION(提交事务)