---恢复内容开始---

mysql是一个数据库,太多的也不想说了,什么公司的什么年代创建的,跟我没关系,会用就完了,怎么安装自行百度吧。

1初识mysql语句

操作文件夹(库)

create database db1 charset utf8;

查看当前创建的数据库;show create database db1;

查看所有的数据库;show databases;

alter database db1  charset gbk;

drop database db1;

操作文件(表)

切换文件夹;(进入文件夹)use db1;

查看当前所在的文件夹;select database();

create table t1(id int,name char);

查看当前的这张t1表;show create table t1;

查看所有的表;show tables;

查看表的详细信息;desc t1;

modify修改的意思; alter table t1 modify name char(6);

改变name为答谢的NAME;alter table t1 change name NAME char(7);

删除表;drop table t1;

操作文件内容(记录)

插入一条数据,规定id,name数据

insert t1(id,name) valuse(1,‘名字’),(2,“名字”);

 

select id from db1。t1;

select id,name from db1.t1;

select * from db1。t1;

update db1.t1 set name=“新名字”;

update db1.t1 set name=‘新名字’ where id = 2;

delete from t1;

delect from t1 where id = 2;

2库的操作

1创建数据库

create database 数据库名 charset utf8;

数据库命名规则:基本上跟python或者js的命名规则一样

可以由字母,数字,下划线,@,#,¥,

区分大小写

唯一性

不能使用关键字 create select

不能单独使用数字

最长128位

 

2数据库相关操作

查看数据库;show databases;

查看当前库;show create database db1;

查看所在的库;select database();

选择数据库;use 数据库名

删除数据库;drop database 数据库名;

修改数据库;alter database db1 charset utf8;

3表的操作

1,创建数据库

create database db2 charset utf8;

2,使用数据库

use db2;

3,创建表

create table 表名(字段名1 类型[(宽度)约束条件],

。。。。

);

create table a1(

  id int,

  name varchar(50),

  age int(3)

);

4,插入表的记录

insert into a1 values

(1,‘名字’,18),

。。。

5,查询表的数据和结构

(1)查询a1表中的存储数据

select * from a1;

(2)查询a1表的结构

desc a1;

(3)查看表的详细结构

show create table a1\G;

6,复制表

(1)新创建一个数据库db3

create database db3 charset utf8;

(2)使用db3

use db3;

(3)复制db2.a1的表结构和记录

复制表的操作(即复制了表结构,又复制了记录)

create table b1 select * from db2.a1;

4数据类型

mysql常用的数据类型包括

1,数字:

整数:tinyint int bigint

小数:

  float:在位数比较短的情况下不精准

  double:在位数比较长的情况下不精准

  decimal:(如果用小数,推荐使用decimal)

    精准

    内部原理是以字符串形式去存

2,字符串:

char(10):简单粗暴,浪费空间,存取速度快

    root存成root000000

varchar:jingz,节省空间,存取速度慢

sql优化:创建表时,定长的类型往前放,变长的往后放

            性别      地址,或详细信息

255个字符,超了就把文件路径存放到数据库中。

  比如图片,视频等找一个文件服务器,数据库中只存路径或url。

3,时间类型:

最常用:datetime

4,枚举类型与集合类型

enum和set

整数类型:tinyint smallint mediumlnt int bigint

作用存储年龄,等级,id,各种号码等

========================================
        tinyint[(m)] [unsigned] [zerofill]

            小整数,数据类型用于保存一些范围的整数数值范围:
            有符号:
                -128 ~ 127
            无符号:
~ 255

            PS: MySQL中无布尔值,使用tinyint(1)构造。



========================================
        int[(m)][unsigned][zerofill]

            整数,数据类型用于保存一些范围的整数数值范围:
            有符号:
                    -2147483648 ~ 2147483647
            无符号:
~ 4294967295



========================================
        bigint[(m)][unsigned][zerofill]
            大整数,数据类型用于保存一些范围的整数数值范围:
            有符号:
                    -9223372036854775808 ~ 9223372036854775807
            无符号:
 ~  18446744073709551615

以上重点在于有符号,可以有负数

验证1:有符号和无符号tinyint

============有符号tinyint==============
# 创建数据库db4
create database db4 charset utf8;

# 切换到当前db4数据库
mysql> use db4;

# 创建t1 规定x字段为tinyint数据类型(默认是有符号的)
mysql> create table t1(x tinyint);

# 验证,插入-1这个数
mysql>   insert into t1 values(-1);

# 查询 表记录,查询成功(证明默认是有符号类型)
mysql> select * from t1;
+------+
| x    |
+------+
| -1 |
+------+

#执行如下操作,会发现报错。因为有符号范围在(-128,127)
mysql>   insert into t1 values(-129),(128);
ERROR 1264 (22003): Out of range value for column 'x' at row 1


============无符号tinyint==============
# 创建表时定义记录的字符为无符号类型(0,255) ,使用unsigned
mysql> create table t2(x tinyint unsigned);

# 报错,超出范围
mysql>   insert into t2 values(-129);
ERROR 1264 (22003): Out of range value for column 'x' at row 1

# 插入成功
mysql>   insert into t2 values(255);
Query OK, 1 row affected (0.00 sec)

以上重点在于带符号的有负数,无符号的不带负数,存储数据一样多,也就是不带符号的正数存的多

验证2:int类型后面的存储是显示宽度,而不是存储宽度

mysql> create table t3(id int(1) unsigned);

#插入255555记录也是可以的
mysql> insert into t3 values(255555);

mysql> select * from t3;
+--------+
| id     |
+--------+
| 255555 |
+--------+
ps:以上操作还不能够验证,再来一张表验证用zerofill 用0填充

# zerofill 用0填充
mysql> create table t4(id int(5) unsigned zerofill);


mysql> insert into t4 value(1);
Query OK, 1 row affected (0.00 sec)

#插入的记录是1,但是显示的宽度是00001
mysql> select * from t4;
+-------+
| id    |
+-------+
| 00001 |
+-------+
row in set (0.00 sec)

以上重点是存在数据库中的和看到的不一样,数据库中会默认加0

浮点型

定点数类型:dec等同于decimal

浮点类型:float double

作用:存储薪资、身高、体重等

-------------------------FLOAT-------------------
FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
#参数解释:单精度浮点数(非准确小数值),M是全长,D是小数点后个数。M最大值为255,D最大值为30

#有符号:
           -3.402823466E+38 to -1.175494351E-38,
           1.175494351E-38 to 3.402823466E+38

#无符号:
           1.175494351E-38 to 3.402823466E+38
#精确度: 
           **** 随着小数的增多,精度变得不准确 ****


 -------------------------DOUBLE-----------------------
DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]

#参数解释: 双精度浮点数(非准确小数值),M是全长,D是小数点后个数。M最大值为255,D最大值为30

#有符号:
           -1.7976931348623157E+308 to -2.2250738585072014E-308
           2.2250738585072014E-308 to 1.7976931348623157E+308

#无符号:
           2.2250738585072014E-308 to 1.7976931348623157E+308

#精确度:
           ****随着小数的增多,精度比float要高,但也会变得不准确 ****

======================================
--------------------DECIMAL------------------------
decimal[(m[,d])] [unsigned] [zerofill]

#参数解释:准确的小数值,M是整数部分总个数(负号不算),D是小数点后个数。 M最大值为65,D最大值为30。


#精确度:
           **** 随着小数的增多,精度始终准确 ****
           对于精确数值计算时需要用此类型
           decaimal能够存储精确值的原因在于其内部按照字符串存储。

以上重点就是说越长越不准确

日期类型

date time datetime timestamp year

作用:存储用户注册时间,文章发布时间,员工入职时间,出生日期等

语法:
        YEAR
            YYYY(1901/2155)

        DATE
            YYYY-MM-DD(1000-01-01/9999-12-31)

        TIME
            HH:MM:SS('-838:59:59'/'838:59:59')

        DATETIME

            YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59    Y)

        TIMESTAMP

            YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某时)

枚举和集合

枚举enum 单选 只能在给定的范围内选一个值,如性别 

集合set 多选 在给定的范围内可以选择一个或一个以上的值(爱好1,爱好2.。。。)

mysql> create table consumer(
    -> id int,
    -> name varchar(50),
    -> sex enum('male','female','other'),
    -> level enum('vip1','vip2','vip3','vip4'),#在指定范围内,多选一
    -> fav set('play','music','read','study') #在指定范围内,多选多
    -> );
Query OK, 0 rows affected (0.03 sec)


mysql> insert into consumer values
    -> (1,'赵云','male','vip2','read,study'),
    -> (2,'赵云2','other','vip4','play');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from consumer;
+------+---------+-------+-------+------------+
| id   | name    | sex   | level | fav        |
+------+---------+-------+-------+------------+
|    1 | 赵云    | male  | vip2  | read,study |
|    2 | 赵云2   | other | vip4  | play       |
+------+---------+-------+-------+------------+
rows in set (0.00 sec)

5完整性约束

主要有这几种

标识该字段为该表的主键,可以唯一的标识记录 ;primary key(pk) 

标识该字段位该表的外键 ;foreign key(fk)

not null ;标识该字段不能为空

unique key(uk);标识该字段的值是唯一的

auto——increment ; 标识该字段的值自动增长(整数类型,而且为主键)

default ; 为该字段设置默认值

 

unsigned 无符号

zerofill 使用0填充

 

#1. 是否允许为空,默认NULL,可设置NOT NULL,字段不允许为空,必须赋值
#2. 字段是否有默认值,缺少的默认值是NULL,如果插入记录时不给字段赋值,此字段使用默认值
sex enum('male','female') not null default 'male'

#必须为正值(无符号) 不允许为空 默认是20
age int unsigned NOT NULL default 20 
# 3. 是否是key
主键 primary key
外键 foreign key
索引 (index,unique...)

 

not null 与 default

是否可空,null表示空,非字符串

not null   不可以   null  可以

默认值,创建列时可以指定默认值,当插入数据时如果未主动设置,则自动添加默认值

create table tb1(

  nid int not null defalut 2,

  num int not null

);

unique不同的,mysql中称为单列唯一

create table departm(

  id int unique,                 建表的时候就写里面

  name char(10) unique         

);

联合唯一,只要两列记录,有一列不同,既符合联合唯一的约束

create table services(

  id int,

  ip char

  port int

  unique(id)

  unique(IP,port)

);

primary key一般写在id里 唯一且不为空

auto_increm约束的字段为自动增长,约束的字段必须同时被key约束

foreign key 让两张表有关联

6外键的变种 三种关系

如何找出两张表之间的关系

因为有了foreign key的约束,使得两张表形成了三种关系

一对多,多对多,多对一

找出两张表的关系

 

分析步骤:
#1、先站在左表的角度去找
是否左表的多条记录可以对应右表的一条记录,如果是,则证明左表的一个字段foreign key 右表一个字段(通常是id)

#2、再站在右表的角度去找
是否右表的多条记录可以对应左表的一条记录,如果是,则证明右表的一个字段foreign key 左表一个字段(通常是id)

#3、总结:
#多对一:
如果只有步骤1成立,则是左表多对一右表
如果只有步骤2成立,则是右表多对一左表

#多对多
如果步骤1和2同时成立,则证明这两张表时一个双向的多对一,即多对多,需要定义一个这两张表的关系表来专门存放二者的关系

#一对一:
如果1和2都不成立,而是左表的一条记录唯一对应右表的一条记录,反之亦然。这种情况很简单,就是在左表foreign key右表的基础上,将左表的外键字段设置成unique即可

 

7数据的增删改查

插入数据 insert

更新数据 update

删除数据 delete

插入数据

一、插入数据 INSERT
1. 插入完整数据(顺序插入)
    语法一:
    INSERT INTO 表名(字段1,字段2,字段3…字段n) VALUES(值1,值2,值3…值n);

    语法二:
    INSERT INTO 表名 VALUES (值1,值2,值3…值n);

2. 指定字段插入数据
    语法:
    INSERT INTO 表名(字段1,字段2,字段3…) VALUES (值1,值2,值3…);

3. 插入多条记录
    语法:
    INSERT INTO 表名 VALUES
        (值1,值2,值3…值n),
        (值1,值2,值3…值n),
        (值1,值2,值3…值n);

 4. 插入查询结果
    语法:
    INSERT INTO 表名(字段1,字段2,字段3…字段n) 
                    SELECT (字段1,字段2,字段3…字段n) FROM 表2
                    WHERE …;

二、更新数据UPDATE
语法:
    UPDATE 表名 SET
        字段1=值1,
        字段2=值2,
        WHERE CONDITION;

示例:
    UPDATE mysql.user SET password=password(‘123’) 
        where user=’root’ and host=’localhost’;
三、删除数据DELETE
语法:
    DELETE FROM 表名 
        WHERE CONITION;

示例:
    DELETE FROM mysql.user 
        WHERE password=’’;

查又分为单表查询和多表查询

一、单表查询的语法
   SELECT 字段1,字段2... FROM 表名
                  WHERE 条件
                  GROUP BY field
                  HAVING 筛选
                  ORDER BY field
                  LIMIT 限制条数
二、关键字的执行优先级(重点)

重点中的重点:关键字的执行优先级
from
where
group by
having
select
distinct
order by
limit

1.找到表:from

2.拿着where指定的约束条件,去文件/表中取出一条条记录

3.将取出的一条条记录进行分组group by,如果没有group by,则整体作为一组

4.将分组的结果进行having过滤

5.执行select

6.去重

7.将结果按条件排序:order by

8.限制结果的显示条数

(1)where约束

where子句中可以使用
1.比较运算符:>、<、>=、<=、<>、!=
2.between 80 and 100 :值在80到100之间
3.in(10,20,30)值是10或20或30
4.like 'xiaomagepattern': pattern可以是%或者_。%小时任意多字符,_表示一个字符
5.逻辑运算符:在多个条件直接可以使用逻辑运算符 and or not

关键字like模糊查询   像

select * from 表 where 字段 like ‘jin%’;只要该字段以jin开头不管后面什么,都拿出来

通配符‘_‘  

select * from 表 where 字段 like ‘ale_’;以ale开头后面只有一位的

(2)group by 分组查询

#1、首先明确一点:分组发生在where之后,即分组是基于where之后得到的记录而进行的

#2、分组指的是:将所有记录按照某个相同字段进行归类,比如针对员工信息表的职位分组,或者按照性别进行分组等

#3、为何要分组呢?
    取每个部门的最高工资
    取每个部门的员工数
    取男人数和女人数

小窍门:‘每’这个字后面的字段,就是我们分组的依据

#4、大前提:
    可以按照任意字段分组,但是分组完毕后,比如group by post,只能查看post字段,如果想查看组内信息,需要借助于聚合函数

继续验证通过group by分组之后,只能查看当前字段,如果想查看组内信息,需要借助于聚合函数

 select * from emp group by post;# 报错
 select post from employee group by post;

(3)聚合函数

max()求最大值     ------min

avg()求平均值

sum()求和

count()求总个数

#强调:聚合函数聚合的是组的内容,若是没有分组,则默认一组
# 每个部门有多少个员工
select post,count(id) from employee group by post;
# 每个部门的最高薪水
select post,max(salary) from employee group by post;
# 每个部门的最低薪水
select post,min(salary) from employee group by post;
# 每个部门的平均薪水
select post,avg(salary) from employee group by post;

(4)having过滤

HAVING与WHERE不一样的地方在于

#!!!执行优先级从高到低:where > group by > having 
#1. Where 发生在分组group by之前,因而Where中可以有任意字段,但是绝对不能使用聚合函数。

#2. Having发生在分组group by之后,因而Having中可以使用分组的字段,无法直接取到其他字段,可以使用聚合函数

以上重点就是having更精确

(5)limit限制查询的记录数:

示例:
    SELECT * FROM employee ORDER BY salary DESC 
     LIMIT 3;                    #默认初始位置为0 

    SELECT * FROM employee ORDER BY salary DESC
        LIMIT 0,5; #从第0开始,即先查询出第一条,然后包含这一条在内往后查5条

    SELECT * FROM employee ORDER BY salary DESC
        LIMIT 5,5; #从第5开始,即先查询出第6条,然后包含这一条在内往后查5条

desc倒序排序 从大到小

acs正序排序 从小到大

多表查询

多表连接查询

1,多表连接查询

语法

SELECT 字段列表
    FROM 表1 INNER|LEFT|RIGHT JOIN 表2
    ON 表1.字段 = 表2.字段;

连接所有

先写个左连接中间加个union all 再写个右连接

2,符合条件查询

select employee.id,employee.name,employee.age,department.name from employee,department
    where employee.dep_id = department.id
    and age > 25
    order by age asc;

3,子查询

子查询是将一个查询语句嵌套在另一个查询语句中。

内层查询语句的查询结果,可以为外层查询语句提供查询条件。

子查询中可以包含in,not in,any,all,exists,not exists等关键字

可以包含比较运算符=,!=,>,<等