java基础高级2 MySQL 高级
1.数据库简介
DDL(数据定义语言)
DML(数据操作语言)
2. 准备工作
解压缩文件目录下找到my.ini文件,文件中写入[mysql] default-character set= utf-8
[mysqld]
port 3306
character set server=utf8
环境变量:path目录下,分号bin目录
把mysql安装到系统服务中,管理员权限运行,mysql -install
4.使用命令行客户端执行MySQL 命令
使用命令行登陆MySQL:mysql -u -p
MySQL 不区分大小写,即除了表中的数据外,MySQL的命令,关键字,数据库名,表名,列名等大写时和小写时时一样的
5. My SQL DDl 数据定义语言
Data Definition Language 数据定义语言,用来操作数据库对象
数据定义语言包含如下命令:create,drop,alter
操作数据库:
一个My SQL数据库服务器中可以创建多个数据库
创建数据库:create database dbname;
使用数据库:use database dbname;
查看现有数据库:show databasees;
查看数据库创建语句:show create database daname;
删除数据库:drop database dbname;
操作表:
一个MySQL数据库中可以创建多个表
创建表:create table tableName(列定义列表)
列定义格式:columnName datatype [null][key][default][extra]
create table student(id int primary key auto_increament,
name varchar(20) not null,
gender varchar(10) not null default '男',
age int );
查看表结构;desc tableName;
查看表的创建语句: show create table tableName;
删除表:drop table tableName;
F5刷新
create database testdb;
use testdb;
每个单词之间有空格,小括号用英文的
create table student (
id int primary key auto_increment,
name varchar(20) not null ,
gender varchar(10) not null default '男',
age int
);
varchar可变的字符
命令行查看表show tables;
修改表结构
添加新列:alter table tableName add 列定义
删除列: alter table tableName drop columName
修改列定义:alter table tableName change oldColunmName 新列定义
操作索引
索引基于特定的数据结构,大部分是树结构,加快查询速度,另一个方面占用存储空间,拖慢更新速度,造成存储碎片
创建索引:create index indexName on tableName(columName);在表的该列上创建名为**的索引
查看索引:show index from tableName;
删除索引:drop index indexName on tableName;
在创建表时,会默认为主键列创建一个聚集索引,并且不可修改,最终只有一个
后来手动创建的都是非聚集索引
show index from testtable;
查找所有id为15的数据
select * from testtable where id=15;遍历数据库中的每一条数据
没有索引情况452ms,有索引31ms
create index index0 on testtable(id);
#注释的意思
运行SQL文件,sql
1. 插入,更新,删除
Data Manipulation Laguage数据操纵语言,用来操作表中数据(这种操作都需要事务控制,都会记录日志,都可以回滚)
常用命令:insert,select ,update,delete
插入数据
语法格式:
insert into tableName(列名列表) values(值列表)
insert int tableName(列名列表) select 查询语句
use testdb;
alter table student change age age int;修改列的数据类型
insert into student (name,gender,age) values//指定数据('dan','nan',20);
insert into student values('dandan','nv',25)不写列名列表,就把所有列的值写上
给自增列提供数据,直接写提供的
以最大的自增
insert into student (name,gender) select name,gender from student;把查到的结果集当做value值
insert into student values(null,'dandan2''nan'55),(null,'小红',99);
更新数据;
语法格式:
update tableName set 列名= where 列名=
删除数据
语法格式
delete from tableName where 列名=
命令行工具开启事务,自己提交事务
还有另一种更彻底的删除方式
truncate table tableName;删除表中数据
这种方式会把表结构删掉,然后重新创建表,属于DDL语句,删除操作效率高,但不可回滚,慎用;
2.select ...from .., where ....子句
语法格式
select 子句查询那些列
from子句从哪个表里查询
[where 子句]
[group by子句][having 子句]
[order by子句]
[limit子句]
select 子句
指定需要从表中取出那些列的数据
select * 结果集中包含所有的列
select 列名1,列名2 可查询多个列
select 列名 as '别名' 可以为列指定别名
select 表名1.列名1,表名2.列名2
select distinct 列名列表 结果集中重复的记录会被删除
select 表达式 列可以进行表达式求值 select (age+1)
select 聚集函数 可以对列使用聚集函数 select count(*)
聚集函数 用来对结果做进一步处理
count() 对结果集 计数
sum() 对结果集 中特定的列求和
avg() 对结果集中特定的列求平均值 =sum()/count();
max 返回结果集列中最大值
min() 返回结果集列中最小值
from 子句
from 表名
from 表名 as '别名'
from 表名1,表名2
where子句
select max(score) from grade;
select min(score) from grade;
select avg(score) from grade;
select count(score) from grade;
select sum(score) from grade;
where 子句用来指定筛选数据的
where 表达式 (表达式的计算结果应该是true或false)
select * from grade where score=100;
0和false一样,非0整数就认为是true
表达式由运算符和操作数组成;
比较运算符;= <> 不等于> >=,<,<=
逻辑运算符; and ,or ,not 用and连接两个查询条件
like, between and
is null ,is not null 对null使用其他运算符的结果都是false
查询那些列为null ;select * from grade where score is null;
集合运算符: in ,all ,ary,some exists
order by子句
order by子句对结果集进行排序
order by 列名[asc|desc]
order by 列名1[asc|desc] ,列名2[asc|desc]
asc升序,desc降序
默认是升序;
group by 子句
group by 子句对查询结果再进行分组,并常和聚集函数一起使用
语法格式
group by 列名
查询各门课程的平均成绩
select couseid,avg(score) from grade group by courseid;
查询各门课程的总成绩
select courseid ,sum(score) from grade group by courseid;
having子句
having子句和where子句用法类似
常和group by 子句配合使用,对查询的结果集进行筛选
having 子句后面可以跟聚集函数,where子句不可以
select courserid,avg(score) from grade group by couseid having avg(score)<80
limit子句
limit从结果集中取出部分结果
语法规则
limit beginindex ,length 开始索引,长度
例如:从学生表中取出前10条数据
select * from student limit 0,10;
select * from grade limit 30,10;从第30条数据开始,取10条数据;
多表查询
若一个查询涉及到两个以上的表,我们称为多表查询或者连接查询,而且需要指定连接条件
连接条件可以使用= ><等运算符,当使用=时称为等值连接,其他称为不等值连接
指定连接条件有两种方式
在where子句中指定
#例如;查询学生的姓名和该学生课程号位005的课程的成绩
select studentName,score
from student,grade
where student.studentid=grade.studentid and courseid='005'
在from子句中指定
from 表1 left|right outer join 表2 on 连接条件 外连接查询
from 表1 inner join 表2 on 连接条件 内连接查询
查询条件都要放在from后面,否则效果不一样
select studentName,score
from student left outer join grade on连接条件student.studentID=grade.studentid and courseid='005'
select studentName,score
from student right outer join grade on连接条件student.studentID=grade.studentid and courseid='005'
左外连接查询的作用;保留左边表的所有数据,如果右边表连接失败,用null填充
右外连接查询的作用;
例如;查询学生的姓名和该学生课程号位005的课程的成绩
select studentName ,score
from student inner join grade on 连接条件
嵌套查询
一个查询语句可以嵌套在另一个查询语句的where子句或者having子句中,这种查询成为嵌套查询
外面的查询成为外层查询或父查询,里面的查询称为内查询或子查询
子查询的结果可能包含一条数据,也可能包含多条数据
当子查询的结果是单个时,可以使用比较运算符或集合元素符
但当子查询的结果是集合时,必须使用集合运算符(in ,all,any ,exist)和all和其他运算符结合使用
in 单独使用,多条数据
any
例如:查询出年龄大于蛋蛋1的年龄的学生姓名和年龄
select studentName,age
from student
where age>(select age from student where studentname='蛋蛋1' );
例如:查询出年龄大于蛋蛋1的年龄,而且大于蛋蛋2的学生姓名和年龄
select studentName,age
from student
where age> all (select age from student where studentname='蛋蛋1' or studentname='蛋蛋2');
相关子查询
子查询的查询条件不依赖于父查询,成为不相关子查询
子查询的查询条件依赖于父查询,称为相关子查询
例如:查询至少有一门课程成绩大于90分的学生的姓名
select studentname
from student s
where exists (select * from grade g where s.studentid=g.studentid and score>90)
不相关子查询的查询过程:先执行子查询,得到结果后,再执行父查询
相关子查询的查询过程:先执行父查询,每次从表中取出一条数据后,紧接着就执行子查询,子查询会用到父查询取出的这条数据,如果符合条件,这条数据就会被放进最终的结果集中
判断是否依赖;子查询是否可以独立执行
集合查询
查询语句的结果实际上是集合,集合之间就可以进行并union,交intersect,差except等集合运算(很多数据库只支持并集)
语法格式
查询语句1 union查询语句2 -----会去掉重复数据行
查询语句1 union all 查询语句2 -------会保留全部数据行
集合查询要求查询结果集的列数必须相等,并且对应列的数据类型必须相同
select studentname ,age from student where age<30
union
select studentname age from student where age>33
sql查询常用优化
1. 尽量不要使用select *,因为会增加编译时间(不过很多数据库都对select * 进行了优化),有时也会查出并不需要的数据,增加网络和服务器负担
2.尽可能把多条sql语句合并成一条,因为每条sql语句的发送,编译,执行,返回结果都需要时间
3. 尽量不要在where子句中使用1=1,这会迫使数据库服务器进行全表扫描(很多数据库也对这种情况进行了优化)
4.尽可能使用between and 因为数据库已经对他进行了优化
5.数据库一般采用自后向前的顺序解析where子句,所以表的链接条件最好写在最前面,那些可以过滤大量数据的条件要写在最后
6.通过编程语言查询数据时最好使用带占位符的sql语句,数据库会预先编译好这些sql语句,并保存起来供重复使用,效率高而且可必选sql注入漏洞
MySQL账号管理
%通配符,所有的电脑
创建账号;create user 'username'@'%主机名或ip地址' ,identified by '123'
删除账号;drop user 'username'@'%'
给账号授权;grant all privileges on dbname.* to 'username'@'%'
查看授权;show grants for 'username'@'%'
取消授权: revoke all privileges on dbname.* from 'username'@'%'
修改自己的密码(没有登录)mysqladmin -u 用户名 -p password 新密码
修改别人的密码(root登录) set password for 用户名=password("新密码");
create user 'dandan' @ '%' identified by'123';只有登录权限
select * from mysql.user;不需要使用use database
use mysql
delete from user where host='localhost' and select _priv='N';
重启mysql数据库
quit 退出
net stop myslq停止数据库
net start mysql 启动数据库
找回root密码
1. 在my.ini文件中[mysqld]下找到skip -grant-tables
2.重启MySQl服务
net stop mysql
net start myslq
3.使用mysql直接登录,不需要用户名和密码
4. 执行
5.执行
6.退出quit
7.删除my.ini文件中的skip -grant-tables
java基础高级2 MySQL 高级的更多相关文章
- 黑马程序员:Java基础总结----泛型(高级)
黑马程序员:Java基础总结 泛型(高级) ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 泛型(高级) 泛型是提供给javac编译器使用的,可以限定集合中的输入类型 ...
- ava基础MySQL存储过程 Java基础 JDBC连接MySQL数据库
1.MySQL存储过程 1.1.什么是存储过程 带有逻辑的sql语句:带有流程控制语句(if while)等等 的sql语句 1.2.存储过程的特点 1)执行效率非常快,存储过程是数据库的服 ...
- java基础讲解10-----类的高级特性
一.final关键字 1.final关键字修饰变量,表示变量不可以被改变,如果想修改,编译器不会接受的. 注意:final关键字定义的变量必须赋值 public static final 修饰 白 ...
- mysql高级day1
Mysql高级-day01 MySQL高级课程简介 序号 Day01 Day02 Day03 Day04 1 Linux系统安装MySQL 体系结构 应用优化 MySQL 常用工具 2 索引 存储引擎 ...
- [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)
如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html 谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...
- 转载:[Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)
原文:http://www.cnblogs.com/wang-meng/p/5898837.html 一:继承.抽象类与接口区别.访问控制(private, public, protected,默认) ...
- MySQL高级知识(一)——基础
前言:MySQL高级知识主要来自尚硅谷中MySQL的视频资源.对于网上视频资源来说,尚硅谷是一个非常好的选择.通过对相应部分的学习,笔者可以说收益颇丰,非常感谢尚硅谷. 1.关于MySQL的一些文件 ...
- JAVA(一)JAVA基础/面向对象基础/高级面向对象
成鹏致远 | lcw.cnblog.com |2014-01-23 JAVA基础 1.开发环境搭建 JAVA程序的执行流程 JAVA命令->要使用一个*.class文件(类文件)->通过c ...
- java基础(十)-----Java 序列化的高级认识
将 Java 对象序列化为二进制文件的 Java 序列化技术是 Java 系列技术中一个较为重要的技术点,在大部分情况下,开发人员只需要了解被序列化的类需要实现 Serializable 接口,使用 ...
随机推荐
- commons configuration管理项目的配置文件
Commons Confifutation commons configuration可以很方便的访问配置文件和xml文件中的的内容.Commons Configuration 是为了提供对属性文件. ...
- 提高前端开发效率必备AngularJS (基础)
简介 AngularJS 是一个为动态WEB应用设计的结构框架,提供给大家一种新的开发应用方式,这种方式可以让你扩展HTML的语法,以弥补在构建动态WEB应用时静态文本的不足,从而在web应用程序中使 ...
- jquery获取url参数及url加参数的方法
转--http://www.jb51.net/article/73896.htm <script src="js/jquery-1.7.2.min.js" type=&quo ...
- SSH免密码登陆原理
Master作为客户端,要实现无密码公钥认证,连接到服务器Salve上时,需要在Master上生成一个密钥对,包括一个公钥和一个私钥,而后将公钥复制到所有的Salve上.当Master通过SSH链接到 ...
- 自己对js对原型链的理解
js对象分为2种 函数对象和普通对象 函数对象 比如 function Show(){}var x=function Show2(){}var b=new Function("show3&q ...
- javascript 基础
javascript概述: javascript历史: * 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEas ...
- django文件上传和序列化
django实现文件上传 使用form表单上传文件 html页面 <html lang="en"> <head> <meta charset=&quo ...
- System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本问题
出错的原因: 1.虽然报的是需要安装客户端8.1.7及以上版本,实际是由于.NET账户没有访问Oracle\bin文件夹的权限 2.在 Windows Server 2003/2008 或Window ...
- Clang: Undefined symbols, but it is there using nm.
https://stackoverflow.com/questions/36662920/xcode-clang-link-build-dynamic-framework-or-dylib-not-e ...
- js function集合
/*跳转并是刷新界面*/ function page_back(){ history.go(-); location.reload(); } function show_div(obj){ if(ob ...