基本概念:

数据库: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操作符的优点:
  1. 更清楚,直观
  2. 计算次序更容易管理
  3. IN操作符相当于OR执行起来更快
  4. 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;