第一次测试题
1.对一个数据进行升序排序。
2.给定一个只包含’(’ 和 ‘)’ 的字符串,判断字符串是否有效。有效字符串满足:1.左括号必须用相同类型的右括号闭合。 2. 左括号必须以正确的顺序闭合。3. 空字符串可被认为是有效的字符串。
3.给定一个整数数组 a,同时给定它的大小 n 和要找的 K(K 在 1 到 n 之间),请返回第 K大的数,保证答案存在。例如:[1,3,5,2,2],第 3 大的数为 2。
Mysql
安装mysql
-
解压
mysql-8.0.30-winx64.zip
到d:/kaifamiao/envirments
文件夹下 -
输入
cmd
使用管理员方式打开命令提示窗口 -
使用命令将目录调整到
D:\kaifamiao\enviroments\mysql-8.0.30-winx64
目录下 -
依次执行脚本
-
1initialization.bat
初始化。完成后会有一个data
目录产生 -
2install.bat
安装mysql
服务看到
Service successfully installed.
表示服务安装成功 -
3startup.bat
启动mysql
服务MySQL
服务正在启动 .
MySQL
服务已经启动成功。
4.
4reboot.bat
为重启服务命令5.
5stop.bat
为停止服务命令6.
6uninstall.bat
为卸载服务命令
-
验证mysql
启动mysql
服务后, 进入到 {mysql根目录}/bin
-
cmd
窗口中输入以下命令:mysql -u root -p
-
能够进入到
mysql
即为成功安装。 -
修改环境变量
path
的值,添加D:\kaifamiao\enviroments\mysql-8.0.30-winx64\bin
将mysql
添加到环境变量
将
mysql
的bin
目录地址添加到系统环境变量
–>PATH
中
将mysql
添加到服务
以管理员的方式启动cmd
(命令提示窗口),使用命令进入到[mysql]\bin
,执行如下命令。
mysqld --install(服务名)
如:
mysqld --install Mysql 5.7
删除服务命令是:
mysqld --remove服务名
mysql
端口被占用解决
在cmd
窗口下执行如下命令:
netstat -ano|findstr 3306
查找正在执行的3306
端口程序
如果出现如图所示列表表示以上程序使用了3306端口,找到程序的PID
(最后一列)
去任务管理栏找到对应程序结束任务就行了。
连接MySQL
mysql -u 用户名 -p
-
mysql --help
查询所有参数SQL
分类DDL
: 数据定义语句。 如: CREATE / ALTER / DROPDML
: 数据操纵语句。如:INSERT / UPDATE / DELETEDQL
: 数据查询语句。如:SELECT
所有的
SQL
都应该以英文状态下的分号结束;
建库
-
创建数据库语法结构:
-
CREATE DATABASE [ IF NOT EXISTS ] db_name
-
CREATE DATABASE 表示创建数据库
-
db_name是要创建的数据库名称
CREATE DATABASE company_info;
-
-
使用数据库:
-
USE db_name
USE company_info;
-
-
删除数据库语法结构
-
drop database db_name
DROP DATABASE company_info;
-
-
显示所有的数据库
SHOW DATABASES;
建表
-
创建数据表的语法结构
CREATE TABLE tab_name( col_name datatype default null/number comment '注释', col_name datatype ) [CHARACTER set 编码格式]; /* * 使用CREATE TABLE table关键词创建数据表 * tab_name是数据表的名称 * col_name是列名称 * datatype是列的数据类型 * DEFAULT 是默认值 * COMMENT 是注释 */ CREATE TABLE dept( deptno INT DEFAULT 1 COMMENT '部门编号', deptname VARCHAR(20) DEFAULT NULL COMMENT '部门名称' )CHARACTER SET utf8;
– 显示所有表
SHOW tables;
-
创建用户
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
例如:
‐‐ user1用户只能在localhost这个IP登录mysql服务器
CREATE USER 'user1'@'localhost' IDENTIFIED BY '1234';
‐‐ user2用户可以在任何电脑上登录mysql服务器
CREATE USER 'user2'@'%' IDENTIFIED BY '1234';
授权
用户创建之后,没什么权限,需要给用户授权
GRANT 权限1, 权限2… ON 数据库名.表名 TO ‘用户名’@‘主机名’;
GRANT
授权关键字- 授予用户的权限,如
SELECT
,INSERT
,UPDATE
等。如果要授予所有的权限则使用ALL
数据库名.表名
:该用户可以操作哪个数据库的哪些表。如果要授予该用户对所有数据库和表的相应操作权限则可用*表示,如*.*
'用户名'@'主机名'
: 给哪个用户授权
例子:
- 给
user1
用户分配对test
这个数据库操作的权限
GRANT CREATE,ALTER,DROP,INSERT,UPDATE,DELETE,SELECT ON test.* TO 'user1'@'localhost';
- 给
user2
用户分配对所有数据库操作的权限
GRANT ALL ON *.* TO 'user2'@'%';
撤销授权
REVOKE 权限1, 权限2… ON 数据库.表名 FROM ‘用户名’@‘主机名’;
例子:
撤销user1用户对test操作的权限
REVOKE ALL ON test.* FROM 'user1'@'localhost';
查看权限
SHOW GRANTS FOR ‘用户名’@‘主机名’;
例子:
查看user1
用户的权限
SHOW GRANTS FOR 'user1'@'localhost';
删除用户
DROP USER ‘用户名’@‘主机名’;
例子:
DROP USER 'user2'@'%';
修改密码
修改管理员密码
mysqladmin -uroot -p password 新密码
– 新密码不需要加上引号
– 注意:需要在未登陆
MySQL
的情况下操作。
例子:
mysqladmin ‐uroot ‐p password 123456
输入老密码
修改普通用户密码
set password for ‘用户名’@‘主机名’ = ‘新密码’;
– 注意:需要在登陆
MySQL的
情况下操作。
set password for 'user1'@'localhost' = '666666';
常见的数据类型
int、double、date、datetime、varchar、time、timestamp
查看表结构
-- 查看表结构
DESCRIBE dept;
DESC dept;
练习:
创建一张user
表, 可以存储以下内容:姓名,性别,年龄,生日,电话,家庭住址,邮箱
create table `user`(
`name` VARCHAR(20) COMMENT '姓名',
`gender` CHAR(1) COMMENT '性别',
`age` INT COMMENT '年龄',
`birthday` DATE COMMENT '生日',
`phone` VARCHAR(20) COMMENT '电话',
`address` VARCHAR(50) COMMENT '住址',
`email` VARCHAR(20) COMMENT '邮箱'
);
创建和某表结构一样的表
-- 创建和dept结构一样的表
CREATE TABLE d LIKE dept;
-- 创建表
CREATE TABLE t AS select * from dept;
删除表
DROP TABLE table_name
添加列
ALTER TABLE d ADD id INT;
修改列属性
ALTER TABLE d MODIFY id VARCHAR(20);
修改列名
ALTER TABLE d CHANGE id ss VARCHAR(20);
删除列
ALTER TABLE d DROP ss;
重命名表
RENAME TABLE d TO dd;
CRUD操作
- 对数据表中的数据操作通常有添加(Create)、查询(Retrieve)、修改(Update)、删除(Delete)、简称为CRUD。
添加数据
INSERT INTO table_name VALUES(值列表)
INSERT INTO table_name (列列表) VALUES(值列表)
-- 不推荐使用
INSERT INTO dept VALUE(1,'研发部');
-- 2
INSERT INTO dept VALUES(2,'销售部');
INSERT INTO dept VALUES(3,'行政部'),(4,'技术部');
-- 3
INSERT INTO dept(deptno,deptname)VALUES(5,'安保部');
区别:
- value和values的区别,values可以同时插入多条数据用逗号隔开
- dept和dept(列名,列名。。。)区别,如果不写列表必须按照列表创建时的顺序每一列都要添加
- 有列名的按照列名排列顺序添加
查询数据
-- 查询所有数据
SELECT *FROM dept;
-- 查询某列的数据
SELECT deptname FROM dept;
-- 根据条件查询*
SELECT deptno FROM dept WHERE deptname='销售部';
修改数据
--全部修改为6
UPDATE dept SET deptno=6;
--根据条件修改
UPDATE dept SET deptno=1 WHERE deptname='研发部';
UPDATE dept SET deptno=2 WHERE deptname='销售部';
UPDATE dept SET deptno=3 WHERE deptname='行政部';
UPDATE dept SET deptno=4 WHERE deptname='技术部';
UPDATE dept SET deptno=5 WHERE deptname='安保部';
删除数据
-- 删除数据 ,一定要加 where 条件
DELETE FROM dept WHERE deptno=5;
-- 全部删除
DELETE FROM dept;
-- 清空/截断 所有数据(慎用)
TRUNCATE TABLE dept;
区别:
- delete from dd;
- truncate table dd;
- delete 是清空表中的数据,
DML
- truncate 是清空表数据(删除表后重新创建一个一样表),
DDL
where条件连接
当sql
语句中的条件有多条时,可以将多个条件连接起来。他们之间的关系有一下几种:
and
a and b
: 表示 需要同时满足 a 条件 和 b 条件
or
a or b
: 表示 满足 a 条件 或 b 条件都可以
in
in(a, ... ,b)
: 表示在 a 及 b 这些值中都可以
like
模糊查询, % 表示任意个字符 _ 表示一个字符
数据备份和还原
命令行备份
备份结构
1.备份表结构
mysqldump -u root -p -d dbname table1 table2 ... > a.sql
2.备份数据库的所有表结构
mysqldump -u root -p -d dbname > b.sql
3.备份多个数据库的所有表结构
mysqldump -u root -p -d --databases db1 db2... > c.sql
4.备份所有数据库的表结构
mysqldump -u root -p -d --all-databases > d.sql
备份数据和结构
(相当于在备份结构的语法上去掉-d选项)
1.备份表结构和数据
mysqldump -u root -p dbname table1 table2 ... > a.sql
2.备份数据库的所有表结构和数据
mysqldump -u root -p dbname > b.sql
3.备份多个数据库的表结构和数据
mysqldump -u root -p --databases db1 db2 > c.sql
4.备份所有数据库的表结构和数据
mysqldump -u root -p --all-databases > d.sql
- mysqldump -h 127.0.0.1 -u root -p root db_name>path;
- 使用mysqldump 命令备份数据库
- -h指定数据库所在的服务器的ip地址
- -u指定登录数据库的密码
- db_name是要备份的数据库的名称
- 使用输出目标操作符>,指定输出的文件具体路径
c:/back.sql
备份表数据
mysql -u root -p -e "selec 语句" dbname > 目标文件名
select * from xxx into outfile ‘/tmp/stud.txt' ;
命令行还原
还原表结构和数据
mysql -u root -p [dbname] < 目标文件
mysql -h127.0.0.1 -uroot -proot db_name<back.sql
load data infile '/tmp/stud.txt' into table students;
source /backup/all_db_2013-09-08.sql
高级查询
distinct
在select
语句中,可以使用distinct
关键字对查询的结果集进行去重。
select distinct 列1, ... , 列n from table_name [其他子句];
去重必须结果集中每个列的值都相同。
order by
order by
用于对结果进行排序显示,可以使用ASC
/ DESC
两种方式进行排序,可以有多个排序条件
ASC
:表示升序排序,如果不写即为此排序方式DESC
:表示降序排序
select [distinct] 列1, ... , 列n from table_name [其他子句] order by 排序列1 [DESC], 排序列2 [DESC];
分页查询limit子句
select * from emp limit 0,2;
- 第一个参数0是表示从第几条开始查询 (这里的 0 是可以省略不写的);
- 第二个参数 表示查询出几条数据
- 后面不够的,有多少写多少;
select * from emp order by empNo limit 5;
select * from emp limit 5,5;
select * from table_name limit (页码 - 1) * 每页数量, 每页数量;
聚合函数
Mysql
中内置了 5 种聚合函数,分别是:SUM
、max
、min
、avg
、count
。
-
sum
: 求和select sum(列) from table_name [其他子句];
-
max
: 求最大值select max(列) from table_name [其他子句];
-
min
: 求最小值select min(列) from table_name [其他子句];
-
avg
: 求平均值select avg(列) from table_name [其他子句];
-
count
: 求数量select count(列) from table_name [其他子句];
group by
group by
是对数据进行分组,分组时,表中有相同值的分为一组。分组后可以进行聚合查询。
group by
分组后的查询中,select
的列不能出现除了group by
分组条件以及聚合函数外的其他列。
select 列1, 列2, (聚合函数) from table_name group by 列1, 列2;
having
having
是对group by
分组后的结果集进行筛选。
select 列1, 列2, (聚合函数) from table_name group by 列1, 列2 having 分组后条件;
综合查询
SELECT DISTINCT emp.deptno FROM emp JOIN dept ON emp.deptno = dept.deptno WHERE bridate >= '2000-01-01' GROUP BY emp.deptno HAVING count(*) >= 2 ORDER BY count(*) DESC LIMIT 0, 5;
书写顺序是以上。
SQL
语句的执行顺序from --> on --> join --> where --> group by --> having --> select --> distinct-- > order by–> limit