视图:可视化的表,是指可以把sql执行的结果,直接缓存到了视图中,下次如果还要使用相同的sql语句,直接调用视图就可.
视图 *** 作步骤:第一步创建视图 第二部使用步骤
创建视图的格式: create view 视图名 as 查询的sql语句
视图:就是一张特殊的表 用来缓存查询的结果
好处是提高了SQL的复用率,简化了我们重写sql语句,屏蔽了真实的业务表的复杂性,被所有人共享
坏处:视图中存了大量重复的数据是占内存的,无法被优化,当数据更新时,视图也需要更新,麻烦.
CREATE VIEW empview AS SELECt*FROM emp WHERe ename LIKE '%a%' //将sql语句SELECt*FROM emp WHERe ename LIKE '%a%' 创建视图 SELECt*FROM empview //使用刚创建的视图优化
EXPLAIN SELECt* FROM students WHERe sname LIKE "李%" #索引生效 高效方式可以生效 EXPLAIN SELECt* FROM students WHERe sname LIKE '%李%' #索引失效 EXPLAIN SELECt* FROM students WHERe sname LIKE "%李" #索引失效 EXPLAIN SELECt*FROM students WHERe sno=103 #失效 因为字段类型不匹配 EXPLAIN SELECt*FROM students WHERe sno='103' #生效 因为字段类型是varchar
1.查询语句时尽量不要使用*,使用字段名查询,可以节省资源.
2.查询条件中尽量使用and,不用or,尽量把查询条件的范围控制到最小,or是满足两个查询中的一条查询语句就会
3.查询条件中应该避免使用!=,因为‘!=’ 将不使用索引。记住, 索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表中.
4. 表设计时,尽量使用varchar替换char,在mysql中char长度不变的,如设置一个长度为10的字段,插入的长度小于定义长度时,会用空格填充,和varchar是长度可变的,小于定义长度时,还是按实际长度存储.
5. 单表中索引的数量控制在5个以下,在模糊查询中,只有使用 ‘x%’ 会让索引生效
6. 关联的表个数越多,编译的时间和开销也就越大,每次关联内存中都生成一个临时表,应该把连接表拆开成较小的几个执行,可读性更高
如果一定需要连接很多表才能得到数据,那么意味着这是个糟糕的设计了,阿里规范中,建议多表联查三张表以下
7.多表查询可以使用三种方式,笛卡尔积,连接查询 inner join 内连接 left join 左连接 right join 右连接,子查询,其中连接查询相对高效,最高效的是inner join 内连接.
是指数据库设计人员,必须要遵守的规范
常见的范式有三范式:1nf 2nf 3nf
好处是可以减少冗余
第一范式:表中的字段值不会在分割,可以理解为一个字段只存储一段信息
第二范式:2NF, 是指 遵循了1NF的基础上,再遵循2NF.表中的非主属性要围绕着主属性运行,可以理解为表中任意一个字段,都依赖于表中同一个字段.
第三范式:3NF, 是指 遵循了前两范式
是指 字段之间的依赖性是直接的,而不是还要间接的产生依赖,导致查询关闭变得复杂,结论是一张表最多只存2层同类型信息
java 和 数据库是不相关的,但是通过JDBC,可以利用一段java程序来 *** 作数据库,它是一套标准,一套准则,本质上是一个jar包(java工具类)
public class Test33 { public static void main(String[] args) throws Exception { //注册驱动 Class.forName("com.mysql.cj.jdbc.Driver"); //获取连接 String url="jdbc:mysql://localhost:3306/cgb211101"; Connection c = DriverManager.getConnection(url, "root", "root"); //获取传输器 Statement s = c.createStatement(); //保存执行sql语句 交给结果集ResultSet r ResultSet r = s.executeQuery("select*from dept");//用来执行sql语句 System.out.println("java程序与数据库连接成功"); //处理数据库返回来的结果 while(r.next()){ int deptno = r.getInt(1);//获取参数 第一列的整数值 //todd //获取后面两列的值 String dname = r.getString(2); //获取第二列的值 String loc = r.getString(3);//获取第三列的值 System.out.println(deptno+"."+dname+loc); } //关闭资源 c.close(); s.close(); r.close(); } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)