目录
行
主键
MYSQL工具
使用MYSQL
连接
检索数据
检索(SELECT)
限制结果(LIMIT)
排序检索(ORDER BY)
过滤数据(WHERE)
过滤数据(AND、OR)
通配符
LINK操作符
正则表达式
基本字符匹配
进行OR匹配
匹配几个字符之一
匹配特殊字符
匹配字符类
匹配多个实例
行
表中的一个记录
主键
每一行都应该有可以唯一表示自己的一列(或一组列)
总是应该定义主键,便于以后的数据操纵和管理
- 任意两行不具有相同的主键,主键不为NULL
- 不更新主键列中的值
- 不重用主键列的值
- 不在主键列中使用可能会更改的值
MYSQL工具
DBMS分为两类:
- 基于共享文件系统的DBMS(用于桌面用途,通常不用于高端或更关键的应用)
- 基于客户机-服务器的DBMS
MYSQL是一个客户机-服务器DBMS,所以需要一个客户机来与MYSQL打交道的一个应用。
MYSQL Administrator(MYSQL管理器)是一个图形交互客户机,用来简化MYSQL服务器的管理。
MYSQL Query Browser是一个图形交互客户机,用来编写和执行MYSQL命令。
使用MYSQL
连接
连接到MYSQL需要一下信息:
- 主机名(计算机名)——连接到本地MYSQL服务器,为localhost
- 端口(使用默认端口3306之外的端口时需要标明)
- 合法的用户名
- 用户口令(需要操作时使用)
进入数据库及其一些操作:
SQL语句不区分大小写
输入指令:
mysql -uroot -p
接着输入进入数据库的密码
然后显示
接着可以输入一下指令来查看:
show databases;
(英文分号)
use 数据库名;
发出使用该数据库的命令时,可以使用该数据库
show tables;
查看数据库中的表
describe 表名;
查看表的设计结构
show columns from study;(study是一个表名)
可以返回
创建数据库及其中的表
1、create database 数据库名;
创建数据库
2、use 数据库名;
这一步不能省,进入这个数据库,才能在这个数据库中创建表
3、create table user;
4、接着输入设计表的结构
检索数据
检索(SELECT)
检索单个列
SELECT coursename FROM courses;
从courses表中检索一个名为name的列
未排序数据(输出的数据顺序和这里的不同,有可能是数据添加到表中的顺序,也可能不是)
检索多个列
SELECT id,coursename,class_id,user_id FROM courses;
从courses表中选择数据,指定了要选择的数据
检索所有列
SELECT * FROM courses;
从courses表中使用星号通配符来表示
可以检索出名字未知的列
检索不同的行
SELECT coursename FROM courses;
可以返回所有匹配的行,如果要检索不同值的列表,可以使用DISTINCT关键字
SELECT DISTINCT coursename FROM courses;
在一条SQL语句中,不能部分使用DISTINCT关键字,如果给出:
SELECT DISTINCT name,class_id FROM courses;
除非指定的两个列都不同,否则所有行都将被检索出来。
限制结果(LIMIT)
SELECT courseName FROM courses LIMIT 5;
LIMIT 5 指示MYSQL返回不多于5行
SELECT courseName FROM courses LIMIT 5,5;
LIMIT 5,5指示MYSQL返回从第五行开始的五行,第一个数是开始的位置,第二个是要检索的行数
注意:
- 行0:检索出来第一行是行0而不是行1,LIMIT 1,1 将检索出第二行,而不是第一行
- 行数不够,就会减少返回的行数
SELECT courses.courseName FROM courses;
同时使用表名和列名,来引用列
SELECT courses.courseName FROM study.courses;
表名也可以是完全限定的
排序检索(ORDER BY)
子句:SQL语句由子句构成,有些子句是必需的,有些是可选的,一个子句通常由关键字和所提供的数据组成。
按一个列排序
SELECT class_id FROM courses ORDER BY class_id;
这条语句指示对class_id列,以数字大小顺序排序数据
按多个列排序
SELECT class_id,id FROM courses ORDER BY class_id,id;
这条语句指示MYSQL先按照class_id排序,当class_id的值相同时,才根据course_id的值排序
指定排序方向
SELECT class_id,id FROM courses ORDER BY class_id DESC,id ;
按照班级id的大小从大到小排序。然后对于班级id相同的情况,再按照id的大小从小到大排序
DESC关键字只应用到直接位于其前面的列名
- 在多个列上降序排序,必须对每个列指定DESC关键字
- 与DESC相反的关键字是ASC,在升序排序是可以指定它,也可以省略(默认是升序)
过滤数据(WHERE)
SELECT user_id FROM courses WHERE courseName=‘离散数学’ ;
根据WHERE子句中指定的搜索条件进行过滤,WHERE子句在表名之后给出
如果还要使用ORDER BY子句,应该将ORDER BY子句放在WHERE之后
检查单个值
SELECT prod_name,price FROM products WHERE prod_name=‘fuses’ ;
这条语句可以检索到fuses、Fuses等,因为在MYSQL执行匹配时不区分大小写
SELECT prod_name,price FROM products WHERE price<10;
检索到价格小于等于10的所有产品
不匹配检查
SELECT user_id,age FROM users WHERE age<>20;
SELECT user_id,age FROM users WHERE age!=20;
范围值检查
SELECT prod_name,price FROM product BETWEEN 5 AND 10;
空值检查
创建表时,可以指定其中的列是否可以不包括值(NULL)
SELECT prod_name FROM products WHERE price IS NULL;
过滤数据(AND、OR)
AND操作符
SELECT id,price,prod_name FROM products WHERE products id=1003 AND price<=10;
OR操作符
SELECT prod_name,price FROM products WHERE id=1002 OR id=1003;
WHERE可包含任意数目的AND和OR操作符,SQL会优先处理AND操作符。
IN操作符
SELECT prod_name,price FROM products WHERE id IN(1002,1003) ORDER BY prod_name;
用来指定条件范围,范围内的每个条件都可以匹配
NOT操作符
否定它之后的任何条件
SELECT prod_name,price FROM products WHERE id NOT(1002,1003) ORDER BY prod_name;
匹配 1002 和 1003 之外供应商的id。
通配符
LINK操作符
通配符:用来匹配值的一部分的特殊字符
搜索模式:由字面值、通配符或两者组合构成的搜索条件
百分号通配符(%)
%表示任何字符出现任意次数
SELECT id,prod_name FROM products WHERE prod_name LIKE 'jet%';
- %jet%可以找出所有以jet开头的产品(可以匹配任何位置上包含jet的值)
- 使用s%e可以找到以s开头,e结尾的产品
%可以匹配0个或1个或多个字符
注意尾空格
可能会干扰通配符匹配,例如'%anvil'不会匹配anvil,因为在最后的字母后面有多余的字符
解决办法:在搜索模式后附加一个%,或者是使用函数去掉尾空格
注意NULL
%不能匹配NULL
下划线通配符(_)
_ 的用途和%一样,但下划线只能匹配单个字符而不是多个字符
SELECT id,prod_name FROM products WHERE prod_name LIKE '_ ton anvil';
正则表达式
基本用法:
http://t.csdn.cn/bmrA8
基本字符匹配
SELECT prod_name FROM products WHERE prod_name REGEXP '1000' ORDER BY prod_name;
REGEXP 后跟的为正则表达式,检索列prod_name包含文本1000的所有行
SELECT prod_name FROM products REGEXP '.000' ORDER BY prod_name;
使用正则表达式 .000,. 是正则表达式中一个特殊的字符,匹配任意一个字符,所以可以返回1000,2000,3000等
LIKE是匹配整列值,REGEXP是匹配子字符串
例如——num列的值为:30742328470-636310,
pad like '30742328470’这种写法,是查询不到记录的,除非使用pad like ‘30742328470%’,匹配整列的值。
如果用regexp,可以这样写,pad regexp ‘30742328470’,不用匹配整列值,就可以过滤出需要的记录行。
LIKE部分场景可以走索引,而REGEXP则不会走索引
MYSQL中的正则表达式不区分大小写,如果要区分可以使用BINARY关键字:
WHERE prod_name REGEXP BINARY 'JetPack .000'
进行OR匹配
SELECT prod_name FROM products WHERE prod_name REGEXP '1000|2000' ORDER BY prod_name;
和1000或2000都匹配并返回
也两个以上的OR条件
匹配几个字符之一
SELECT prod_name FROM products WHERE prod_name REGEXP '[123] Ton' ORDER BY prod_name;
使用了正则表达式[123] Ton,[123] Ton定义一组字符,意思是匹配1 Ton或2 Ton或3 Ton
SELECT prod_name FROM products WHERE prod_name REGEXP '1|2|3 Ton' ORDER BY prod_name;
匹配特殊字符
SELECT vend_name FROM vendors WHERE vend_name REGEXP '\\.' ORDER BY vend_name ;
\\ . 匹配 . ,这种处理就是转义
\\\ 匹配\
\\? 匹配?
\\| 匹配|
\\[ 匹配[
\\也用来引用元字符:
\\f 换页
\\n 换行
\\r 回车
\\t 制表
\\v 纵向制表
匹配字符类
匹配多个实例
SELECT prod_name FROM products WHERE prod_name REGEXP '\\[0-9] sticks?\\)' ORDER BY prod_name;
[0-9]匹配数字,\\(匹配(,stick?匹配sticks或stick
SELECT prod_name FROM products WHERE prod_name REGEXP '[[:digit:]]{4}' ORDER BY prod_name;
[:digit:]匹配数字,{4}要求它前面的字符出现四次
定位符
SELECT prod_name FROM products WHERE prod_name RECEXP '^[0-9]' ORDER BY prod_name;
找出以数字开头的所有产品
- ^有两种用法:在集合中(用[和]定义),用它 来否定该集合,否则,用来指串的开始处。
- REGEXP有类似LIKE的作用:LIKE和REGEXP 的不同在于,LIKE匹配整个串而REGEXP匹配子串。利用定位 符,通过用^开始每个表达式,用$结束每个表达式,可以使 REGEXP的作用与LIKE一样。