Ubuntu下安装mysql
apt update
sudo apt-get install mysql-server mysql-client
启动 service mysql start
停止 service mysql stop
重启 service mysql restart
查看mysql服务状态 service mysql status
允许远程连接
找到mysql配置文件并做如下修改:允许远程连接
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
刷新权限 FLUSH PRIVILEGES;
退出命令行 exit quit
进入mysql mysql -u root -p;
创建数据库
- 直接创建:create database 名称;(这样会使用mysql默认的字符集) create schema 名称;
- 通过字符集来创建: create database 名称 charset=utf8;
- 创建数据库前判断数据库是否存在: create database if not exists 名称;
查看数据库:show databases;
选择数据库:use 数据库名称;l
查看当前所在数据库:select database();
1
删除数据库:例如:drop database 数据库名称;
如果删除的数据库不存在,则会报错,的解决方:例如:drop database if exists 名称;
查看所有的字符集:show charset;
查看当前数据库编码格式: show variables like 'character_set_database';
添加数据库的utf8默认编码:alter database 数据库名 character set utf8;
查询MySQL中支持的存储引擎 show engines;
查看数据库的默认的搜索引擎:show variables like ' default_storage_engine ';
修改默认存储引擎 set default_storage_engine=innodb
创建表:create tables 表的名字;列表的名字和定义用逗号隔开;(userid int not null auto_increment),(name char(10) not null);
查看表:show tables;
查看表的详细信息:show create table 名称;
查看表的结构:desc 数据表名;
查看某一列的的结构: desc 数据表名 列名; 例如: desc oppo name;
创建表时如果一个表存在的时候还创建,应在表名后给出 if not exists 检查表是否存在,仅在表名不存在的时候创建它;
自增长:auto_increment ;
主键:primary key;
设置默认值:default
例如:phone varchar(11) not null default '12345678909';
更新表时:alter table ;
添加新字段(列):例如:alter table 表名 add age int default 10;
修改字段的值: alter table 表名 modify 字段 修改后的类型;
修改字段名(列):alter table 表名 change 旧字段名 新字段名 数据类型 约束 属性;
在不改变旧字段名的情况下修改(类型,复制);
例如:alte table 表名 change modify 字段名,匹配;类型 约束 属性;
删除字段(列):例如:alter table 表名 drop phone ;
修改表名:例如:alter table 旧表名 rename as 新表名;
修改表:alter table 表名 charset=.......;
重名表名:例如:rename table 旧表名 To 新表名;
删除表:例如:drop table 表名;
删除一个不存在的表会报错,如果不报错如下;
例如:drop table if exists 数据表名;
复制表:例如:create table if not exists 原名字 like 复制后的新名字;
crud 对表的增删改查
增 insert into (注意:我们插入的数据顺序必须要跟列对应)
1.完全插入:例如:insert into 表名 values( 108401,' 小甜甜 ', 20,1,' 1245678999 ');
2.选择插入:例如:insert into 表名(userid,name,age) values( 10000,' 花花 ',19);
3.多行插入:例如:insert into 表名(userid,name) values(19999,' 葡萄 '),(18888,‘ 辣椒 ’);
查看已经插入的数据 select * from 表名 (表示所有);
将一个表复制到另一个表中 insert into 新表 (列名,列名...) select 列名,列名... from 原表 ;
修改 跟新 update
1.跟新单个字段(列) update 表名 set name = '娜娜' , age = 19 where id = 12345;
2.跟新多行 : update 表名 set name = ' 娜娜 ' ;(修改表中某一列的全部值 尽量不要去做)
3.跟新多个字段(列) update 表名 set name = ' 娜娜 ', age = 19 where id = 18888 ;
删除数据 delete
删除特定的一行:例如:delete from 表名 where id = 10010 ;
删除所有行:例如:delete from 表名 (不能轻易做);
查询
查询所有 select * from 表名 ;
查询某一个 select * from 表名 where id = 13333 ;
查询年龄这个列 select age from 表名 where id = 19999;
使用限定的方式查找,不进入数据库就可以查询到表的信息
select * from 数据库名.表名;
使用 distinct 去重,返回不重复的列的值
select distinct age from 表名;
把一个表插入到另一个表中:例如:insert into 表 (列名,列名...) select 列名,列名... from 表
数据库的查询 where(过滤)
查询一行 select * from 表名 where age = 6 ;
select 字段名 from 表名 WHERE 条件;
where 条件查询和运算符
= 等于 select * from 表名 where age = 6 ;
<> 不等于, != 不等于,
< 小于, <= 小于等于, > 大于, >= 大于等于,
between ... and 在两者之间(包含边界值);(左右闭合)
例如:select name ,age from 表名 where age between 5 and 30 ;
is null 判断某一列的数据,如果包含null ,则返回记录;
例如:select * from 表名 where phone is null ;
and 链接查询条件,查询的数据要全部满足
例如:select name from 表名 where userid>=18004 and age>99;
or 链接查询条件,查询的数据只要满足其中一个即可
例如:select name from 表名 where userid>=18004 or age>90;
in 操作符 (相当于 or ) in (条件1,条件2,条件3);
SELECT name FROM customers WHERE userid IN(10011,10013);
NOT操作符
例如:> select name from 表名 where userid not in(10011,10013);
排序 order by
升序(asc): 例如:select * from 表名 order by age(列)(默认的是升序的);
降序(desc): 例如:select * from 表名 order by age(列)desc;
多个列做排序:例如:select * from 表名 order by 列(asc|desc),列(asc|desc);
聚合函数
count() | count(1) :计算所有行;
avg() :计算列的平均值;
max() :计算列的最大值;
min() :计算列的最小值;
sum() :求和 ,计算列的总和;
通配符
% :匹配任意字符,任意次数;
_ : 匹配任意字符,必须有仅且有一次;
一般和ike配合使用
select 列 ,列 from 表名 where 列 like ‘赵%’;
select 列 ,列 from 表名 where 列 like ‘赵%’;
正则
. 匹配任意1个字符(除了\n)
[ ] 匹配[ ]中列举的字符
\d 匹配数字,即0-9
\D 匹配非数字,即不是数字
\s 匹配空白,即 空格,tab键
\S 匹配非空白
\w 匹配单词字符,即a-z、A-Z、0-9、_
\W 匹配非单词字符
* 匹配前一个字符出现0次或者无限次,即可有可无
+ 匹配前一个字符出现1次或者无限次,即至少有1次
? 匹配前一个字符出现1次或者0次,即要么有1次,要么没有
{m} 匹配前一个字符出现m次
{m,n} 匹配前一个字符出现从m到n次,最少m次,最大n次
非贪婪模式匹配:尽可能少的匹配
转义符号 \
^ 匹配字符串以...开头
$ 匹配字符串以...结尾
| 匹配左右任意一个表达式
(ab) 将括号中字符作为一个分组
\num 引用分组num匹配到的字符串
(?P<name>) 分组起别名
(?P=name) 引用别名为name分组匹配到的字符串
python re 模块
complie: 生成一个正则匹配规则对象。
match:丛起始位置匹配,单次匹配,如果匹配不成功直接返回none,如果匹配成功就立即返回,
,取值使用group();
search:从头开始匹配,在整个字符串中查询,只要符合规则就立即返回,
单词匹配,如果不符合返回NONE ;
sub:字符串替换;
split:分割字符串,返回列表;
findall:在整个串中,返回所有符合规则的结果,是一个列表;
finditer:跟findall功能一样,都是匹配出所有符合正则规则的结果,返回结果有区别,返回的是一个可迭代对象;
r:原始字符串;
\:转义符;
分组 group by
单单只是用分组没有意义;
分组跟聚合函数的使用,统计每一个分组下有多少人(有多少条记录)
SELECT count() as total,age FROM studentinfo GROUP BY age;
统计分组的信息
SELECT count(), avg(age),min(age),sum(age),gender FROM studentinfo GROUP BY gendeou
group by 与 group_concat(列)(表示分组之后)
group_concat(字段名)可以作为一个输出字段来使用,
表示分组之后,根据分组结果,使用group_concat()来放置每一组的某字段的值的集合
SELECT gender,group_concat(student_name),group_concat(age) FROM studentinfo GROUP BY gender;
group by + with rollup (统计总数)
在最后新增一行,来记录当前列里所有记录的总和
SELECT gender,count() FROM studentinfo GROUP BY gender with rollup;
having过滤分组,
每个分组下的记录(行)大于2,才返回
SELECT count(),age FROM studentinfo GROUP BY age HAVING count() >2;
SELECT count(),age,gender FROM studentinfo GROUP BY age,gender HAVING gender =1 ;
跟order by 配合使用
SELECT count(),age,gender FROM studentinfo GROUP BY age,gender HAVING gender=1
ORDER BY age DESC;
having后跟多条件筛选分组
SELECT count(),age,gender FROM studentinfo GROUP BY age,gender HAVING gender=1
AND age > 67 ORDER BY age DESC;
限定查询 limit
1.如果LIMIT 后面只跟了一个数字,表示限制返回多少条,并且从第一条开始。
SELECT * FROM studentinfo LIMIT 6; => SELECT * FROM studentinfo LIMIT 0,6;
2.如果LIMIT 后面只跟了两个数字,第一个数字表示偏移量(不包含当前数字对应的这一行),
后一个数字表示限制返回多少条。
SELECT * FROM studentinfo LIMIT 6,6;
从第6条开始查询,返回6条结果。不包含第六条。返回(7条-12条)
select * from 表名 limit 7,12;
我们如何去实现一个分页功能,输入对应的页码m,每一页返回20条数据,
SELECT * FROM studentinfo LIMIT (m-1)*20,20
取年龄最大的
SELECT * FROM studentinfo ORDER BY age DESC LIMIT 1;
取年龄最小的
SELECT * FROM studentinfo ORDER BY age LIMIT 1;
限定条件返回结果(LIMIT)
SELECT count(*),age,gender FROM studentinfo GROUP BY age,gender HAVING gender=1 ORDER BY
age DESC LIMIT 2,2;
查询语句的顺序:
SELECT 列,列 FROM 表名 WHERE 条件 GROUP BY 列,列 HAVING 条件 ORDER BY 列
(ASC|DESC) LIMIT start,count;
回顾
关于自增的扩展:
可以设置设置auto_increment一个起始值
ALTER TABLE 表明 AUTO_INCREMENT=180460
改变自增的步长
1.会话级别:
show session variables like 'auto_inc%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| auto_increment_increment | 1 |
| auto_increment_offset | 1 |
+--------------------------+-------+
修改步长:
SET SESSION auto_increment_increment=2(设置步长的值)
2.基于全局的设置:
show global variables like 'auto_inc%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| auto_increment_increment | 1 |
| auto_increment_offset | 1 |
+--------------------------+-------+
修改步长:
SET global auto_increment_increment=2(设置步长的值)
总结:
一个表里面只能有一个自增,并且一般都会设置主键为自增,
不然会报错:
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
创建计算字段
创建的计算字段原本并不存在我们的表里面。我们通过mysql的函数或者算术运算得到一个结果,
我们把这个结果起一个别名,这个字段就是我们创建的计算字段。
加密函数
1.PASSWORD('') 2.MD5('')
创建计算字段
1.IF(x1,v1,v2) : x1:表示条件,如果满足返回v1,否则返回v2
2.IFNULL(v1,v2) :if v1 not NUll,返回v1,否则返回v2
3.CASE WHEN 条件 THEN 结果1 ELSE 结果2 END:当遇到某种条件,
当WHEN后面的条件满足,返回THEN后面的结果1,否则返回结果2.
还有数字函数、字符串函数、日期、时间函数
三范式 、E-R
三范式
1NF:列不可再分(尽量细的去拆分每一列)
2NF:1.一个表必须要有一个主键(这个主键可以由单个列,或者多个列组成)
2.非主键的列,必须完全依赖于主键,而不是及部分依赖于键
3NF:在第二范式的基础上,不能存在传递依赖,非主键的列,必须直接依赖于主键,而不能存在传递依赖的关系。
E-R模型
E:Entry 表示实体,其实就是根据某一个事物的体征,添加描述信息,我们将这些描述信息添加
在一个表(table)里面,那么这个表就相当于一个实体。
R:Relationship 关系,在这里其实就是指的表与表之间的关系
一对一:个人信息与身份证的信息例子;
一对多:班级与学生的例子;
多对多:很多学生选课的例子;
一对一:个人信息与身份证
个人信息表
create table userinfo(
id int auto_increment,
name varchar(10) not null,
idcard int not null,
primary key(id),
#外键:
CONSTRAINT FK_IDCARD(起个名字) FOREIGN KEY(idcard) REFERENCES IDENTIFITY(id)
);
身身份证表ID
CREATE TABLE IDENTIFITY(
id int auto_increment,
id_num varchar(50) not null,
primary key(id)
);
一对多:班级与学生
学生表
CREATE TABLE studnets(
stu_id int auto_increment,
stu_name varchar(20) not null,
#班级
primary key(stu_id)
);
班级表
CREATE TABLE grade(
cls_id int auto_increment,
cls_name varchar(20) not null,
cls_desc varchar(255) not null,
cls_student_num int default 0,
primary key(cls_id)
);
多对多:选课
学生表
CREATE TABLE studnets(
stu_id int auto_increment,
stu_name varchar(20) not null,
#班级
primary key(stu_id)
);
课程
CREATE TABLE courses(
cour_id int auto_increment,
cour_name varchar(20) not null,
primary key(cour_id)
)
如何设置外键?
1.首先要找表与表之间的关系。
2.班级表(id,name,主键为id)
3.学生表(id,name,主键id,clsid(外键)->班级表中的班级的主键)
创建学生表必须要有班级表
创建班级表
CREATE TABLE classes(
id int auto_increment,
name varchar(20) not null,
primary key(id)
)engine = innodb default charset=utf8
CREATE TABLE students(
id int auto_increment,
name varchar(20) not null,
clsid int,
primary key(id),
constraint FK_CLSID foreign key(clsid) references classes(id)
);
删除外键
ALTER TABLE students drop foreign key FK_CLSID;
添加外键
ALTER TABLE student ADD constraint FK_CLSID foreign key(clsid) references classes(id);
7]