启动mysql:#net start mysql
关闭mysql:#net stop mysql
登录:mysql -u root -p root
退出:exit 或者是 quit
连接数据库服务器
1. 方式一:直接输入用户名与密码链接
格式:
Mysql -u 用户名 -p 密码
2. 方式二: 直接输入用户名但是不输入密码。
格式:
Mysql -uroot -p 回车 输入密码
3. 方式三: 远程连接别人的数据库的服务器
格式:
Mysql -uroot -p密码 -hip地址
==========================================================================
DDL
DDL语句操作数据库
1.查看数据库
Show databases 查看所有的数据库
Show create database 数据库名; 查看创建数据库的语句
2. 创建数据库
1. create database 数据库名; 直接创建数据库
2. Create database if not exists 数据库; 判断数据库是否存在,存在则不再创建,不存在则创建
3. Create database if not exists 数据库 character set 码表; 指定码表码表创建数据库
3. 删除数据库
1. drop database 数据库名; 直接删除数据库
2. Drop database if exists 数据库名 ; 如果指定的数据库存在的情况下我才删除。
4. 修改数据库码表
alter database 数据库 character set 码表
DDL语句操作表
1. 创建表
格式:
create table 表名(
字段名1 数据类型,
字段名2 数据类型;
);
2. 查看表
1. Show tables; 显示所有的表
2. show create table 表名 ; 查看创建表的语句
3. desc 表名; 查看表结构
3. 删除表
1.Drop table 表名 ; 直接删除表
2.Drop table if exists 表名 ; 先判断表是否存在
4.修改表
1. Alter table 表名 add 字段名 数据类型; 添加一列
2. Alter table 表名 modify 列名 新的数据类型 修改列类型
3. Alter table 表名 change 旧列名 新列表 数据类型 改变列名
4. Alter table 表名 drop 列名; 删除列
5. Alter table 表名 rename to 新表名 ; 表名重命名
============================================================================
DML
DML语句主要用于操作表的数据增、删、改的。
1. 查看表数据
Select * from 表名;
2. 往表插入数据
方式一: 插入所有字段的数据
格式:
insert into 表名 values(数据1,数据2...);
例子 : insert into student values(110,'gouwa',10);
方式二:插入指定字段的数据
格式:
insert into 表名(字段名1,字段名2) values(数据1,数据2..)
例子: insert into student(id,name) values(220,'gousheng');
3. 删除数据
格式:
1. delete from 表名; 清空表数据(一条一条数据删除)
2. Truncate 表名 清空表数据(摧毁表结构达到目标)
3. Delete from 表名 where 条件;删除指定的数据
4. 修改数据
格式:
Update 表名 set 字段名 = 数据 where 条件。 修改表的数据
============================================================================
中文乱码问题的解决方案
登录mysql之后,在控制台输入: show variables like ‘%char%’(显示与字符相关的变量)
一劳永逸的方法:
修改mysql的my.ini文件即可。 my.ini里面有一个选项是: default_character_set=gbk.
修改完毕之后,需要重启mysql的服务才起作用。
============================================================================
DQL语句查询语言
DQL语句的作用:主要用于查询表中的数据。
1. 查询所有的学生:
SELECT * FROM students;
2. 只要查询学生姓名,语文
SELECT NAME,chinese FROM students;
3. 查询的时候使用别名:
SELECT NAME
AS 姓名 , chinese AS 语文 FROM students;(标准语法)
SELECT NAME 姓名 , chinese 语文 FROM students;(方言)
4. 查询一个公司里面的工作岗位。
--清除重复数据
SELECT
DISTINCT(job) FROM emp;
5.在所有学生分数上加10分特长分-
--查询的结果是可以运算的
SELECT NAME, chinese+10 语文 ,math+10 数学, english+10 英语 FROM students;
6.查询姓名为'张小明'的学生成绩
SELECT * FROM students WHERE NAME = '张小明';
7.查询英语成绩大于90分的同学
SELECT * FROM students WHERE english >90;
8. 查询总分大于200分的所有同学
SELECT NAME, (chinese+math+english) 总分 FROM students WHERE
(chinese+math+english)>200;
9. 查询数学分数为89或者90或者91的同学
方式一(
OR): SELECT * FROM students WHERE math=89 OR math=90 OR math=91;
方式二(
IN): SELECT * FROM students WHERE math IN (89,90,91);
方式一: SELECT * FROM students WHERE english>=80 AND english<=90;
方式二: SELECT * FROM students WHERE english
BETWEEN 80
AND 90;
11.查询所有姓'李'的学生成绩。
%可以匹配0个字符或多个字符。 %代表了任意的字符,而且可以匹配多个字符
SELECT * FROM students WHERE NAME LIKE '李%';
12.查询所有名为'李'字的学生成绩。
_ 代表任意的 一个字符。
SELECT * FROM students WHERE NAME LIKE '_%李%';
13.查询所有姓李的学生,并且姓名只有两个字。
SELECT * FROM students WHERE NAME LIKE '李_';
14.查询所有姓名中包含’李’字的学生成绩
SELECT * FROM students WHERE NAME
LIKE
'%李%';
15.查询所有姓'李'的学生成绩,但姓名必须是三个字符,
_表示1个字符
SELECT * FROM students WHERE NAME LIKE '李__';
16.对数学成绩排序(降序)后输出
ASC(升序,默认是升序)
DESC(降序)
SELECT * FROM students
ORDER BY math
DESC;
17.组合排序:第一参考数学,如果数学成绩一样根据语文排序
SELECT * FROM students ORDER BY math
DESC,chinese
DESC;
(组合排序)
18.对总分排序(降序)后输出
SELECT NAME ,(chinese + math+english) 总分 FROM students ORDER BY 总分 DESC;
19.对姓'李'的学生总分排序(降序)输出
SELECT NAME ,(chinese + math+english) 总分 FROM students WHERE NAME LIKE '李%'
ORDER BY 总分 DESC;
20.统计一个班级共有多少学生。
COUNT() 把所有的行数加起来。
SELECT COUNT(*) FROM students;
SELECT COUNT(IFNULL(math,0)) FROM students;
SELECT IFNULL(math,0) FROM students;
IFNULL 如果该字段是NULL,那么使用默认值取代。
21. 统计数学成绩大于80的学生有多少个
SELECT COUNT(id) FROM students WHERE math>=80;
22. 统计总分大于250的人数有多少人。
SELECT COUNT(*) FROM students WHERE (chinese+math+english)>=250;
23. 统计一个班级数学总成绩(SUM)
SELECT SUM(math) FROM students;
24. 统计一个班级语文、英语、数学各科的总成绩
SELECT SUM(chinese) 语文总分, SUM(math) 数学总分,SUM(english) 英语总分 FROM students;
25.统计一个班级语文、英语、数学的成绩总和
SELECT SUM(chinese+math+english) 总分 FROM students;
26.统计一个班级语文成绩平均分--
AVG
SELECT
AVG(chinese) FROM students;
27.求一个班级总分平均分
SELECT AVG(chinese+math+english) FROM students;
28. 求班级最高分和最低数学分数。
最小:MIN 最大:MAX
SELECT
MIN(math) FROM students;
SELECT
MAX(math) FROM students;
29. 统计工资大于15000的每个工作岗位人数。---
group by分组查询
SELECT job,COUNT(job) FROM emp WHERE sal>=15000 GROUP BY job;
sal>15000这个条件数据是分组之前就存在的数据还是分组之后才存在的数据: 之前。
30. 统计工资大于15000的每个工作岗位人数,且该工作岗位的人数大于等于3。
工作岗位的人数大于等于3,这个是分组前就存在的数据还是分组后存在的数据?分组之后。如果
是分组后才存在的数据,那么需要写在HAVING上。
SELECT job ,COUNT(job) FROM emp WHERE sal>=15000
GROUP BY job
HAVING
COUNT(job)>=3;
31. limit语句(
分页查询)
SELECT * FROM students
LIMIT 开始索引值,总数;
============================================================================
DCL 数据控制语言
创建用户:
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
CREATE USER 'username'@'%' IDENTIFIED BY 'password';
删除用户:
DROP USER 'username'@'host';
更改用户名称:
RENAME USER test to test_2;
设置与更改用户密码:
SET PASSWORD FOR 'username'@'host' = PASSWORD('newpassword');
如果是当前登陆用户用:SET PASSWORD = PASSWORD("newpassword");
查看当前用户:select user();
查看所有用户:select user,'localhost' from mysql.user;
为用户授权:
GRANT privileges ON databasename.tablename TO 'username'@'host'
如: grant all on liwei01.liwei01 TO 'liwei'@'localhost';
表名可以使用*号代替,表示所有的表
说明:
privileges:用户的操作权限,如SELECT,INSERT,UPDATE等,如果要授予所的权限则使用ALL
databasename:数据库名
tablename:表名
查看权限:
show grants for ‘username’@‘localhost’;
撤销用户权限:
REVOKE privilege ON databasename.tablename FROM 'username'@'host';
刷新权限:flush privileges;
============================================================================
MySQL数据库备份与还原
生成SQL脚本
mysqldump –u用户名 –p密码 数据库名>生成的脚本文件路径
![](https://i-blog.csdnimg.cn/blog_migrate/5de742845e6c8672d62e859d687127dc.png)
执行SQL脚本
SOURCE 路径
如:SOURCE C:\mydb1.sql
上面这种情况可能会已有的表冲突。
mysql –u用户名 –p密码 数据库<要执行脚本文件路径
如:mysql -uroot -p123 mydb1<c:\mydb1.sql
============================================================================
数据约束
主键约束
添加主键:
ALTER TABLE person ADD PRIMARY KEY(id);
删除主键:
ALTER TABLE person DROP PRIMARY KEY;
自增长约束
自增值是为了维护主键值(数据库生成主键值)
修改:
ALTER TABLE person MODIFY id INT AUTO_INCREMENT;
唯一约束
CREATE TABLE staff(
id INT
UNIQUE,
NAME VARCHAR(20),
gender CHAR(1)
);
外键约束
Alter table 表名 drop foreign key 外键的名称;
CONSTRAINT employee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id)
-- 外键名称 外键字段 参考表(主键字段)
外键注意事项:
当设置了外键后
1)添加数据时,先添加主表数据,再添加副表数据
2)修改数据时,先修改副表数据,再修改主表数据(先让副表没有主表的引用数据)
3)删除数据时,先删除副表数据,再删除主表数据(先让副表没有主表的引用数据)
修改:
Alter table 表名 add constraint 外键名称 foreign key(从表的字段) references 主表(主键)
级联操作
级联操作是外键的一个特征。
作用:通常情况下,设置了外键,操作顺序,先修改或删除副表数据,再修改或删除主表数据,但是开发者希望直接修改或删除主表数据,从而影响副表数据,这时就可以使用级联操作。
如:CONSTRAINT employee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id) ON UPDATE CASCADE ON DELETE CASCADE
-- 给外键添加级联修改和级联删除 on update cascade
============================================================================
数据库的三范式
三范式的作用: 数据库的三范式的作用是告诉大家以后在设计数据库的时候要遵守的一些准则,
第一范式: 一个表中的任意字段都是不可再分割的单元
第二范式: 不同业务含义字段的数据应该分离在不同表
第三范式: 一个表除主键之外的其他字段都应该与该事物有着直接的关系。
============================================================================
多表查询
笛卡尔积现象
如果一次查询多个表的时候,那么A表的每一条记录都会与B表的每一条记录组合成新的数据,这种现象我们称作为笛卡尔积。
消除笛卡尔积现象: 从表的外键列等于主表的主键列。
内连接查询
Select * from 表1 inner join 表2 on 清除笛卡尔积的条件 where 数据的筛选条件
左外连接
左外连接查询就是以左表为主,不管左表的数据是否满足条件,左表都会全部显示出来。
Select * from 表1 left outer join 表2 on 清除笛卡尔积条件 where 普通条件
右外连接
右外连接就是以右表为主,右表的数据不管是否满足条件,右表的数据全部显示。
Select * from 表1 right outer join 表2 on 清除笛卡尔积条件 where 普通条件
合并结果集(全外连接)
如:
SELECT * FROM emp e LEFT OUTER JOIN dept d ON e.deptId =d.id
UNION
SELECT * FROM emp e RIGHT OUTER JOIN dept d ON e.deptId =d.id ;
子查询
子查询就是指一个查询语句的结果被另外一个查询语句使用(查询语句中嵌套有其他的查询语句)
如:SELECT * FROM USER WHERE uid = (SELECT uid FROM orders WHERE createTime = '2015-12-30');