操作数据库
操作数据表
增删改查
约束
用户管理
权限管理
1、查询所有的数据库
show databases;
2、查看某数据库的字符集与创建语句
show create database 数据库名
3、创建数据库
show create database (if not exists) 数据库名 (character set 字符集)
4、修改数据库字符集
alter database 数据库名 character set 新字符集
5、删除数据库
drop database (if exists) 数据库名
6、使用数据库
use 数据库名;
查看当前正在使用的数据库
select database();
1、查询某个数据库中所有表的名称
先进入一个数据库
show tables;
2、查询数据表的结构
3、创建数据表
create table 表名(
列名1 数据类型1,
列名2 数据类型2,
列名3 数据类型3
);
最后一列不要加句号。
数据类型有非常多,常用的有
int 整型、double小数类型、date日期类型、varchar()字符串类型、date日期(yyyy-MM-dd)、datetime(yyyy-MM-dd HH:mm:ss)、timestamp时间戳类型(包含年月日时分秒。如果不给该字段赋值,会自动使用当前系统时间)。
4、删除数据表
drop table (if exists) 数据表名
5、修改数据表
(1)修改数据表名
alter table 原表名 rename to 新表名
(2)修改数据表的字符集
alter table 表名 character set 新字符集
(3)新增一列
alter table 表名 add 新字段名 新字段数据类型
(4)修改列名或数据类型
alter table 表名 change 原列名 新列名 新数据类型;
alter table 表名 modify 列名 新数据类型
(1)添加数据:
单条:insert into 表名(列名1,列名2…) values (值1,值2,值3);
如果给所有列都添加数据就不需要写列名,即:
insert into 表名 values (值1,值2,值3);
(2)删除数据:
delete from 表名 [where条件],如果不加条件会删除表中所有的数据。
上面说到delete from不加条件会删除所有的数据,但是当我们真的想清空所有数据而保留原表时也不会使用它,因为他内部原理是一条一条的删除,对性能影响大。当需要清空表时,会使用
truncate table stu;
他会删除这个表,然后再创建一个一模一样的空表
(3)修改数据
update 表名 set 列名1=值1,列名2=值2,…[where条件]
(4)查询数据
select 字段 from 表名 【where筛选条件 group by 分组字段 having 分组后筛选条件 order by 排序条件 limit 显示条数】
一、基础查询
1、查询表的所有信息
2、查询指定列信息
3、去重查询
4、查询时进行数学运算与取别名
NULL值与任何数计算的结果都为NULL
5、使用IFNULL()对NULL值进行处理
二、条件查询
1、运算符
-- 查询年龄大于或等于20岁的人
SELECT * FROM student WHERE age>=20;
-- 查询年龄等于20岁的人
SELECT * FROM student WHERE age=20;
-- 查询年龄不等于20岁的人
SELECT * FROM student WHERE age<>20;
SELECT * FROM student WHERE age!=20;
-- 查询年龄大于等于20小于等于30的人
SELECT * FROM student WHERE age>=20 AND age<=30;
SELECT * FROM student WHERE age BETWEEN 20 AND 30;
-- 查询年龄为22、18、25的人
SELECT * FROM student WHERE age IN (22,18,25);
-- 查询英语成绩为NULL的人
SELECT * FROM student WHERE english IS NULL;
-- 查询英语成绩不为NULL的人
SELECT * FROM student WHERE english IS NOT NULL;
2、模糊查询
使用_匹配单个字符,%匹配任意多个字符
-- 查询姓马的人
SELECT * FROM student WHERE NAME LIKE '马%';
-- 查询名字为两个字的人
SELECT * FROM student WHERE NAME LIKE '__';
3、排序查询
按数学成绩排列(默认升序)
SELECT NAME,math,english FROM student
ORDER BY math
按数学和英语成绩排序,当数学成绩相同时,根据英语成绩排序,并降序排列
SELECT NAME,math '数学',english '英语' FROM student
ORDER BY math,english
4、聚合函数
聚合函数是将一列数组作为整体,进行纵向的计算
常用的有:
count个数、max最大值、min最小值、sum和、avg平均值
要注意的一点是,聚合函数的计算都排除了NULL值,所以一般也是用非空列进行计算,或者使用IFNULL()函数对数据进行处理
-- 查询全班的平均分
SELECT
AVG(math) '数学',
AVG(english) '英语'
FROM student
-- 查询男同学、女同学的单科平均分和总分平均分
SELECT
sex '性别',
AVG(math) '数学',AVG(english) '英语',
AVG(math+english) '总分'
FROM student
GROUP BY sex
6、分页查询
在查询之后使用limit m,n
其中m表示开始显示的索引(从0开始),n表示显示的条数
-- 数学成绩前3的同学成绩
SELECT NAME '姓名',math '数学',english '英语'
FROM student
ORDER BY math
DESC
LIMIT 0,3
约束是对表中的数据进行限定,保证数据的正确性、有效性、完整性。
1、非空约束 not null
2、唯一约束 unique
3、主键约束 primary key
4、外键约束 foreign key
2、唯一约束
唯一约束可以有NULL值,但是不可重复,连NULL也不准重复
CREATE TABLE Chinese(
NAME VARCHAR(20),
id INT UNIQUE
);
ALTER TABLE chinese DROP INDEX id;
INSERT INTO chinese VALUE ('李四',987654321);
SELECT*FROM chinese;
ALTER TABLE chinese MODIFY id INT UNIQUE
3、主键约束
主键要求非空且唯一,也就是一张表最多只能有一个主键
CREATE TABLE Chinese(
NAME VARCHAR(20),
id INT PRIMARY KEY
);
删除主键
ALTER TABLE chinese DROP PRIMARY KEY;
添加主键
ALTER TABLE chinese MODIFY id INT PRIMARY KEY;
4、自增长
自增长与主键密切相关,像数字类型的id等等,就可以设置为自动增长
CREATE TABLE USERS(
user_id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(20),
PASSWORD VARCHAR(20)
);
此外,这个自动增长的主键也可以填NULL,他也会自动在前一个的基础上增加。并且主键的id并不一定要每次都加1,也可以跳跃式的填充。
5、外键约束
这张表可以看到数据有很多冗余,比如123都属于研发部,都在广州。把这些重复的数据单独存放在一张表中,查询数据时通过多个表的联动来实现数据的匹配。而这其中起到连接多表作用的字段就是外键。
修改后的表为
当没有外键约束的时候可能出现不符合现实世界逻辑的问题。比如张三、李四、王五都属于1号部门,有一天公司经营不善要把1号部门删除了,那删除完之后这三个员工仍然属于1号部门,这就不合逻辑了。应该先将三个员工开除然后再删除1号部门。外键的用作就是对这样类似的问题进行约束。
在创建表时,可以添加外键
create table 表名(
…
外键列
constraint 外键名称 foreign key(外键列名) references 主表名称(主表列名)
);
CREATE TABLE department(
id INT PRIMARY KEY AUTO_INCREMENT,
dep_name VARCHAR(20),
dep_location VARCHAR(20)
);
CREATE TABLE employee(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
age INT,
dep_id INT, -- 外键对应主表的主键
CONSTRAINT emp_dept_fk FOREIGN KEY(dep_id) REFERENCES department(id) -- 外键
);
INSERT INTO department VALUES
(NULL,'研发部','广州'),
(NULL,'销售部','深圳');
INSERT INTO employee(NAME,age,dep_id)
VALUES('张三',20,1),
('李四',21,1),
('王五',20,1),
('老王',22,2),
('小王',18,2);
对于用户的操作,都在mysql这个数据库中完成
1、查询用户表信息
2、创建用户
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
如果要让用户在任何机器上都能登录,可以使用通配符
CREATE USER '用户名'@'%' IDENTIFIED BY '密码';
DROP USER '用户名'@'主机名';
UPDATE USER SET PASSWORD=PASSWORD('新密码') WHERE USER='用户名';
或者
SET PASSWORD FOR '用户名'@'主机名' = PASSWORD('新密码');
5、忘记root密码的解决办法
(1)管理员命令行停止MySQL服务
net stop mysql
(2)使用无验证方式登录MySQL
mysqld --skip-grant-tables
(3)不关闭前面的那个命令行,重开一个管理员命令行直接输入mysql即可进入
(4)切换到mysql数据库使用之前学的命令
update user set password=password('新密码') where user='root';
(5)关闭命令行窗口,在进程管理器中中止mysqld.exe
(6)管理员命令行使用新密码登录
1、查看权限
SHOW GRANTS FOR '用户名'@'主机名';
2、授予权限
常见的权限有SELECT、INSERT、UPDATE、CREATE、DROP等
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
为用户授予所有库的最高权限
GRANT ALL ON *.* TO '用户名'@'主机名';
3、撤销权限
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';