Mysql的基础学习(上)

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: Mysql的基础学习

MySQL


概念

   数据: data
   数据库: DB
   数据库管理系统:DBMS
   数据库系统:DBS
   MySQL:数据库  
   mysql:客户端命令(用来连接服务或发送sql指令)
   SQL:结构化查询语言 ,其中MySQL支持这个。
   SQL语言分为4个部分:DDL(定义)、DML(操作)、DQL(查询)、DCL(控制)
   MySQL->库->表->数据
   SQL语句中的快捷键
   \G 格式化输出(文本式,竖立显示)
   \s 查看服务器端信息
   \c 结束命令输入操作
   \q 退出当前sql命令行模式
   \h 查看帮助

授权

格式:grant 允许操作 on 库名.表名 to 账号@来源 identified by '密码';
    --实例:创建zhangsan账号,密码123,授权lamp61库下所有表的增/删/改/查数据,来源地不限
    mysql> grant select,insert,update,delete on lamp61.* to zhangsan@'%' identified by '123';
    mysql> grant all on *.* to zhangsan@'%' identified by '123';
    Query OK, 0 rows affected (0.00 sec)

连接数据库

常用   mysql -u 用户名 -p密码  
mysql -h 主机名 -u 用户名  -p密码  库名
   C:\>mysql  --采用匿名账号和密码登陆本机服务
   C:\>mysql -h localhost -u root -proot   --采用root账号和root密码登陆本机服务
   C:\>mysql -u root -p   --推荐方式默认登陆本机
     Enter password: ****
   C:\>mysql -u root -p lamp61  --直接进入lamp61数据库的方式登陆

数据类型和运算符

MySQL的数据类型分为四大类:数值类型、字串类型、日期类型、NULL。
    5.1 数值类型:
        *tinyint(1字节) 0~255  -128~127
        smallint(2字节)
        mediumint(3字节)
        *int(4字节)
        bigint(8字节)
        *float(4字节)   float(6,2)
        *double(8字节)  
        decimal(自定义)字串形数值
     5.2 字串类型
        普通字串
        *char  定长字串      char(8)  
        *varchar 可变字串 varchar(8)
        二进制类型
        tinyblob
        blob
        mediumblob
        longblob
        文本类型
        tinytext
        *text      常用于<textarea></textarea>
        mediumtext
        longtext
        *enum枚举
        set集合
    5.3 时间和日期类型:
        date  年月日
        time  时分秒
        datetime 年月日时分秒
        timestamp 时间戳
        year 年
    5.4 NULL值
        NULL意味着“没有值”或“未知值”
        可以测试某个值是否为NULL
        不能对NULL值进行算术计算
        对NULL值进行算术运算,其结果还是NULL
        0或NULL都意味着假,其余值都意味着真
    MySQL的运算符:
        算术运算符:+ - * / % 
        比较运算符:= > < >= <= <> != 
        数据库特有的比较:in,not in, is null,is not null,like, between and 
        逻辑运算符:and or not

表的字段约束

!!! 有先后顺序的关系
        unsigned 无符号(正数)
        zerofill 前导零填充
        auto_increment  自增
        default 默认值
        not null  非空
        PRIMARY KEY 主键 
(非null并不重复) (包括非空,写主见就不用写非空)
        unique 唯一性   (可以为null但不重复)
        index 常规索引  

建表格式

 create table 表名(
       字段名 类型 [字段约束],
       字段名 类型 [字段约束],
       字段名 类型 [字段约束],
       ...
      );
create table stu(
    -> id int unsigned not null auto_increment primary,
    -> name varchar(8) not null unique,
    -> age tinyint unsigned,
    -> sex enum('m','w') not null default 'm',
    -> classid char(6)
    -> );

数据库的基本操作

数据库

show databases;                        查看当前所有数据库信息
create database  库名;                 创建数据库
create if not exists 库名;             尝试创建数据库,若已存在则不创建
drop database 库名;                   删除数据库
drop database if exists 库名;          尝试删除数据库
show create database 库名\G;            查看数据库的sql语句
use 库名;                             进入当前数据库
select database();                     查看当前所在数据库位置

数据表

show tables;                        查看当前所有的表
create table  [if not exists ] 表名(字段1 类型,字段2 类型,...)    
创建数据表,指定字段并指定类型 [尝试创建]
desc  表名;                         查看表结构
show create table 表名;               查看表的见表语句
show create table 表名\G              格式化查看建表语句
drop table 表名;                      删除数据表dd;
drop table if exists 表名;            尝试删除表;

表的数据(增删改查 DML)

-- 表的数据操作(增insert 删delete 改update 查select)
--========================================
  ! uu  是表名
-- 标准添加(指定所有表字段,给定所有字段值进行添加)
insert into uu(id,name,age) values(1,'zhangsan',20); 
-- 标准添加(不同之处是字段顺序)
insert into uu(age,id,name) values(22,2,'lisi');
-- 指定部分字段添加值
insert into uu(id,name) values(3,'wangwu');
-- 不指定字段信息添加值,注意字段值得顺序和个数要和表结构一致
insert into uu values(4,'zhaoliu',25);
-- 批量添加值
insert into uu values(5,'u01',21),(6,'u02',22),(7,'u03',23);
-- 查看所有字段所有值
select * from uu;
-- 修改uu表的id值为3的信息,将age改为18
update uu set age=18 where id=3; 
-- 修改id为6的信息,将age改为28,name改为uu04
update uu set age=28,name='uu04' where id=6;
-- 删除id值为100的信息
delete from uu where id=100;
-- 删除id值大于50的所有信息
 delete from uu where id>50;

修改表结构

 格式: alter table 表名 action(更改选项);
     更改选项:
  1. 添加字段:alter table 表名 add 字段名信息
-- 在user表的最后追加一个num字段 设置为int not null
       mysql> alter table user add num int not null;
-- 在user表的email字段后添加一个age字段,设置int not null default 20;
         mysql> alter table user add age int not null default 20 after email;
 -- 在user表的最前面添加一个aa字段设置为int类型
        mysql> alter table user add aa int first;
 2. 删除字段:alter table 表名 drop 被删除的字段名
      例如:-- 删除user表的aa字段
       mysql> alter table user drop aa;
  3. 修改字段:alter table 表名 change[modify] 被修改后的字段信息  (修改记得必须要写属性值)
  其中:change可以修改字段名, modify 不修改
 -- 修改user表中age字段信息(类型),(使用modify关键字的目的不修改字段名)
       mysql> alter table user modify age tinyint unsigned not null default 20;
            -- 修改user表的num字段改为mm字段并添加了默认值(使用change可以改字段名)
            mysql> alter table user change num mm int not null default 10;
4. 添加和删除索引
  -- 为user表中的name字段添加唯一性索引,索引名为uni_name;
        mysql> alter table user add unique uni_name(name);
  -- 为user表中的email字段添加普通索引,索引名为index_eamil
        mysql> alter table user add index index_email(email);
   -- 将user表中index_email的索引删除
        mysql> alter table user drop index index_email;
5. 更改表名称:
      ALTER TABLE 旧表名 RENAME AS 新表名
 6. 更改AUTO_INCREMENT初始值:
      ALTER TABLE 表名称 AUTO_INCREMENT=1
 7. 更改表类型:
        ALTER TABLE 表名称 ENGINE="InnoDB"
    MySQL数据库中的表类型一般常用两种:MyISAM和InnoDB
    区别:MyISAM类型的数据文件有三个frm(结构)、MYD(数据)、MYI(索引)
    MyISAM类型中的表数据增 删 改速度快,不支持事务,没有InnoDB安全。
   InnoDB类型的数据文件只有一个 .frm
   InnoDB类型的表数据增 删 改速度没有MyISAM的快,但支持事务,相对安全。

数据DQL 操作:数据查询

 格式:
        select [字段列表]|* from 表名
        [where 搜索条件]
        [group by 分组字段 [having 子条件]]
        [order by 排序 asc|desc]
        [limit 分页参数]
    1. where条件查询
    1. 查询班级为lamp138期的学生信息
    mysql> select * from stu where classid='lamp138';
    2. 查询lamp138期的男生信息(sex为m)
    mysql> select * from stu where classid='lamp138' and sex='m';
    3. 查询id号值在10以上的学生信息
    mysql> select * from  stu where id>10;
    4. 查询年龄在20至25岁的学生信息
    mysql> select * from stu where age>=20 and age<=25;
    mysql> select * from stu where age between 20 and 25;
    5. 查询年龄不在20至25岁的学生信息
    mysql> select * from stu where age not between 20 and 25;
    mysql> select * from stu where age<20 or age>25;
    6. 查询id值为1,8,4,10,14的学生信息
    select * from stu where id in(1,8,4,10,14);
    mysql> select * from stu where id=1 or id=8 or id=4 or id=10 or id=14;
    7. 查询lamp138和lamp94期的女生信息
    mysql> select * from stu where classid in('lamp138','lamp94') and sex='w';
    mysql> select * from stu where (classid='lamp138' or classid='lamp94') and sex='w

查询

 where条件查询
--========================================================
--1. 查询id为3的学生信息
mysql> select * from stu where id=3;
--2. 查询性别sex为m的所有信息
mysql> select * from stu where sex='m';
--3. 查询年龄大于25岁的所有学生信息
mysql> select * from stu where age>25;
--4. 查询学生年龄是22~27岁的所有信息
mysql> select * from stu where age>=22 and age<=27;
mysql> select * from stu where age between 22 and 27;
--5. 查询学生年龄在20~25岁之外的所有信息
mysql> select * from stu where age<20 or age>25;
mysql> select * from stu where age not between 20 and 25;
--6. 查询性别sex为w,并且年龄大于22岁的所有信息
mysql> select * from stu where sex='w' and age>22;
--7. 查询classid不为null的所有信息
mysql> select * from stu where classid  is not null;
--8. 查询id值为1,3,5,9,12的学员信息
mysql> select * from stu where id in(1,3,5,9,12);
--9. 查询name字段值是以zh开头的所有信息
mysql> select * from stu where name like "zh%";
mysql> select * from stu where name regexp  "^zh"; --正则写法
--10.查询姓名name中含有ang子串的所有信息
mysql> select * from stu where name like "%ang%";
mysql> select * from stu where name regexp  "ang";
-11. 查询姓名是任意四位字符构成的信息。
mysql> select * from stu where name like "____";
mysql> select * from stu where name regexp "^[a-z0-9]{4}$";

统计函数

MySQL的统计函数(聚合函数):
max() min() count()  sum()  avg()
- 分组 group by 字段名[,字段名]
    统计班级classid值为2的男女生各多少人?
select sex,count(*) from stu where classid=2 group by sex;
- 排序:order by 字段名[,字段名] desc|asc
-- asc 默认升序  desc 降序
    获取每个班级的平均年龄,并按平均年龄降序,
  select classid,avg(age) from stu group by classid order by avg(age) desc;
  select classid,avg(age) anum from stu group by classid order by anum desc;
-- limit 关键字 查询部分数据 
-- 例如: .... limit m; 查询数据只显示前m条  
-- 例如: .... limit m,n; 排除前m条,然后再查询出前n条 
    统计每个班级的人数,按人数从大到小排序,取前3条。
    select classid,count(*) num from stu group by classid order by num desc limit 3;
分页公式:.... (页号-1)*页大小, 页大小;

多表查询


表之间的关系有:1对1  1对多  多对多
1. 嵌套查询, 一个查询的结果是另外sql的条件
2. where关联查询  
3. join连接查询(左联,右联,内联)
-- 查询年龄最大的所有学生信息
mysql> select * from stu where age=(select max(age) from stu);
+----+---------+------+-----+---------+
| id | name    | age  | sex | classid |
+----+---------+------+-----+---------+
|  9 | xiaoli  |   29 | w   |       2 |
| 14 | zhangle |   29 | m   |       5 |
+----+---------+------+-----+---------+
-- 查询python02期的所有学生信息
mysql> select * from stu where classid=(select id from classes where name='python02');
mysql> select * from stu where classid in(select id from classes where name='python02');
where关联查询
已知:员工personnel表和部门department表,其中员工表中的did字段为部门表id主键关联。
      查询所有员工信息,并显示所属部门名称
要求:显示字段:员工id  部门 姓名
mysql> select p.id,d.name,p.name from personnel p,department d where p.did = d.id;
    +----+-----------+-----------+
    | id | name      | name      |
    +----+-----------+-----------+
    |  2 | 人事部    | 李玉刚    |
    | 10 | 人事部    | 阿杜      |
    |  4 | 市场部    | 刘欢      |
连接join查询
左联:left join
右联:right join
内联:inner join
查询新闻信息,并补齐新闻类别信息
mysql> select n.id,n.title,t.name from news n,ntype t where n.ntid=t.id;
mysql> select n.id,n.title,t.name from news n inner join ntype t on n.ntid=t.id;
同上,但采用的是左联查询left join
mysql> select n.id,n.title,t.name from news n left join ntype t on n.ntid=t.id;
统计每个新闻类别下的新闻数量,采用where关联统计
mysql> select t.name,count(n.id) from ntype t,news n where t.id=n.ntid group by t.id;
统计每个新闻类别下的新闻数量,采用左联统计
mysql> select t.name,count(n.id) from ntype t left join news n on t.id=n.ntid group by t.id;


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
存储 关系型数据库 MySQL
|
1月前
|
SQL 存储 关系型数据库
【MySQL 数据库】11、学习 MySQL 中的【锁】
【MySQL 数据库】11、学习 MySQL 中的【锁】
76 0
|
存储 关系型数据库 MySQL
|
1月前
|
SQL 关系型数据库 MySQL
【MySQL 数据库】4、MySQL 事务学习
【MySQL 数据库】4、MySQL 事务学习
44 0
|
16天前
|
SQL 存储 关系型数据库
6本值得推荐的MySQL学习书籍
本文是关于MySQL学习书籍的推荐,作者在DotNetGuide技术社区和微信公众号收到读者请求后,精选了6本值得阅读的MySQL书籍,包括《SQL学习指南(第3版)》、《MySQL是怎样使用的:快速入门MySQL》、《MySQL是怎样运行的:从根儿上理解MySQL》、《深入浅出MySQL:数据库开发、优化与管理维护(第3版)》以及《高性能MySQL(第4版)》和《MySQL技术内幕InnoDB存储引擎(第2版)》。此外,还有12本免费书籍的赠送活动,涵盖《SQL学习指南》、《MySQL是怎样使用的》等,赠书活动有效期至2024年4月9日。
|
21天前
|
SQL 关系型数据库 MySQL
轻松入门MySQL:深入学习数据库表管理,创建、修改、约束、建议与性能优化(3)
轻松入门MySQL:深入学习数据库表管理,创建、修改、约束、建议与性能优化(3)
|
2天前
|
存储 SQL 关系型数据库
MySQL学习手册(第一部分)
mysql日常使用记录
58 0
|
存储 SQL 关系型数据库
|
1月前
|
存储 SQL 关系型数据库
【MySQL 数据库】6、一篇文章学习【索引知识】,提高大数据量的查询效率【文末送书】
【MySQL 数据库】6、一篇文章学习【索引知识】,提高大数据量的查询效率【文末送书】
58 0
|
2月前
|
SQL 关系型数据库 MySQL
MySQL数据库学习(小白一文掌握Mysql)
MySQL数据库学习(小白一文掌握Mysql)
44 0