MySQL的基本安装及操作


MySQL

基本概念

DBMS(Database Management System),数据库管理系统,就是MySQL数据库软件。

database数据库,在MySQL中一个DBMS可以创建管理多个数据库,每个数据库就像一个仓库,可以存储数据。

table表,表示具体存储数据的地方,比如T_Users表专门存储用户数据。一个数据库可创建多张表

column列,一个表中可以包含多个列,一个列表示一个特定的数据项,如果age列表示用户年龄,name列表示用户
姓名。
primary key主键,用来唯一标志某行数据的列称为主键,主键列的值不能重复、不为null。

安装MySQL:
	1. 下载并解压MySQL压缩文件到一个不含中文和空格的目录下
	2. 使用管理员权限打开CMD命令行工具,切换目录到MySQL的bin目录下
	3.CMD中执行mysqId -install把MySQL安装成系统服务
	4.CMD中执行net start mysql(或启动电脑)启动MySQL服务
	5. 把MySQL的bin目录追加到Path环境变量后面
	6. 重启CMD然后执行mysql -u用户名 -p密码   即可登录MySQL

可以使用sc delete mysql或者mysqId -remove卸载MySQL系统服务。

操作数据库
MySQL DDL数据库定义语言
Data Definition Language数据定义语言,用来操作数据库对象。

数据定义语言包含如下命令:create、drop、alter

操作数据库:
一个MySQL数据库服务器中可以创建多个数据库
创建数据库:create database dbname;
使用数据库:use database dbname;
查看现有数据库:show databases;
查看数据库创建语句:show create database dbname;
删除数据库:drop database dbname;

操作表1:
一个MySQL数据库中可以创建多个表
创建表:create table tableName(列定义列表)
列定义格式:columnName datatype [null] [key] [default] [extra]
定义外键列:constraint 外键名 foreign key (主键名) references 关联表名(关联表主键名)
查看表结构:desc tableName;
查看表的创建语句:show create table tableName;
删除表:drop table tableName;

操作表2:
添加新列:alter table tableName add 列定义
添加外键列:alter table 表名 add constraint 外键名 foreign key (主键名) references 关联表名(关联表
外键名)
删除列:alter table tableName drop columnName
修改列定义:alter table tableName change oldColumnName 新列定义

操作索引
索引基于特定的数据结构(大部分是树结构),主要用来加快查询速度,另一方面也会占用存储空间、拖慢更新速度、
造成存储碎片等。
创建索引:create index indexName on tableName(columnName);
查看索引:show index from tableName;
删除索引:drop index indexName on tableName;

插入、更新、删除
MySQL DML 数据操纵语言
Data Manipulation Language数据操纵语言,用来操作表中数据(这种操作都需要事务控制,都会记录日志,都可
以回滚)。

常用命令有:insert、select、update、delete

插入数据:
insert into tableName(列名列表) values(值列表);
insert into tableName(列名列表) select 查询语句
更新数据:
update tableName set 列名 1=1,列名 2=2...
update tableName set 列名 1=1,列名 2=2... where子句
删除数据:
delete from tableName
delete from tableName where 子句

还有另一种更彻底的删除方式:
truncate table tableName
这种方式会把表结构先删除掉,然后重新创建表,属于DDL语句,这种删除操作效率相当高,但不可回滚,慎用!

select、from子句

查询语句结构:
select 子句
from 子句
[where 子句]
[group by 子句 [having 子句] ]
[order by 子句]
[limit 子句]

MySQL提供了上面的语法格式(基于sql标准)来满足用户复杂苛刻的查询需求。

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 表名
from 表名 [as] 别名
from 表名1,表名2
from 表名1 [inner|left|right|full] outer join 表名2 on 连接条件

where 子句
where 子句用来指定筛选条件
where 表达式  (表达式的计算结果应该是true或者false)
表达式由运算符和操作数组成:
比较运算符:=<>(不等于)、>>=<<=
逻辑运算符:and、or、not、like、between  and、is null、is not null(对null使用其他运算符的结果都是
false)
集合运算符:in、all、any、some、exists
通配符:必须与like运算符一起使用
%:替代0个或多个字符
_:仅替代一个字符
[charlist]:字符列中的任何单一字符
[^charlist]或者[!charlist]:不在字符列中的任何单一字符

order by 子句
order by 子句对结果集进行排序
order by 列名 [asc|desc]
order by 列名1 [asc|desc],列名2 [asc|desc]

group by 子句
group by 子句会对查询结果再进行分组,并常和聚集函数一起使用
语法格式:
group by 列名

having 子句
having子句和where子句用法差不多,
但通常和group by配合使用,可对分组后的结果集进行筛选。
例如:查询平均成绩小于80的学科
select courseId,avg(score)
from Grade
group by courseId
having avg(score)<80;

limit 子句
limit 子句可以从结果集中取出一部分数据,常用来实现分页查询
语法规则:
limit beginIndex,length
例如:从学生表中取出前10条数据
select * from student limit 0,10;

多表查询
若一个查询涉及到两个以上的表,我们称为多表查询或者连接查询,而且需要指定连接条件
连接条件可以使用=><等运算符,当使用=时称为等值连接,其他称为不等值连接。
指定连接条件有两种方式:
在where子句中指定
在from子句中指定

from1 left|right outer join 表2 on 连接条件    --外连接查询

from2 inner join 表2 on 连接条件                   --内连接查询

左外连接查询的作用:保留左边表的所有数据,如果右边表连接失败了,则使用null填充
内连接查询的结果和在where 子句中指定的查询结果是一致的。
如果在from子句中加入where等查询条件,这种查询结果和在where子句中指定的查询结果是一致的。

嵌套查询
一个查询语句可以嵌套在另一个查询语句的where子句或者having子句中,这种查询称为嵌套查询
外面的查询称为外层查询或父查询,里面的查询称为内查询或子查询
子查询的结果可能包含一条数据,也可能包含多条数据
当子查询的结果是单个时,可以使用比较运算符或集合运算符
但当子查询的结果是集合时,必须使用集合运算符
集合运算符:in,all,any,some,exists

相关子查询
子查询的查询条件不依赖于父查询的,称为不相关子查询。
子查询的查询条件依赖于父查询的,称为相关子查询。
例如:查询至少有一门课程成绩大于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 * ,因为会增加编译时间(不过很多数据库都对select * 进行了优化),有时也会查处并不需
要的数据,增加网络和服务器负担
尽可能把多条sql语句合并成一条,因为每条sql语句的发送、编译、执行、返回结果都需要时间
尽量不要在where子句中使用1=1,这会迫使数据库服务器进行全表扫描(但很多数据库也对这种情况进行了优化)
尽可能使用between and ,因为数据库已经对它进行了优化
数据库一般采用自后向前的顺序解析where子句,所以表的连接条件最好写在最前面,那些可以过滤掉大量数据的条件
要写在最后
通过编程语言查询数据时最好使用带占位符的sql语句,数据库会预先编译好这些sql语句并保存起来供重复使用,效
率高而且可避免sql注入漏洞

账号管理
(如果一个MySQL供多个项目使用,一般为每个项目创建一个账号)
创建账号:create user 'username'@'%'   identified by 'password';
删除账号: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('新密码')

找回root账号的密码:
	1. 在my.ini文件中的[mysqId]下面添加:skip-grant-tables
	2. 重启MySQL服务(net stop mysql 和 net start mysql)
	3. 使用mysql直接登录,不需要用户名和密码
	4. 执行update mysql.user set authentication_string=password('root') where user='root';
	5. 执行flush privileges;
	6. 退出quit
	7. 删除my.ini文件中的skip-grant-tables
	8. 重启MySQL服务

找回密码成功

说出在JSP页面里是怎么分页的?
页面需要保存以下参数:
  总行数:根据sql语句得到总行数
  每页显示行数:设定值
  当前页数:请求参数
  页面根据当前页数和每页行数计算出当前页第一行行数,定位结果集到此行,对结果集取出每页显示行数的行即可


猜你喜欢

转载自blog.csdn.net/Mr_TXQ/article/details/109054832