七、数据查询
7.1、单表查询
1、语法:select <[列名1,列名n 或通配符 [as 别名] ]> from 表名;
as:将某个字段取个别名
2、语法:select distinct <[列名1,列名n 或通配符]> from 表名;
去掉重复项,对应的字段前加
符号表达:
7.1.1、where常用关键字
- AND、OR:连接多个条件
BETWEEN AND:在…之间
IS NULL:查询空值
IN:查询在某个集中中
LIKE:模糊查询
7.1.2、通配符
”*“通配符:匹配任意列名
“_"通配符:匹配单个字符
“%”通配符:匹配任意字符
7.1.3、order by子句
可以使用order by子句对查询结果安装一个或多个属性列(多个属性逗号隔开)的升序(ASC)或降序(DESC)排列,默认为升序。
--查询结果按照bookPrice列值的降序排列 select * from books order by bookPrice desc;
7.1.4、聚集函数
例:
#查询book表中年龄最大的 select max(age) from book;
7.1.5、group by子句
将查询结果按某一列或多列的值分组,值相等的为一组。
select count(*),pressName from books group by pressName;
如:下列表中,叫 “人民邮电出版社” 名字的有1个,叫 ”清华大学出版社“ 的有6个。
7.2、连接查询
根据两个表或多个表的列之间的关系来查询数据,即连接查询。
7.2.1、简单连接
连接查询实际是通过表与表之间相互关联的列进行数据的查询,对于关系数据库来说,连接是查询最主要的特征。
简单连接使用逗号将两个或多个表进行连接,也是最常用的多表查询形式。
例:
select b.reader_id,br.book_name from books b,borrow_record br where b.ISBN=br.ISBN;
7.2.2、JOIN连接
除了使用逗号连接外,也可使用JOIN连接。
7.2.2.1、内连接(inner join)
1)等值连接
select * from books b inner join borrow_record br where b.ISBN=br.ISBN;
2)不等连接
select * from books b inner join borrow_record br where b.ISBN<>br.ISBN;
7.2.2.2、外连接(left join 、right join)
1)左连接
on后面也可使用 where执行条件判断
select * from books b left join borrow_record br on b.ISBN=br.ISBN;
2)右连接
on后面也可使用 where执行条件判断
select * from books b right join borrow_record br on b.ISBN=br.ISBN;
7.3、嵌套查询
SQL语言中,一个select-from-where语句被称为一个查询块。将一个查询块嵌套在另一个查询块的where子句或having短语的条件中的查询被称为嵌套查询。
语法:select <字段名或通配符> from <表或视图名> where [表达式] (select <字段名或通配符> from <表或视图名> where [表达式] )
7.3.1、带有IN谓语的子查询
select * from books where isbn in (select * isbn from brrowrecord where reader_id='201801');
7.3.2、带有比较运算符的子查询
指父查询与子查询之间用比较运算符连接。可以用 >、<、=、>=、<=、!=、<> 等比较运算符。
select * from books where isbn=(select * isbn from brrowrecord where reader_id='201801');
7.3.3、带有ANY(SOME)或ALL谓语子查询
子查询返回值单值时可以用比较运算符,但返回多值时要用ANY(有的系统用SOME)或ALL谓语,使用ANY或ALL谓语时必须同时使用比较运算符。
谓语释义:
例:
#查询读者编号为"201801"的学生未借阅的所有图书的详细信息; select * from books where isbn <> all(select isbn from brrowwrecord where reader_id="201801");
7.3.4、带有EXISTS谓语的子查询
EXISTS谓语的子查询不返回任何数据,是一个布尔值(true或false)逻辑判断。使用存在量词EXISTS后,若内层查询结果为空,则外层的WHERE子句返回ture,否则取反。
例:
#查询读者编号为201801的读者没有借阅过的图书信息 select * from books where not exists (select * from borrowrecord where isbn=books.isbn and reader_id="201801");
7.4、合并查询
#两个表字段合并显示,两个表相同字段合并后显示一次 select * from t_major1 union select * from t_major;
八、索引
索引是为了加速对表中数据行的检索而创建的一种分散的存储结构。
8.1、为已经创建好的表建立索引
1)用CREATE INDEX方法在已经创建好的表 t_student 上为其字段名 stu_id 创建普通降序索引。
语法:create [unique | fulltext] index index_name on table_name(co_name ase|desc , [co_name ase|desc] )
#多字段索引使用逗号(,)隔开
create index index_student on t_student(stu_id desc)
2)用ALTER TABLE…ADD INDEX方法为表t_course的字段列course_name 创建全文索引。
语法:alter table table_name add [unique | fulltext] index index_name(co_name ase|desc , [co_name ase|desc] )
#多字段索引使用逗号(,)隔开
alter table t_course add fulltext index index_course_name(course_name)
8.2、创建新表时创建索引
创建表 t_teacher2,与 t_teacher 结构一致(不能复制表结构),在创建表的过程中创建索引,为 teacher_id 创建一个唯一升序索引。
create table t_teacher2(teacher_id char(10),teacher_name char(50),index index_tea_id(teacher_id asc));