创建连接
主机名----如果连接到本机则是 localhost
端口号----默认是3306
选择数据库
使用use 关键词----use database(数据库名称);
查询数据库
show database;
查询表
show tables;
查询列信息
show columns from 表名;(它对每个列返回一行信息)
服务器状态查询
show status; (显示服务器状态信息)
显示其他信息
show grants; (用来显示 授予 用户的安全权限)
show errors; show warnings; (显示服务器错误或警告信息)
检索数据
sql 不区分大小写 一般关键词大写 列和表名小写
查询单个列 多个列
select 列名(*) from 表名;(返回所有行)
查询不想要值的列( 去重 distinct )
select distinct 列名 from 表名;(告诉mysql 只返回唯一的 列)
不能部分使用 distinct 如果后跟多个列则都去重
Limit 限制结果
select 列 from 表 limit 5; (返回不多于5条)
select 列 from 表 limit 5,5; (返回第二个5条 第一个5表示跳过5条)
使用完全限定名称查询
select 表名.列名 from 数据库名.表名;
排序检索数据
排序数据(order by 默认升序 使用 desc 降序排列)
select 列 from 表 order by 列;
select 列1,列2,列2 from 表 order by 列1 desc,列2;(列1 降序,列2升序)
如果多个需要降序 在各个列后面添加desc
如果使用order by 和 Limit 结合 要保证 order by 位于from 或 where后 limie位于order by 后
过滤数据 where
MySQL在执行匹配时是不区分大小写的 所以where name="aa"和where name="AA"是相同的
between 两者之间 (where id between 5 AND 10; 包括开始和结尾)
任何时候where 后使用OR 或者AND 都应该使用括号
一般使用IN操作符 原因它比OR操作符要快 直白
通配符 LIKE
百分号% 表示任意字符出现任意次数
下划线 _ 表示匹配单个字符
缺点:搜索速度慢 除非必须使用
正则表达式
使用 REGEXP 关键词替代 like 告诉MySQL 我后面所跟为正则表达式
select name where id REGEXP “.000”; 其中.表示匹配任一字符
匹配过程不区分大小写 如果需要可使用BINARY
where name REGEXP BINARY “Jet”
where id REGEXP “1000|2000|3000” 搜索多个串之一
可使用 [123] 它和 [1|2|3] 一样
匹配范围 [1-5] [a-z]
匹配特殊字符 使用双斜杠\ \-
创建计算字段
拼接字段
将两值拼接构成单个值 可使用Concat() 函数将俩列拼接
Concat() 需要一个或多个指定的串 各个串之间用逗号隔开
例子:select Concat(name, ‘(’ , Rtrim(id), ‘)’ ) from 表名;
其中 Rtrim 表示删除数据右侧空格
也可以使用别名关键词 AS
计算字段
select 3*2; 返回6 select NOW(); 返回当前时间
select 列1*列2 As a from 表名;
数据处理函数
文本处理函数
Upper(列名) 转换大写
发音搜索 Soundex
例子:where Soundex(name) = Soundex(“Li hua”);
日期处理函数
不管是插入还是查询日期必须为 yyyy-mm-dd
DateDiff() 返回两个时间的日期之差
AddDate() 增加一个日期
Time() 返回一个时间的时间部分
Date() 返回一个时间的日期部分
聚集函数
AVG() 函数 返回某列的平均值
select AVG( 列 ) AS 别名 from 表名
也可以为select AVG( distinct 列 ) AS 别名 from 表名 where…(<u>去重</u>)
Count() 函数 有两种使用方式
使用Count(*) 对表中行的数目进行计数 不管表列中包含的是null还是非null值
select count(*) from 表; 返回所有行不管行中各列有什么值
使用Count(列) 对特定列中的具有值的行进行计数 忽略null值
select count(email) from 表; 对表中有email的客户进行计数
MAX() 函数返回指定列中最大值包括日期
MIN() 函数返回指定列中最小值包括日期
Sum() 返回指定列值的和
分组数据
使用group by 关键词 位于where之后 order by 之前
一般在group by 之后跟having 或者跟order by 保证数据正确
过滤分组 having
having 和 where区别 having 过滤分组 where过滤行
having 数据分组后过滤 where 分组前过滤
select id,count(*) AS aa from 表 GROUP BY id;
联结表
外键
为某个表中的一列,它包含另一张表的主键值
可伸缩性
能够适应不断增加的工作量而不失败,设计良好的数据库或应用程序称之为可伸缩性好
创建联结
规定要联结的所有表以及他们如何关联即可
例子:select v.name,p.name,p.price from v,p where <u>v.id=p.id</u> order by v.name,p.name;
以上查询两张表 from两张表 最后把他们的联结关系对应,然后进行排序
联结条件的时候要使用完全限定名
笛卡尔积
由没有联结条件的表关系返回的结果为笛卡尔积,检索出的行的数目由两张表的乘积
所以不要忘记where子句
内部联结
目前为止所用的是等值联结 也称为内部联结,它基于两张表之间的相等测试
例子:select v.name, p.name, p.price from v INNER JOIN p ON v.id = p.id;
传递给ON 的条件和 where 条件相同
<u>一般使用 内部联结较多 方便程序员不忘记联结条件</u>
联结多个表
首先列出所有表,然后定义表之间的关系
例子:select a.name, b.name, c.name from a, b, c where a.id = b.id AND b.id = c.id;
性能:不要联结没有不必要的表
创建高级联结
使用表别名-----AS
缩短SQL语句
允许在单条select语句中多次使用相同的表
例子:select student.name, teacher.name, person.name from student AS s,
teacher AS t, person AS p where s.id = t.id AND t.id = p.id;
例子二–应用检索语句:<u><还可以应用 ORDER BY , 语句其他部分></u>
select s.name, t.name, p.name from student AS s,
teacher AS t, person AS p where s.id = t.id AND t.id = p.id;
自联结
如果你发现某物品(其ID 为DTNTR)存在问题,因此想知道生产该物品的供应商生产的其他
物品是否存在问题------首先要找到生产该物品的厂家,然后再找出其他物品
select prod_id , prod_name FROM products WHERE vend_id =
(select vend_id FROM products WHERE prod_id = “DTNTR”);
select p1.prod_id , p1.prod_name FROM products AS p1, products AS p2
WHERE p1.prod_id = p2.prod_id AND p2.prod_id = “DTNTR”;
外部链接
例子:select c.id , o.num FROM customers AS c LEFT OUTER JOIN orders AS o
ON c.id = o.id;
在使用OUTER JOIN必须使用 LEFT 或者 RIGHT 指定包括所有行的表