数据库系统概论之SQL笔记

262

数据库操作:

SHOW DATABASES;  //查看数据库

CREATE DATABASE test;    //创建数据库test

USE test;    //启用test数据库

SHOW TABLES;  //查看数据表

CREATE TABLE student(         //创建student表,有id , name , birthday ,gender , isDelete五个字段

    id INT AUTO_INCREMENT PRIMARY KEY NOT NULL,  //字段id 自动递增 主键 值不空

    name VARCHAR(8) NOT NULL,  //字段name 字符型 不空

    birthday DATETIME,  //字段birthday 日期时间型

    gender BIT DEFAULT 1,  //字段gender bit位 默认1

    isDelete BIT DEFAULT 0);    

DROP TABLE student;    //删除student表

ALTER TABLE student RENAME TO stu;

RENAME TABLE student TO stu;    //重命名表student 为 stu 的两种方法

ALTER TABLE stu ADD age INTEGER;    //增加stu表字段age

ALTER TABLE stu CHANGE password pwd VARCHAR(8);    //把stu表中的password字段名改成pwd

ALTER TABLE stu DROP pwd;    //删除stu表中的pwd字段

DESC student;  //查看student表结构

SHOW CREATE TABLE student;  //查看表的创建语句

数据操作:

查询:

SELECT * FROM 表名;  //查询

增加:

INSERT INTO 表名 VALUES( ... );   //全列插入

INSERT INTO 表名(列1, ... ) VALUES(值1, ... );   //缺省插入

INSERT INTO 表名 VALUES( ... ),( ... ), ... ;  

INSERT INTO 表名(列1, ...) VALUES(值1, ... ),(值2, ... ), ... ; //同时插入多条数据

注:主键列是自动增长,但是在全列插入时需要占位,通常使用0,插入成功后以实际数据为准

修改:

UPDATE 表名 SET 列1=值1, ... WHERE 条件;

删除:

DELETE FROM 表名 WHERE 条件;

逻辑删除:

ALTER TABLE students ADD isdelete BIT DEFAULT 0;   //增加一个字段isdelete 默认0(1表示删除)

如果需要删除列

UPDATE students isdelete=1 WHERE 条件;   //更新字段isdelete=1 逻辑表示数据删除



查询

基本语法:select * from 表名;

    from 关键字后面写表名,表示数据来源于这张表

    select 后面写表中的列名,如果是 * 表示在结果中显示表中所有列

    在 select 后面的列名部分,可以使用 as 为列起别名, 这个别名出现在结果集中

    如果查询多个列,之间使用逗号分隔

消除重复的行

    在 select 后面列前使用 distinct 可以消除重复的行

条件

    使用 where 子句对表中的数据筛选,结果为 true 的行会出现在结果集中

语法: select * from 表名 where 条件;

比较运算符

    等于 =

    大于 >

    大于等于 >=

    小于 <

    小于等于 <=

    不等于 != 或 <>

逻辑运算符

    and

    or

    not

模糊查询

    like

    % 表示任意多个任意字符

    _ 表示一个任意字符

    查询黄姓的学生 select * from students where sname like '黄%';

范围查询

    in 表示在一个非连续的范围内

    查询编号是1或3或8的学生:  select * from students where id in(1,3,8);

    between … and … 表示在 一个连续的范围内

    查询学生是3至8的学生:  select * from students where id between 3 and 8;

空判断

    注意:null 与 '' 是不同的

    判空 is null

    判非空 is not null

优先级

    (高到低)小括号,not,比较运算符,逻辑运算符

    and 比 or 先运算,如果同时出现并希望先算or ,需要结合()使用



聚合

    为了快速得到统计数据,提供了5个聚合函数

    count(*) 表示计算总行数,括号中写星2或列名,结果是相同的

    max() 表示求此列的最大值

    min(列) 表示求此列的最小值

    sum(列) 表示求此列的和

    avg(列) 表示求此列的平均值

分组

    按照字段分组,表示此字段相同的数据会被放到一个组中

    分组后,只能查询出相同的数据列,对于有差异的数据列无法出现在结果集中

    可以对分组后的数据进行统计,做聚合运算

    语法: select 列1,列2,聚合… from 表名 group by 列1,列2,列3…

分组后的数据筛选

    语法: select 列1,列2,聚合… from 表名 group by 列1,列2,列3…having  列1,…聚合…

    having 后面的条件运算符与where的相同

对比 where 与 having

    where 是对 from 后面指定的表进行数据筛选,属于对原始数据的筛选

    having 是对 group by 的结果进行筛选



排序

    为了方便查看数据,可以对数据进行排序

    语法: select * from 表名 order by 列1 asc|desc, 列2 asc|desc, …

    将数据按照列1进行排序,如果某些行列1的值相同时,则按照列2排序,以此类推

    默认按照列值从小到大排序

    asc 从小到大排序,即升序

    desc 从大到小排序,即降序

获取部分行

    当数据行过大时,在一页中查看数据是一件非常麻烦的事情

    语法: select * from 表名 limit start,count 

    从 start 开始,获取count条数据

    start 索引从0开始

示例:分页

    已知:每页显示m条数据,当前显示第n页

    求总页数:

        查询总条数p1

        使用p1除以m得到p2

        如果整除则p2为总数页

        如果不整除则p2+1为总页数

    求第n页的数据:

        select * from students where isdelete=0 limit (n-1)*m,m




连接查询

    连接查询的分类:

        表A inner join 表B:表A 与 表B 匹配的行会出现在结果中

        表A left join 表B:表A 与 表B 匹配的行会出现在结果中,外加 表A 独有的数据,未对应的数据使用 null 填充

        表A right join B:表A 与 表B 匹配的行会出现在结果中, 外加 表B 独有的数据,为对应的数据使用 null 填充

    在查询或条件中推荐使用 “表名.列名”的语法

    如果多个表中列名不重复可以省略 “表名.”部分

    如果表的名字实在太长,可以在表名的后面使用 “as 简写名” ,为表起个临时的简写名称



视图

    对于复杂的查询,在多次使用后,维护是一件非常麻烦的事情

    解决:定义视图

    视图本质就是对查询的一个封装

    定义视图:

        create view 视图名 as 查询语句



事务

    当一个业务逻辑需要多个sql完成时,如果其中某条sql语句出错,则希望整个操作都退回

    使用事务可以完成退回的功能,保证业务逻辑的正确性

    事务四大特性(简称ACID)

        原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么均不执行

        一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致

        隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的

        持久性(Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障

    要求:表的类型必须是innodb或bdb类型,才可以对此表使用事务

    查看表的创建语句

        show create table students;

    修改表的类型

        alter table '表名' engine=innodb;

    事务语句

        开启 begin; 

        提交 commit; 

        回滚 rollback;



索引

    当数据库中数据量很大时,查找数据会变的很慢

    索引能提高数据访问性能

    主键和唯一索引,都是索引,可以提高查询速度

    选择列的数据类型

    越小的数据类型通常更好:越小的数据类型通常在磁盘、内存和CPU缓存中都需要更少的空间,处理起来更快

    简单的数据类型更好:整型数据比起字符,处理开销更小,因为字符串的比较更复杂

    尽量避免NULL:应该指定列为 NOT NULL,除非你想存储NULL。含有空值的列很难进行查询优化,因为他们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊的值或者一个空串代替空值

    操作

    索引分单列索引和组合索引

        单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,单这不是组合索引

        组合索引,即一个索引包含多个列

    查看索引:

        show INDEX FROM table_name;

    创建索引:

        CREATE INDEX indexName ON mytable(username(length));

    删除索引:

        DROP INDEX [indexName] ON mytable;

    缺点

    虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行 INSERT、UPDATE 和DELETE。因为更新表时,不仅要保存数据,还要保存一下索引文件

    建立索引会占用磁盘空间的索引文件

    语句执行时间

    开启运行时间监测:    set profiling=1;

    执行查询语句后查看执行时间:  show profiles;