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()定义中的相同,若指定多个列,则必须列出他们,而且次序相同
全文搜索可以对结果自动排序