MySQL基础知识 查询

1、DBMS与数据库,DBMS是操纵数据库的软件,数据库是存放数据的容器,MySQL是一种DBMS

2、模式(scheme):关于数据库和表的布局和特性信息

3、基于共享文件系统的DBMS:Access、FileMaker;基于客户端和服务器的DBMS:MySQL、Oracle、SQLServer

4、MySQL命令行:用;或者\g标志语句结束,仅仅按enter键,不会执行语句;quit、exit用于退出命令行程序

5、选择数据库 use database_name\g 返回database changed

6、查看数据库情况 show databases\g 返回所有数据库

7、show tables\g 返回当前数据所有表

8、show columns from database_name\g 返回表中的所有列相关信息,这一条命令的快捷方式describe,比如describe database_name\g

9、select distinct column_name from database_name\g 返回列中所有不同的值,distinct用于所有的列,而不是它所前置的列。

10、select column_name from table_name limit 1,1\g 返回第二行

       select column_name from table_name limit 5\g 返回前五行

11、完全限定(表名和列名)select table_name.column from database_name.table_name

12、order by 完全可以用非检索的列排序

select table_name.column_name_1, table_name.column_name_2 
from database_name.table_name
order by table_name.column_name_3\g

13、按照多个列排序,order by后的各个列,用‘,’分开;表示第一个拍序列相同的情况下,用第二个列排序。

select table_name.column_name_1, table_name.column_name_2 
from database_name.table_name
order by table_name.column_name_3, table_name.column_name_4\g

14、按照降序排列和按照升序排列 DESC和ASC(默认的,所以一般不用);DESC只作用于其前面的哪一个排序列

select table_name.column_name_1, table_name.column_name_2 
from database_name.table_name
order by table_name.column_name_3 DESC, table_name.column_name_4\g

15、order by 和 limit组合作用,获得最大值和最小值(注意order by必须放在from,where后面,limit必须放在order by后面)

select id,price,name        //检索 交易id 价格 买家名称
from trade                  //交易表
order by price desc,name    //价格降序,名称升序
limit 5 \g                  //最贵的5笔交易

16、where字句支持的操作符


17、BETWEEN AND的用法

select price, name from trade where price BETWEEN5 AND10\g

18、判断是否为空 is null字句 的用法

select price, name from trade where price  IS NULL\g

19、在进行匹配过滤(where column_name = '1')不匹配过滤(where column_name != '2')时,column_name列的值为null的行都得不到返回,因为数据库不知道null值是否跟他们匹配。尤其是使用不匹配过滤的时候,可能会希望返回该列为null 的值,所以一定要注意。

20、AND 和 OR 的计算次序问题,and的优先级高于or,必要时可以添加“()”

21、关键字 IN 的用法    select price, name from trade where price IN (10,12,13,18)\g

       IN的优点:更直观,能够更好的组织计算次序;执行起来一般比OR更快;可以和select组合

22、NOT 关键字:对后跟条件取反,MySQL支持对IN、EXISTS 、BETWEEN取反,但是大多数其他的DBMS支持NOT对所有的后跟条件取反。

23、通配符‘%’的注意事项:1、需要与like联用;2、可以匹配0、1、多个字符;3、不能匹配NULL;4、注意尾部有空格的字符串,比如“hello ”尾部有一个空格,“%llo”则不能匹配,解决方法是:用“%llo%”匹配或者用函数去掉尾部空格。

24、通配符‘_’只匹配一个字符

25、注意事项,通配符较其他搜索方式速度较慢,尽量少用;尽量不要把通配符使用在搜索模式的开始处(如“%ol”),那样最慢。

26、正则表达式,见 正则表达式篇

27、拼接字段,多数DBMS使用‘+’或者‘||’实现拼接,而MySQL使用 Concat() 函数,SQL语句转换成MySQL语句的时候请注意。使用:    select Concat(name,'(',country,')') from person order by name\g

28、Trim()、RTrim()、LTrim()函数。select Concat(RTrim(name),'(',RTrim(country),')') from person order by name\g

29、别名(导出列)。select Concat(RTrim(name),'(',RTrim(country),')') AS title from person order by name\g。别名用于对原有列名称的补足,比如原有列名具有不合法的字符。

30、算数计算,支持四则远算,支持利用小括号改变优先级

31、select Now()返回当前的日期和时间

32、分组的注意事项

  • group by后可以跟多个列
  • group by字句中列出的每个列,必须是检索列,或者是有效的表达式,但是不能是聚集函数,select后跟的表达式,也必须出现在group by后面,不能使用别名
  • select后跟的每一个列必须在group by字句中给出
  • 如果分组列中具有NULL,他们会被分为一组
  • group by出现在where之后,order by之前

33、使用having子句过滤分组:where相当于是在分组之前进行过滤,having相当于对分组进行过滤,having 不能使用别名

示例:具有两种以上价格为10以上的供应商id

select vent_id,count(*)              //供应商id,分组统计
from product_info                    //商品表
where prod_price>10                  //商品价格>10
group by vent_id                     //对供应商进行分组
having count(*)>=2                   //分组统计>=2

示例:总订单价格大于等于50元的订单号和总订单价格

select order_num,sum(item_price*item_num) as ordered_total
from prod_ordered_info
group by order_num
having sum(item_price*item_num)>=50
order by ordered_total

34、select子句的顺序



35、子查询:

示例1(利用子查询进行过滤):假设有三张表,guest_info,order_info,order_item_info分别存储,客户信息,订单信息,订购商品信息,查询订购了‘candy’的所有用户名称

select order_num from order_item_info where prod_id = 'candy'\g

select guest_id from order_info where order_num in ...\g

select guest_id,guest_name from guest_info where guest_id in ...\g

答案:

select guest_id,guest_name 

from guest_info 

where guest_id in (  select guest_id 

                                from order_info 

                                where order_num in ( select order_num 

                                                                    from order_item_info 

                                                                    where prod_id = 'candy'))\g

示例2(作为计算字段使用子查询):统计所有的客人的各自订单数

select count(*) from order_info where guest_info.guest_id = order_info.guest_id\g

select guest_name,guest_contact,(...) from guest_info\g

答案:

select guest_name,guest_contact,( select count(*) 

                                                        from order_info 

                                                        where guest_info.guest_id = order_info.guest_id)  as orders

from guest_info

order by orders\g

36、等值连接(内部链接)

一般用法:

select c.cust_id o.order_num

from cust_info as c inner join order_info as o

on c.cust_id = o.cust_id

示例:用内联结的方法解决第35条的示例一的问题

select guest_name,guest_contact

from guest_info,order_info,order_item_info

where guest_info.guest_id=order_info.guest_id and

           order_info.order_num=order_item_info.order_num and

           order_item_info.prod_id='candy'\g

37、自联结

示例:prod_id = 'candy'的商品出现了问题,需要看看它的生产厂家生产的其他商品是否有问题,如何查询:

方法一,使用子查询 

select vend_id from prod_info where prod_id='candy'\g

select prod_id,prod_name from prod_info where vend_id=...\g

结果:

select prod_id,prod_name 

from prod_info 

where vend_id=(    select vend_id 

                               from prod_info

                               where prod_id='candy')\g

方法二:使用自联结

select a.prod_id,b.prod_name 

from prod_info as a,prod_info as b

where a.vend_id=b.vend_id and

           b.prod_id='candy'\g

38、自然联结:手动排除因为表连接而产生的重复列,事实上我们可能永远用不到非自然连接

39、外联结

外连接的应用:列出所有的客户和他们的订单号,包括哪些没有订单的客户

select c.cust_id o.order_num

from cust_info as c left out join order_info as o//外连接左表,也就是cust_info 表,所以会把cust_info 中的字段留全

on c.cust_id = o.cust_id

40、聚集函数与联结

select c.cust_id,c.cust_name,count(order_num) as order_num

from cust_info as c left out join order_info as o

on c.cust_id=o.cust_id

group by cust_info.id

输出了包含0个订单的客户和其统计

41、union 与 union all

有9条数据

有8条数据

注意到 order by只是对最终的数据集排序

42、全文搜索的列,在简历表的时候,必须加上全文索引;搜索示例如下:

select note_text from productnotes where match(note_text) against('rabbit')\g

注:传递给match的值,必须与FULLTEXT()定义中的相同,若指定多个列,则必须列出他们,而且次序相同

       全文搜索可以对结果自动排序










猜你喜欢

转载自blog.csdn.net/qq_24888697/article/details/81009747