数据库入门

2019-04-14 19:53发布

连接MYSQL服务器:mysql -uroot -proot 快捷键F7可以查看历史命令记录

    *U(update更新数据) Update语句
        将所有员工薪水都增加500元。
            update employee set salary=salary+500;
    
    *D(drop删除数据) Delete语句
        删除表中姓名为王五的记录。
            delete from employee where name='王五';
        删除表中所有记录。
            delete from employee; --可以有条件,但删除所有记录差了一点
        使用truncate删除表中记录。
            truncate employee;--无条件 效率高
    
    *R(Retrieve查找数据) Select语句    
        准备环境:
            create table student(
                id int,
                name varchar(20),
                chinese int,
                english int,
                math int
            );

            insert into student(id,name,chinese,english,math) values(1,'何东',80,85,90);
            insert into student(id,name,chinese,english,math) values(2,'权筝',90,95,95);
            insert into student(id,name,chinese,english,math) values(3,'何南',80,96,96);
            insert into student(id,name,chinese,english,math) values(4,'叶坦',81,97,85);
            insert into student(id,name,chinese,english,math) values(5,'何西',85,84,90);
            insert into student(id,name,chinese,english,math) values(6,'丁香',92,85,87);
            insert into student(id,name,chinese,english,math) values(7,'何北',75,81,80);
            insert into student(id,name,chinese,english,math) values(8,'唐娇',77,80,79);
            insert into student(id,name,chinese,english,math) values(9,'任知了',95,85,85);
            insert into student(id,name,chinese,english,math) values(10,'王越',94,85,84);

        过滤表中重复数据。
            select english from student;
            select DISTINCT english from student;
            select DISTINCT english,name from student;

        在所有学生英语分数上加10分特长分。
            select name,english+10 from student;
        统计每个学生的总分。
            select english+chinese+math from student;
        使用别名表示学生分数
            select name,english+chinese+math as 总分 from student;
            select name,english+chinese+math 总分 from student;

   

      
        查询数学分数为84,90,91的同学。
            select * from student where math=84 or math=90 or math=91;
            select * from student where math in(84,90,91);
        查询所有姓何的学生成绩。
            select * from student where name like '何%';

        查出各个班的总分,最高分
            准备环境
                给表添加一个字段:alter table student add column class_id int;
                更新表:
                    update student set class_id=1 where id<=5;
                    update student set class_id=2 where id>5;
            select sum(math+chinese+english),max(math+chinese+english) from student group by class_id;

        查询出班级总分大于1300分的班级ID
            select class_id from student group by class_id having sum(math+chinese+english)>1300;

表的约束  
    *定义主键约束 primary key:不允许为空,不允许重复

    *定义主键自动增长 auto_increment

    *定义唯一约束 unique

    *定义非空约束 not null

    *定义外键约束 constraint ordersid_FK foreign key(ordersid) references orders(id)

    *删除主键:alter table tablename drop primary key ;
    
数据的备份与恢复:
    *准备数据:
        create database mydb1;
        use mydb1;
        create table user(
            id int,
            name varchar(20)
        );
        insert into user(id,name) values(1,'Tom');
        select * from user;
    *备份:
        mysqldump -uroot -p mydb1>d: est.sql;--备份数据库里的数据

    *恢复;
        mysql -uroot -p mydb1         source d: est.sql(在mysql客户端上执行)
    
多表查询与子查询:
    准备环境:
        部门表
            CREATE TABLE DEPARTMENT(
               department_id int primary key auto_increment,       
               name varchar
            );
        职位表
            CREATE TABLE LOCATION (
               location_id int PRIMARY KEY auto_increment,       
               name varchar
            );
        员工表
            CREATE TABLE EMPLOYEES(
               employee_id int PRIMARY KEY auto_increment,       
               department_id int,       
               location_id int,       
               first_name varchar,       
               last_name varchar,       
               salary double,
               hire_date date     
            );

        向department表中添加数据            
            insert into department(name) values ('人事');
            insert into department(name) values ('财务');
            insert into department(name) values ('后勤');
            insert into department(name) values ('公关');
            insert into department(name) values ('研发');
        
        向location表中添加数据
            insert into location(name) values ('总经理');
            insert into location(name) values ('经理');
            insert into location(name) values ('主管');
            insert into location(name) values ('组长');
            insert into location(name) values ('职员');
        向employees表中添加数据
            insert into employees(department_id,location_id , first_name, last_name, salary,hire_date)
                   values (1,1, 'A', 'z', 50000, '2005-02-21');       
            insert into employees(department_id,location_id, first_name, last_name, salary,hire_date)
                   values (1,2, 'B', 'x', 20000, '2009-03-21');       
            insert into employees(department_id,location_id , first_name, last_name, salary,hire_date)
                   values (2,3, 'C', 'v', 10000, '2009-08-23');       
            insert into employees(department_id,location_id, first_name, last_name, salary,hire_date)
                   values (4,2, 'D', 'n', 30000, '2004-09-28');       
            insert into employees(department_id,location_id, first_name, last_name, salary,hire_date)
                   values (3,5, 'E', 'm', 3000, '2009-04-11');       
            insert into employees(department_id,location_id, first_name, last_name, salary,hire_date)
                   values (5,5, 'F', 'l', 5000, '2008-03-11');       
            insert into employees(department_id,location_id, first_name, last_name, salary,hire_date)
                   values (5,3, 'G', 'p', 20000, '2005-05-09');       
            insert into employees(department_id,location_id, first_name, last_name, salary,hire_date)
                   values (5,4, 'H', 'o', 8000, '2006-07-21');       
            insert into employees(department_id,location_id, first_name, last_name, salary,hire_date)
                   values (5,5, 'I', 'u', 6000, '2006-09-21');       
            insert into employees(department_id,location_id, first_name, last_name, salary,hire_date)
                   values (5,5, 'J', 'y', 5500, '2007-08-21');       
            insert into employees(department_id,location_id, first_name, last_name, salary,hire_date)
                   values (5,5, 'K', 't', 6500, '2006-12-21');       
            insert into employees(department_id,location_id, first_name, last_name, salary,hire_date)
                   values (5,1, 'L', 'r', 100000, '2001-05-21');
    练习:    
    --多表查询:查出姓z的员工的所有信息
        select * from employees e, department d, location l
            where e.[department_id]=d.[department_id] and e.[location_id]=l.[location_id] and e.[last_name]='z';
    --单行子查询: 查出所有工资大于平均工资的员工信息
        select * from employees where salary >(select avg(salary) from employees)
    --多行子查询: 查出所有所有姓z的部门名称
        select name from department where department_id in (select department_id from employees where last_name='z'); -------------------------------------------------------------------------------------------------------------------------------- 多表操作 一对多:
    用户和订单    
    -- 创建用户表
    create  table user(
        id int primary key auto_increment,
        username varchar(20)
    );
    
    -- 创建订单表
    create  table orders(
        id int primary key auto_increment,
        totalprice double,
        user_id int
    );
    
    为了保证数据的有效性和完整性,添加约束(外键约束).
        在多表的一方添加外键约束
            格式:
                alter table 多表名称 add foreign key(外键名称) references 一表名称(主键);
            例如:
                alter table orders add foreign key(user_id) references user(id);
                
                在MySQL中删除一张表或一条数据的时候,出现

            [Err] 1451 -Cannot delete or update a parent row: a foreign key constraint fails (...)

            这是因为MySQL中设置了foreign key关联,造成无法更新或删除数据。可以通过设置FOREIGN_KEY_CHECKS变量来避免这种情况。
           禁用外键约束,我们可以使用:

           SET FOREIGN_KEY_CHECKS=0;

           启动外键约束,我们可以使用:

            SET FOREIGN_KEY_CHECKS=1;

           查看当前FOREIGN_KEY_CHECKS的值,可用如下命令:

            SELECT  @@FOREIGN_KEY_CHECKS;
            开发的时候通常在最后才设置外键,方便测试.
            
    添加了外键约束之后有如下特点:★
        1.主表中不能删除从表中已引用的数据
        2.从表中不能添加主表中不存在的数据
    开发中处理一对多:★
        在多表中添加一个外键,名称一般为主表的名称_id,字段类型一般和主表的主键的类型保持一致,
        为了保证数据的有效性和完整性,在多表的外键上添加外键约束即可.
--------------------------------------------------------------------------------------------------------------------------------
SQL子查询的一些例子 1、单行子查询

查询部门名称为 SALES的员工信息

select * from emp where deptno=(select deptno from dept where dname='SALES')   等价于

select e.* from emp e,dept d where e.deptno=d.deptno and d.dname='SALES';

 如果子查询和多表查询都可以,理论上尽量使用多表查询


2.多行子查询

查询部门名称为SALES和ACCOUNTING的员工信息
select * from emp where deptno in (select deptno from dept where dname='SALES' or dname='ACCOUNTING');

select e.* from emp e,dept d where e.deptno=d.deptno and (d.dname='SALES' or d.dname='ACCOUNTING');


3.查询工资比30号部门任意一个员工高的员工信息

 select *  from emp where sal > any (select sal from emp where deptno=30);

select *  from emp where sal > (select min(sal) from emp where deptno=30)


4.查询工资比30号部门所有员工高的员工信息
 select *  from emp  where sal > all (select sal from emp where deptno=30);

select *  from emp where sal > (select max(sal) from emp where deptno=30)


5.查询不是老板的员工信息

select * from emp  where empno not in (select mgr from emp);则会显示null

 select * from emp where empno not in (select mgr from emp where mgr is not null); ----------------------------------------------------------------------------------------------------------------------------- Statement和PreparedStatement 1、关系
PreparedStatement继承Statement,他们属于父与子的关系。使用上来说Statement使用的地方都可以换成PreparedStatement。


2、安全性

Statement的直接执行SQL语句,无法防止SQL注入问题。PreparedStatement可以使用占位符,可以防止SQL注入问题。


这里举例说明:
使用Statement
stmt.executeQuery("select * from users where lastname = '"+lastName+"'");
使用PreparedStatement
perstmt = con.prepareStatement("select * from users where lastname = ?");
perstmt.setString(1,lastName);

rs=perstmt.executeQuery();

从上面可以明显看出使用Statement时,如果对lastName的值进行恶意的修改,那么就可能出现进行额外的操作、类型等等错误。最简单的“' or 1 or'”或关键字等等。而PreparedStatement由于内置了字符过滤,那么就相当于 where name = ' or 1 or'显然没有对应记录. 这就体现了PreparedStatement的防注入功能,将一些常用的错误屏蔽掉。

3、性能

PreparedStatement:
1) addBatch()将一组参数添加到PreparedStatement对象内部。
2) executeBatch()将一批参数提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。
Statement:
1) addBatch(String sql)方法会在批处理缓存中加入一条sql语句。

2) executeBatch()执行批处理缓存中的所有sql语句。

从两者的executeBatch方法的使用说明我们就可以明显的看出:

从第一次执行的角度:PreparedStatement由于占位符的使用,第一次执行需要很多额外的工作,例如占位符转换等等,这些都需要消耗一定的事件和资源。而Statement直接执行相对来说效率要高、消耗要少一些。

从多次执行的角度:PreparedStatement由于使用占位符进行预编译时,保存的执行代码被缓存,下次调用的时候就可以不再被编译而可以直接执行。而Statement即使执行一样的操作,由于操作数据不同,所以执行语句也需要再次编译。 ------------------------------------------------------------------------------------------------------------------------------------------------------------- 深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接 1、内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符)。包括相等联接和自然联接。     内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索 students和courses表中学生标识号相同的所有行。  
   
2、外联接。外联接可以是左向外联接、右向外联接或完整外部联接。    
在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定:    
1)LEFT  JOIN或LEFT OUTER JOIN    
左向外联接的结果集包括  LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。      
2)RIGHT  JOIN 或 RIGHT  OUTER  JOIN    
右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。      
3)FULL  JOIN 或 FULL OUTER JOIN
完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。  

3、交叉联接  
交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。   
FROM 子句中的表或视图可通过内联接或完整外部联接按任意顺序指定;但是,用左或右向外联接指定表或视图时,表或视图的顺序很重要。有关使用左或右向外联接排列表的更多信息,请参见使用外联接。    

例子:  
-------------------------------------------------
  a表     id   name     b表     id   job   parent_id  
              1   张3                   1     23     1  
              2   李四                 2     34     2  
              3   王武                 3     34     4      
  a.id同parent_id   存在关系  
--------------------------------------------------   
 1) 内连接  
  select   a.*,b.*   from   a   inner   join   b     on   a.id=b.parent_id      
  结果是    
  1   张3                   1     23     1  
  2   李四                  2     34     2  

  2)左连接  
  select   a.*,b.*   from   a   left   join   b     on   a.id=b.parent_id      
  结果是    
  1   张3                   1     23     1  
  2   李四                  2     34     2  
  3   王武                  null  

 3) 右连接  
  select   a.*,b.*   from   a   right   join   b     on   a.id=b.parent_id      
  结果是    
  1   张3                   1     23     1  
  2   李四                  2     34     2  
  null                       3     34     4  

 4) 完全连接  
  select   a.*,b.*   from   a   full   join   b     on   a.id=b.parent_id  
  结果是    
  1   张3                  1     23     1  
  2   李四                 2     34     2  
  null                   3     34     4  
  3   王武                 null 点击打开链接
--------------------------------------------------------------------------------------------------- 数据库(第一范式,第二范式,第三范式) 原文地址
◆ 第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列。 考虑这样一个表:【联系人】(姓名,性别,电话)
如果在实际场景中,一个联系人有家庭电话和公司电话,那么这种表结构设计就没有达到 1NF。要符合 1NF 我们只需把列(电话)拆分, 即:【联系人】(姓名,性别,家庭电话,公司电话)。1NF 很好辨别,但是 2NF 和 3NF 就容易搞混淆。 ◆ 第二范式(2NF):首先是 1NF,另外包含两部分内容,一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。
考虑一个订单明细表:【OrderDetail】(OrderID,ProductID,UnitPrice,Discount,Quantity,ProductName)。
因为我们知道在一个订单中可以订购多种产品,所以单单一个 OrderID 是不足以成为主键的,主键应该是(OrderID,ProductID)。显而易见
Discount(折扣),Quantity(数量)完全依赖(取决)于主键(OderID,ProductID),而 UnitPrice,ProductName 只依赖于 ProductID 。所以 OrderDetail 表不符合 2NF。不符合 2NF 的设计容易产生冗余数据。 可以把【OrderDetail】表拆分为【OrderDetail】(OrderID,ProductID,Discount,Quantity)和【Product】(ProductID,UnitPrice,ProductName) 来消除原订单表中UnitPrice,ProductName多次重复的情况。 ◆ 第三范式(3NF):首先是 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。
考虑一个订单表【Order】(OrderID,OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity)主键是(OrderID)。
其中 OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity 等非主键列都完全依赖于主键(OrderID),所以符合 2NF。不过问题是 CustomerName,CustomerAddr,CustomerCity 直接依赖的是 CustomerID(非主键列),而不是直接依赖于主键,它是通过传递才依赖于主键,所以不符合 3NF。
通过拆分【Order】为【Order】(OrderID,OrderDate,CustomerID)和【Customer】(CustomerID,CustomerName,CustomerAddr,CustomerCity)从而达到 3NF。
第二范式(2NF)和第三范式(3NF)的概念很容易混淆,区分它们的关键点在于,2NF:非主键列是否完全依赖于主键,还是依赖于主键的一部分;3NF:非主键列是直接依赖于主键,还是直接依赖于非主键列。
---------------------------------------------------------------------------------------------------------------------------------- 数据库索引 一、使用索引的好处

        创建索引可以大大提高系统的性能。      第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。      第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。     第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。     第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。     第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

二、索引的原理

索引是对数据库表中一个或多个列(例如,employee 表的姓名 (name) 列)的值进行排序的结构。 如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。
例如这样一个查询:select * from table1 where id=10000。如果没有索引,必须遍历整个表,直到ID等于10000的这一行被找到为止; 有了索引之后(必须是在ID这一列上建立的索引),即可在索引中查找。由于索引是经过某种算法优化过的,因而查找次数要少的多。可见,索引是用来定位的。 索引底层用的B+树
三、索引的常用种类及创建方法

这是最基本的索引,它没有任何限制。它有以下几种创建方式:

◆创建索引

CREATE INDEX indexName ON mytable(username(length)); 如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length,下同。

◆修改表结构

ALTER mytable ADD INDEX [indexName] ON (username(length)) ◆创建表的时候直接指定

CREATE TABLE mytable(   ID INT NOT NULL,    username VARCHAR(16) NOT NULL,   INDEX [indexName] (username(length))   );  删除索引的语法:

DROP INDEX [indexName] ON mytable;

(2)唯一索引

它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:

◆创建索引

CREATE UNIQUE INDEX indexName ON mytable(username(length)) ◆修改表结构

ALTER mytable ADD UNIQUE [indexName] ON (username(length)) ◆创建表的时候直接指定

CREATE TABLE mytable(   ID INT NOT NULL,    username VARCHAR(16) NOT NULL,   UNIQUE [indexName] (username(length))   );

(3)主键索引

它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引:

CREATE TABLE mytable(   ID INT NOT NULL,    username VARCHAR(16) NOT NULL,   PRIMARY KEY(ID)   );  当然也可以用 ALTER 命令。记住:一个表只能有一个主键。

(4)组合索引

为了形象地对比单列索引和组合索引,为表添加多个字段:

CREATE TABLE mytable(   ID INT NOT NULL,    username VARCHAR(16) NOT NULL,   city VARCHAR(50) NOT NULL,   age INT NOT NULL  );  为了进一步榨取MySQL的效率,就要考虑建立组合索引。就是将 name, city, age建到一个索引里:

ALTER TABLE mytable ADD INDEX name_city_age (name(10),city,age); 建表时,usernname长度为 16,这里用 10。这是因为一般情况下名字的长度不会超过10,这样会加速索引查询速度,还会减少索引文件的大小,提高INSERT的更新速度。

如果分别在 usernname,city,age上建立单列索引,让该表有3个单列索引,查询时和上述的组合索引效率也会大不一样,远远低于我们的组合索引。虽然此时有了三个索引,但MySQL只能用到其中的那个它认为似乎是最有效率的单列索引。

建立这样的组合索引,其实是相当于分别建立了下面三组组合索引:

usernname,city,age   usernname,city   usernname  为什么没有 city,age这样的组合索引呢?这是因为MySQL组合索引“最左前缀”的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这三列的查询都会用到该组合索引,下面的几个SQL就会用到这个组合索引:

SELECT * FROM mytable WHREE username="admin" AND city="郑州"  SELECT * FROM mytable WHREE username="admin" 而下面几个则不会用到:

SELECT * FROM mytable WHREE age=20 AND city="郑州"  SELECT * FROM mytable WHREE city="郑州" 原文地址

-------------------------------------------------------------------------------------------------------------------------------- mysql优化 1.SQL语句优化
1)应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
2)应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
     select id from t where num is null
     可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
     select id from t where num=0
3)很多时候用 exists 代替 in 是一个好的选择
4)用Where子句替换HAVING 子句
因为HAVING 只会在检索出所有记录之后才对结果集进行过滤 2.数据库索引 1、创建索引
对于查询占主要的应用来说,索引显得尤为重要。很多时候性能问题很简单的就是因为我们忘了添加索引而造成的,或者说没有添加更为有效的索引导致。 如果不加索引的话,那么查找任何哪怕只是一条特定的数据都会进行一次全表扫描,如果一张表的数据量很大而符合条件的结果又很少,那么不加索引会引起致命的性能下降。但是也不是什么情况都非得建索引不可,比如性别可能就只有两个值,建索引不仅没什么优势,还会影响到更新速度,这被称为过度索引。
2、复合索引
比如有一条语句是这样的:select * from users where area='beijing' and age=22;
如果我们是在area和age上分别创建单个索引的话,由于mysql查询每次只能使用一个索引,所以虽然这样已经相对不做索引时全表扫描提高了很多效率,但是如果在area、age两列上创建复合索引的话将带来更高的效率。如果我们创建了(area, age, salary)的复合索引,那么其实相当于创建了(area,age,salary)、(area,age)、(area)三个索引,这被称为最佳左前缀特性。因此我们在创建复合索引时应该将最常用作限制条件的列放在最左边,依次递减。
3、索引不会包含有NULL值的列
只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。
4、使用短索引
对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的 列,如果在前10 个或20 个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。
5、排序的索引问题
mysql查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。
6、like语句操作
一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。
7、不要在列上进行运算
select * from users where YEAR(adddate)<2007;
将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成
select * from users where adddate<‘2007-01-01';
mysql数据库性能优化(包括SQL,表结构,索引,缓存)
-------------------------------------------------------------------------------------------------------------------------------------------------- 事务隔离级别-- 脏读、幻读、不可重复读(清晰解释)
---------------------------------------------------------------------------------------------------------------------------------------------- MySQL命令行导出数据库
------------------------------------------------------------------ mysql数据库中的索引有那些、有什么用
--------------------------------------------------------------------- MySql 的索引实现原理
----------------------------------------------------------------- 数据库中索引为什么提高效率 索引是对数据库表中一列或多列的值进行排序的一种结构,因此数据库可以根据其排序情况提高查询速度。
数据库索引好比是一本书前面的目录,按照目录查找内容总是比较快速的
--------------------------------------------------------------------------- 表索引是不是越多越好? 1 首先数据量小的表不需要建立索引,因为小的表即使建立索引也不会有大的用处,还会增加额外的索引开销 2 不经常引用的列不要建立索引,因为不常用,即使建立了索引也没有多大意义
3 经常频繁更新的列不要建立索引,因为肯定会影响插入或更新的效率
4 索引并不是一劳永逸的,用的时间长了需要进行整理或者重建
--------------------------------------------------------------------------------------------------------------- 用户表users中含有100万条数据,其中号码字段phone为字符型,并创建了唯一索引,且电话号码全部由数字组成,要统计号码头为158的电话号码的数量, 下面写法执行速度最慢的是___
select count(*) from users where phone>= ‘158’ and phone< ‘158A’

select count(*) from users where phone like ‘158%’

select count(*) from users where substr(phone,1,3) = ‘158’ 在数据库的层面上进行函数的操作 本身就消耗速度, 数据库就应该干数据库本身应有的事,而不是处理具体业务,选C
---------------------------------------------------------------------------------------------------------------
"_"匹配任何单个字符
"%"匹配任意数目字符(包括零个字符)
"*"匹配0个或多个在它前面的字符
"[]"匹配在方括号中的任意一个字符 查找 student表中所有电话号码(列名:telephone)的第一位为8或6,第三位为0的电话号码 SELECT telephone FROM student WHERE telephone LIKE ‘[8,6]_0%’
---------------------------------------------------------------------------- mysql 数据库有选课表 learn(student_id int,course_id int),字段分别表示学号和课程编号, 现在想获取每个学生所选课程的个数信息,请问如下的 sql 语句正确的是() select student_id,count(course_id)from learn group by student_id
----------------------------------------------------------------------------- 语句 SELECT IF(-1,5,2) 的返回值是: if(条件,表达式1,表达式2)
如果条件为真(即不为0),执行表达式1,否则,执行表达式2
----------------------------------------------------------------------------------
数据库存储的是(数据及数据之间的联系)
--------------------------------------------------------------------------------------- 关系五种基本运算

    ① 并:

    R,S具有相同的关系模式(元素相同,结构相同),记为R U S,返回由R或者S元组构成的集合组成

    ② 差:

    R,S具有相同的关系模式(元素相同,结构相同),记为R-S,右属于R但不属于S的元组组成

    ③ 广义笛卡尔积:

    R×S由n目和m目的关系R,S组成一个(n+m)列的元组集合,若R有K1个元组,S有K2个元组,则R×S有K1*K2个元 组

    ④ 投影(π) :

    从关系的垂直方向开始运算,选择关系中的若干列组成新的列。

    ⑤ 选择(σ):

    选择从关系的水平方向进行元算,选择满足给定条件的元组组成新的关系。
--------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------