基本概念:
数据库:database
数据库管理工具:DBMS,我们一般都是用数据库管理工具去操作数据库
表(table):某种特定数据类型的结构化清单
模式(schema):关于数据库和表的布局及特性信息
列(column):表中的一个字段,所有表都是由一个或多个列组成
数据类型(datatype):每个表列都有相应的数据类型,它限制可存储在列中的数据类型
行(row):表中的一条记录
主键(primary key):在数据库中能唯一标识一行数据的列或一组列
主键需要满足的条件:任意两行的主键列的值不相同
每个行的主键值不能为NULL值和空值
SQL(structured query language):结构化查询语言
使用数据库
选择数据库:use 数据库名
显示当前连接下可用的数据库名:show databases;
显示当前数据库下所有的表名:show tables;
show 也可以用来显示表的列:show columns from 表名 或者(describle 表名)
SHOW STATUS,用于显示广泛的服务器状态信息;
SHOW CREATE DATABASE和SHOW CREATE TABLE,分别用来显示创
建特定数据库或表的MySQL语句;
SHOW GRANTS,用来显示授予用户(所有用户或特定用户)的安
全权限;
SHOW ERRORS和SHOW WARNINGS,用来显示服务器错误或警告消息。
获得过滤模式信息:information__schema
检索(查询)数据
select语句:
查询单个列:SELECT prod_name FROM products;
sql语句不区分大小写
检索多个列:(每个列名之间用逗号隔开,最后一个不加)例如:SELECT prod_id,prod_name,prod_price FROM products;
检索所有的列:可以将所有的列名写出,也可以使用星号(*)通配符实现
例如:SELECT * FROM products
注意:最好别使用*,因为检索自己不需要的列通常会降低检索和应用程序的性能,检索不知道列名的时候可以(相当于检索未知列)
检索不同列(去重)使用关键字(DISTINCT):
DISTINCT,使用在列名最前,不能用于部分列,例如,SELECT DISTINCT vend_id FROM products ;可以去重,当 SELECT DISTINCT prod_id,prod_name FROM products;除非指定的两个列值都不同,否则所有的行都会被检索出来
限制结果行数(分页中可以用到)关键字 LIMIT
使用:SELECT * FROM products LIMIT 1; 返回第一行,也可以返回前几行,取决于数字几
注意:行是从0开始的 ,当行数不够时,MySQL只会返回能给定的行数
SELECT * FROM products LIMIT 3,4;解释:从行3开始往后的4行数据,在实际中表现为从第4行数据开始,因为行是从0开始,在MySQL5以后的版本中为了不混淆,采用以下写法:
SELECT * FROM products LIMIT 4 OFFSET 3;
使用完全限定的表名:
例如:SELECT products.prod_id FROM products; 列名使用完全限定
SELECT products.prod_id FROM demo01.products;表名使用完全限定名
排序检索数据
字句(clause):SQL语句由字句构成,有的字句是必须的,有的字句是可选的
排序会用到ORDER BY 字句
使用:SELECT pro_id FROM products ORDER BY pro_id;
也可以使用非显示列为排序列:SELECT prod_id FROM products ORDER BY vend_id;
使用多个列排序类似于显示多个列一样:(当然也可以使用非显示列)
SELECT prod_id,prod_name FROM products ORDER BY prod_id,prod_name;
升序和降序排序(升序是默认的关键字ASC,降序的关键字是DESC)
ORDER BY 字句的位置:位于FROM之后,如果使用LIMIT关键字,则LIMIT关键字要位于ORDER BY 之后
例:获取到价格最高的一行:SELECT prod_name,prod_price FROM products ORDER BY prod_price DESC LIMIT 1;
例:SELECT prod_name,prod_price FROM products ORDER BY prod_price DESC;
多个列都排序:例:先价格降序,在名字升序:
SELECT prod_name,prod_price FROM products ORDER BY prod_price DESC,prod_name;
注意:排序时A与a被视为相同还是不同,大多数情况下,DBMS默认是一样的,但是,数据库管理员们是可以改变这一行为,所以有时候情况不一定
过滤数据(WHERE字句的使用)
使用位置:在FROM 表名之后,WHERE加上过滤条件
在条件中使用表达式,表达式中有操作符:
= 等于
<> 不等于
!= 不等于
> 大于
>= 大于等于
< 小于
<= 小于等于
BETWEEN…AND… 在两个值之间
使用例:检索出小于10美元的商品:
SELECT * FROM products WHERE prod_price < 10;
检索出小于等于10美元的商品:
SELECT * FROM products WHERE prod_price <= 10;
不匹配检查就可以使用<>或!=
SELECT * FROM products WHERE prod_price <> 10;
SELECT * FROM products WHERE prod_name != 'zs';
注意:可以看出上面有的表达式中值被单引号引起来,有的没有,在SQL中,字符串对比需要使用单引号引起来,数值则不需要
空值检查(IS NULL和非空 IS NOT NULL)
例:SELECT * FROM customers WHERE cust_email IS NULL;
注意:NULL与不匹配的概念:
例如当cust_eamil不等于某一个具体值时,数据库不会返回值为NULL的行,因为未知具有特殊含义的列,数据库不知道他们是否匹配,所以在匹配过滤和不匹配过滤时不返回他们,
SELECT * FROM customers WHERE cust_email != 'ylee@coyote.com';此SQL就不会返回cust_eamil IS NULL的行数据
数据过滤
在实际开发中,数据过滤条件肯定不是单一的,这时候多个过滤条件就需要使用一定的方法将他们联系起来
AND字句和OR字句就诞生了
AND:和,检索出两个或多个条件都满足的行数据
例:SELECT * FROM products WHERE vend_id=1003 AND prod_price=2.50;
OR:或,检索出满足任一个条件的行数据
例:SELECT * FROM products WHERE vend_id=1003 OR vend_id=1002;
计算次序:在SQL中AND的计算优先级要高于OR,所以在实际开发中需要额外注意
例如:想要查询价格高于10美元,且制造商为1002或1003的
SELECT * FROM products WHERE vend_id=1002 OR vend_id=1003 AND prod_price >= 10.0;(错误)
结果并不是我们想要的结果,因为AND的计算优先级要高于OR
解决办法:在SQL中使用园括号来决定优先级,或者更改SQL语句的顺序,显然圆括号更容易
SELECT * FROM products WHERE (vend_id=1002 OR vend_id=1003) AND prod_price >= 10.0;(正确)
IN操作符:
相当于上面圆括号的作用,例:vend_id IN (1002,1003) 约等于 (vend_id=1002 OR vend_id=1003)
SELECT * FROM products WHERE vend_id IN (1002,1003) AND prod_price >= 10.0;也能实现
IN操作符的优点:
- 更清楚,直观
- 计算次序更容易管理
- IN操作符相当于OR执行起来更快
- IN操作符最大的优点时括号里面还能使用SELECT语句,更能动态的添加条件
NOT操作符:唯一的功能就是对WHERE条件后的条件取反
MYSQL支持NOT对IN,BETWEEN,EXISTS字句取反:
例:SELECT * FROM products WHERE vend_id NOT IN (1002,1003);
用通配符进行过滤
LIKE操作符:
通配符: 用来匹配值的部分特殊字符
搜索模式:由字面值和通配符两者组合构成的搜索条件
% :匹配任意字符出现任意次数
例:SELECT * FROM products where prod_name LIKE ‘%an%’;
注意:不匹配NULL值
_ :匹配任意单个字符出现一次(一次不能多一次不能少)
例:SELECT * FROM products where prod_name LIKE ‘_ ton anvil’;
使用注意:不要过度的使用通配符,如果通配符放在所有条件之前会使得检索非常慢,通配符比起其他操作符执行时间也是更长的
用正则表达式进行搜索
使用关键字:REGEXP
例:SELECT * FROM products where prod_name REGEXP ‘jetPack .000’;
.是正则表达式中的一个字符,表示匹配任意一个字符
匹配不区分大小写,要想区分大小写,使用BINARY关键字
SELECT * FROM products where prod_name REGEXP 'jetPack .000';
SELECT * FROM products where prod_name REGEXP BINARY 'jetPack .000';
进行OR匹配:使用 | 字符
例:SELECT * FROM products where prod_name REGEXP '1000|2000';
匹配一下特定字符:[] 或者非这些字符则可以在开始处添加^
例:SELECT * FROM products where prod_name REGEXP '[123] ton';
SELECT * FROM products where prod_name REGEXP '[ ^123] ton';(此处编辑器的原因在^多加了一个空格)
匹配一个范围:SELECT * FROM products where prod_name REGEXP ‘[0-9] ton’;(使用到 - 字符)
匹配特殊字符:例如:. - \
就需要使用到\\为前导
例:SELECT * FROM products where prod_name REGEXP '\\.';
匹配字符类:
匹配多个实例:
定位符:
^ 文本开始
$ 文本结尾
[[:<:]] 词的开始
[[:>:]] 词的结尾
在MySQL中简单的正则表达式测试:检查总是返回0或1
SELECT 'HELLO' REGEXP '[0-9]';返回0
SELECT 'HELLO' REGEXP '[A-Z]';返回1
创建计算字段
计算字段是不存在与实际列中的,是通过一系列计算或格式化得到想要的数据的展示字段
使用场景:多个字段想拼接在一起作为一个字段展示
一个数值不是我们想要的值,通过计算来获得目标值
拼接字段:使用到MySQL提供的Concat()函数
例:SELECT CONCAT(vend_name,'(',vend_country,')') FROM vendors
当字符串中开头和结尾有空格的时候,可以使用Trim()函数来去除开头和结尾的空格
RTrim()去除右边的空格,LTrim()去除左边的空格
例:SELECT TRIM(vend_name) FROM vendors
别名的使用:关键字AS,当然也可以省略
例:SELECT TRIM(vend_name) AS newName FROM vendors;
SELECT TRIM(vend_name) newName FROM vendors;
执行算术计算:加减乘除
例:获取订单总额
SELECT order_num,quantity,item_price,quantity*item_price tolalPrice FROM orderitems WHERE order_num=20005;
测试计算:SELECT 3*2;