一、mysql服务启动/关闭:(它是只运行在我们后台的,看不见)
1.手动:(low)点击我的电脑–>管理–>服务–>找到mysql鼠标右键控制
2.(好点)cmd–>services.msc 打开服务窗口
3.(屌!)cmd(以管理员身份进入)–>net stop xxx(mysql)/net start xxx(mysql)
====================================================
二、登录:
mysql -u+账号 -p+密码
mysql -h+ip地址 -u账号 -p密码
mysql --host=ip地址 --user=账号 --password=密码
退出:
quit/exit
====================================================
三、mysql数据目录:
1.my.ini:配置文件
2.安装后在我们的计算机上会出现三个数据库(文件夹)(c:\ProgramData(隐藏文件夹)),每个数据库里有多个表(文件),表里存放的数据
====================================================
什么是SQL?
Structured Query Language,结构化查询语言,它是一个语言,是一个规则,是所有关系型数据库的规则,但每一种数据库在使用时会有一点的不同,但大体是一样,eg:“方言”
1.SQL不区分大小写,但是关键字建议大写;
2.注释:1.“-- ”后面得有个空格;或者“#”;或者/**/
DDL**
DDL:操作数据库、表:
对数据库操作:
查:
SHOW DATABASES:展示所有数据库;
SHOW CREATE DATABASE 数据库名称:查看指定的数据库如何创建和该数据库的字符集(编码utf-8啥的);
创建数据库:
增:(创建数据库):
CREATE DATABASE + 数据库名字;(如果创建个和已存在的数据库重名的,它会告诉你错误);
CREATE DATABASE IF NOT EXISTS +数据库名字;(如果没有这个名字的数据库就创建,否不创建)
CREATE DATABASE +数据库名 CHARACTER SET +指定编码(gbk……);
创建同时判断是否已经存在并且设置指定的编码
CREATE DATABASE IF NOT EXISTS +数据库名 CHARACTER SET 编码名
改:
ALTER DATABASE +数据库名 CHARACTER SET +编码(改编码
)
删:
DROP DATABASE IF EXISTS +数据库名;(这个操作非常危险,因为把数据库删了)
对表操作:
使用数据库:USE + 数据库名;
看当前使用的是哪个数据库:SELECT DATABASE();
查询:展示所有的表:SHOW TABLES;
看表中的内容:DESC + 表名;(description)
增加:
sql里的数据类型:整形:int;
浮点型:double(x,y);x:一共有几位数;y:小数点后保留几位;
时间:date、datetime、timestamp:
timestamp:这个一般用作添加时间啥的,如果不给它传值,它会默认把系统时间传进去(也就是和datetime的区别)
date:只能表示年月日,另两个可以表示年月日时分秒
字符串类型:varchar;
创建表(例子):
CREATE TABLE STUDENT(
AGE INT,
ID INT,
SCORE DOUBLE(4,1),
INSERT_TIME TIMESTAMP,
NAME VARCHAR(32),
BIRTHDAY DATE
);
//VARCHAR(x)需要传参数,参数是指定多少格字节的字符串
删除表:
(和删除数据库是一样的)
DROP TABLE 表名/DROP TABLE IF EXISTS 表名;
修改表:
1.修改表名:ALTER TABLE 原表名 RENAME TO 新表名;
2.修改表的编码:ALTER TABLE 表名 CHARATCTER SET 编码名;
3.在表中增加一列:ALTER TABLE 表名 ADD 列名 数据类型;
4.在表中删除一列:ALTER TABLE 表名 DROP 列名;
5.1修改列名/列的数据类型:ALTER TABLE 表名 CHANGE 列名 新列名 数据类型;
5.2还有一中只更改数据类型:ALTER TABLE 表名 MODIFY 列名 数据类型
(小技巧:复制表:CREATE TABLE 表名 LIKE 被复制的表名;(但是不复制数据,仅仅复制列名)))
DML**
DML:对表中的数据进行操作(增删改查)
1.添加数据:INSERT INTO 表名 (列名1,列名2,……) VALUES (数据1,数据2,……);
*注意事项:1.如果想要给表中所有列都赋值,那么可以省略列名那一个括号(但数据一定要写全);
2.字符串用单引号,双引号都可以;只有数字可以直接写上;
2.删除数据:1.DELETE FROM 表名 WHERE 条件(eg:ID=1……);
(这是指定条件,如果条件满足,那么删除,如果不写条件,那么它会把整个表中的数据都删除,
但如果想把表删除也不建议这么写,这么写的话,这个表中有几行数据就会执行几次,效率较慢
如果我们真的想删除表中所有数据一般用下面语句)
2.TRUNCATE TABLE 表名 -->作用:删除表,新建一个和删除表名字一样的表.
3.修改数据:
1.UPDATE 表名 SET 列名 = 相应值 WHERE 条件;
*注意:WHERE 后跟的就是条件,如果没有条件,那么就会把表中那一列所有数据都改了;(it's dangerous)
DQL**
DQL:查询数据
基础查询:
1.查询多个字段:
SELECT 字段(一个表的某个列)FROM 表名;(*表示一个表的所有列,
但一般我们都不这么写因为别人看着不舒服,都写上一眼就能看出来有什么字段);
2.去重复:
SELECT DISTINCT 字段 FROM 表名;
作用:显示一个表中的一个列的所有数据,如果有重复的数据,则该数据只显示一次;
3.计算列:
SELECT 字段1,字段2,…… FROM 表名;
作用:显示表中指定的列,而且,它可以将某列和某列相加/减
(eg:SELECT MATH,ENGLISH,MATH+ENGLISG FROM STU;表中没有math+english这列,但也可以这样操作)
*注意:任何数字和null相加,都等于null,所以在sql里有一个函数:IFNULL(可能会出现为null的字段,如果出现了这个null被替代成什么)
eg:IFNULL(MATH,0);
4.起别名:
AS + 起的别名 / 或者AS省略,只要与前面留一段空隙就行,别名加不加双引号都可以
条件查询:
1.大于等于……
SELECT 字段 FROM 表名 WHERE 条件(在sql里,等于就一个等于号,不等于也可以写成“<>”)
2.并、或
SELECT 字段 FROM 表名 WHERE 条件1 && 条件2……,
在sql里,并可以直接写成"and",如果在一个区间内,大于等于并且小于等于一个数,可以用BETWEEN AND
eg:SELECT 字段 FROM 表名 WHERE MATH BETWEEN 20 AND 30;
SELECT 字段 FROM 表名 WHERE 条件1 || 条件2……
同理,在sql里“或”也可以用“or”来表示,也有一种更简单的方法:
eg:SELECT 字段 FROM 表名 WHERE MATH IN (相应数字1,相应数字2);只要一个符合条件就显示,“或”嘛。
3.查询null
null不能用等于/不等于……的语句查询,需要用IS/IS NOT 来查询;
eg:SELECT 字段 FROM 表名 WHERE MATH IS/IS NOT NULL;
4.模糊查询:
SELECT * FROM 表名 WHERE NAME LIKE "指定字符";("_"表示一个字符/一个位置,"%"表示多个字符/不定个可以是零个)
eg:1.查询姓名是三个字的:SELECT * FROM 表名 WHERE NAME LIKE "___")(三个下划线)
2。查询姓名里带某个字的:SELECT * FROM 表名 WHERE NAME LIKE "%指定字%";
(这个查询用的应该是比较多的,名字中带有某个字的嘛)
单表查询:
排序查询:
ORDER BY 排序字段1 排序方法1,……(ASC 升序(默认,不写排序方法默认升序排列);DESC 降序)
说明,多个字段比意思是先比某两行前面的数据,前面的数据如果一样,比后面的数据
聚合函数:
就是指对一列进行查询:eg:平均分……
COUNT:数量;SUM:总和;AVG:平均分;MAX:最大值;MIN:最小值;
写法:SELECT 聚合函数(eg:COUNT(NAME/MATH……))
*注意:所有聚合函数的计算都是排除null的,所以要解决一下这个问题(ifnull来解决呗),
我们一般用这个COUNT函数都是用一列不可能为null的列来计算eg:id
SELECT COUNT(*) FROM 表名;(*代表所有嘛)这个表示只有某一行有一个不为空的数据,它就算一个
分组查询:
将某些数据分组,eg:性别……
写法:SELECT(分组字段,聚合函数(写个人的数据没有意义,因为这个是整体看的))FROM 表名 GROUP BY 分组字段(eg:SEX);
eg:SELECT SEX 性别,COUNT(ID) 总人数, AVG(MATH) "数学平均分", AVG(ENGLISH) "英语平均分" FROM STU GROUP BY SEX;
分组条件查询:WHERE用在GROUP BY 的前面,HAVING用在GROUP BY的后面
**重点:WHERE,HAVING的区别:
1.WHERE是先用聚合函数之前判断,不满足条件不参与分组,HAVING是聚合函数后进行判断,不满足条件不会呗查询出来(不显示)
2.WHERE不能用聚合函数进行判断,HAVING可以
eg:SELECT /*SEX "性别",*/COUNT(ID) 总人数, AVG(MATH) "数学平均分", AVG(ENGLISH) "英语平均分" FROM STU WHERE MATH >23 GROUP BY SEX HAVING 总人数 > 1;
(为了方便起见,我们一般都会给聚合函数起个别名,再HAVING使用时直接使用它的别名了)
分页查询:
(百度……的软件,当你查询数据时,记录往往都是分页的嘛(在查询结果的最下面),太多记录不能都放在一页里)
SELECT * FROM 表名 LIMIT 开始的索引,一页有几条记录/每页显示的条数;
**重点:开始的索引公式 =(当前的页数 - 1)* 一页有几条记录
LIMIT是mysql的“方言”,是mysql进行分页查询的方法
约束:就是让表更加的真实,eg:性别不能是不男不女吧。
1.NOT NULL:不能为空,这个不能为空相当于是对数据类型进行的约束,
所以想要改变,eg:让他可以为空,就用Alter TABLE 表名 MODIFY 列名 数据类型 就行。
1.1这条在创建表进行约束;
使用:eg:
CREATE TABLE STU {
AGE INT,
NAME VARCHAR(20) NOT NULL;
);
1.2在创建表时候进行约束;会删除就会更改呗
ALTER TABLE 表名 MODIFY 列名 数据类型 NOT NULL;
2.UNIQUE:唯一约束,也叫唯一索引
2.1创建表时添加约束和NOT NULL一样,在列的后面写UNIQUE即可,但删除不一样,写法:
ALTER TABLE 表名 DROP INDEX 列名;
*注意:在mysql里,收到唯一约束的列可以有多个null,null不算重复
2.2创建表后设置唯一约束:
ALTER TABLE 表名 MODIFY 字段 数据类型 UNIQUE;(前提你要保证现有的数据中不存在重复的数据,否则不会设置成功的)
3.primary key:主键约束(就是既不能为空,也不能重复)
3.1创建表时添加主键约束:就是在列名后写PRIMARY KEY这两个关键字
删除:ALTER TABLE 表名 DROP PRIMARY KEY,(为什么不用写列名呢?因为主键只有一个呗)
(这个删除操作,或者添加操作(用modify的操作)用CHANGE也完全可以,语法在上面DML)
3.2创建表后添加主键:ALTER TABLE 表名 MODIFY 列名 数据类型 PRIMARY KEY;
3.3自动增长:添加主键后增加数据时不能为null还不能重复,那录入时每一次都得看上一个的ID是多少,非常的不方便,所以有了"自动增长",AUTO_INCREMENT;
(这个自动增长,增长时它会查看上一条的数值,所以这个数只和上一条数据有关。比如这次录入一个5,然后你把它删了,再次添加数据时,
你在自动增长那列写了null(自动增长嘛),它的数据也会是6。多可以少不行:eg:下次录入应该是3,而你手动录入了10,那下一次自动增长就算11;
而如果下一次是10,而你这次录入个2,那么下一次自动增长会是3)
3.3.1使用:在创建表时直接在PRIMARY KEY的后面加上AUTO_INCREMENT
创建表后:ALTER TABLE 表名 MODIFY 列名 数据类型 AUTO_INCREMENT;
3.3.2删除:ALTER TABLE 表名 MODIFY 列名 数据类型;(这样是删除不了主键的,
但是可以删除自动增长)
*注意:1.这个自动增长的列必须是一个键,也可以不和主键连用,但这种情况很少
2.这个自动增长往往都是和主键一起连用的
4.外键约束:是表与表之间的操作
说明解释:
在现实生活中如果把所有的数据都放在一张表里是不太现实的,因为字段太多了。所以我们这么 做:
在一张表里加入某一列,这一列对应另一张表的某个列/某些列,这样我们看第一张表和第二张表的对照就可以达到一样的效果。
但这就又出现了一个问题,比如:我在第二张表中把一些数据删了,但第一张表中还有对应这些数据的人,那这些人的某些信息不就
看不到了嘛,所以我们要做的就是将这第一张表对应第二张表的列和第二张表联系起来,保证数据的正确性,也就我们今天要学的键。
4.1创建表时加外键约束:
CREATE TABLE EMPLOYEE(
NAME VARCHAR(20),
DEP_ID INT,
CONSTRAINT EMP_DEPA_FK FOREIGN KEY (DEP_ID) REFERENCES DEPARTMENT(DEP_NUM)
);
即:在所需要的列后加 CONSTRAINT 外键名(这个是自己起的名)FOREIGN KEY 该表要添加外键的列 REFERENCES 关联的另一张表表名 关联的另一张表表名的列(这一列一般是主键))
(这一列只要是唯一约束就行,但我们一般都是关联另一个表的主键;第一张表的列关联第二章表的列,第一张列叫子行 child row,第二张列叫父行,parent row)
4.2删除外键约束:
ALTER TABLE 表名 DREP FOREIGN KEY 外键名(就是创建时起的那个名);
4.3添加外键
ALTER TABLE 表名 ADD (后面就和4.1创建方式一样了)CONSTRAINT 外键名 FOREIGN KEY (添加外键的列) references 另一张表名 另一张表名的列;
(还是前提保证,表中不含不符合的数据)
4.4级联操作
添加了外键之后,如果只改其中一个它是不让的,很不方便,所以就有了这个操作,将他俩连在一起,一改全改。只需要在添加外键的后面跟加上ON UPDATE CASCADE/ON DELETE CASCADE;
ON UPDATE CASCADE:级联更新(一改全改);ON DELETE CASCADE:级联删除(一删全删)
这个级联操作有好处也有不好处,不好处不言而喻,全改全删,所以在实际操作中要谨慎使用
表的设计:一对多、多对一、多对多一对一、一对一
1.一对多/多对一:在多的一方建立外键,指向一的一方的主键。eg:员工和部门,一个员工对应一个部门,一个部门对应多个员工。
2.多对多:多对多的关系需要借助第三张表,这张表至少应有两个字段,都设成外键,分别指向多对多的两张表的主键即可。
3.一对一:在一方添加唯一、外键指向另一张表;在实际开发中这个用的非常少,而且真有这个需求我们把它直接做成一张表不就好了。