导航

mysql学习笔记

Posted on 2012-11-16 15:54  阿里大盗  阅读(163)  评论(0)    收藏  举报

create table 表名{     id int(8),     name varchar(20) };

基础查询:select id,name from 表名 where 表达式 order by id desc; 解释:select(必须)指定查询/提取结果集中的字段       from(必须)指定查询目标表       where(可选)限定查询条件       order by(可选)查询结果排序 顺序:根据from找到目标表,根据where过滤可以被查询的内容,根据select读出/查询字段内容,根据order by对结果集进行排序(默认升序,desc是降序)

where后的表达式:id>4                   id between 3 and 8                  name is null 各种select示例: select id,name from books where title like '_从%';//模糊查询                  select id,name from books where title like '_从%' and yr>=2002;//复合查询                  select yr 年份,avg(price) 平均价格 from books group by yr order by yr desc//别名,avg(),分组查询,降序排列

常用函数:avg()    count()    max()    min()    sum()    count()

高级查询:SELECT deptno, job, avg(sal) FROM emp WHERE hiredate > to_date('1981-01-01','yyyy-mm-dd') GROUP BY deptno, job HAVING avg(sal) > 2000 ORDER BY avg(sal) DESC; 顺序:根据from找到目标表,根据where过滤掉不符合表达式的记录,根据group by对记录进行分组,根据select查询/输出相应字段内容,根据having过滤查询后的内容,根据order by对结果进行排序。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

连接查询:分为内连接和外连接。内连接包括:等值连接查询和非等值连接查询,表与表之间地位平等;外连接的表与表之间有主从之分。

注意:mysql与oracle的外连接写法不同

内连接: 只连接匹配的行。 左外连接: 包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行。 右外连接: 包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行。 全外连接: 包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行。 交叉连接  生成笛卡尔积-它不使用任何匹配或者选取条件,而是直接将一个数据源中的每个行与另一个数据源的每个行都一一匹配。 (1)等值连接查询:select teacher.id 教师ID,teacher.name 教师姓名,guestbook.name 留言者,guestbook.title 留言主题 from teacher,guestbook where teacher.id>guestbook.id;

(2)非等值连接查询:select id 编号,ename 姓名,salary 工资,department 部门,grade 等级 from employee,hiararchy where salary between low and high  order by grade;

(3)左外连接(左表是全的):SELECT cid, name, phone, a.car_id, producer, model, price FROM customers a left join cars b on a.car_id = b.car_id;(等同于:SELECT cid, name, phone, customers.car_id, producer, model, price FROM customers  left join cars  on customers.car_id = cars.car_id;)

(4)右外连接(右表是全的):SELECT b.car_id, producer, model, price, cid, name, phone FROM customers a right join cars b on a.car_id = b.car_id ORDER BY b.car_id;

(5)多表外连接:select   A.*,B.f1,B.f2,B.fn,C.f1,C.f2,C.fn from A left join B on A.id=B.id left join C on C.id=A.id where .......

(6)自连接:select e.id 员工编号,e.ename 员工姓名,e.salary 员工工资,e.department 员工部门,e.boss 员工上司,m.id 上司编号,m.ename 上司姓名 from employee e left join employee m on e.boss=m.id;(这是自连接+外连接,自连接的核心是,将实际上的同一张表(员工信息表)当作两张不同的表(员工信息表、管理人员信息表)来对待,查询中为做区分,就必须使用表的别名进行标识了。)

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

子查询(嵌套查询):select id,ename,salary,department,boss from employee where salary>(select salary from employee where ename='成功')having boss is null(这是单行子查询)

子查询按其返回结果的情况可分为单行子查询、多行子查询和多列子查询三种类型。

多行子查询:运算符:in any all exists select * from employee where salary >all(select avg(salary) from employee group by department);

多列子查询:

相关子查询:

-------------------------------------------------------------------------------------------------------------------------------------------------