2.MySQL基本操作-数据类型

MySQL基本操作

语义检查:判断SQL语句的类型

  • DDL:数据定义语言
  • DCL:数据控制语言
  • DML:数据操作语言
  • DQL:数据查询语言

1.登陆退出MySQL数据库

# (1) 登陆
    mysql -u用户名 -p -h ip地址
    root用户登陆 : 
        mysql -uroot -p
    select user() #查询当前登陆用户
    select now()  #查询时间
    
# (2) 设置密码
    set password = "123"
    set password = "" 	--去除密码
        
# (3) 退出
q 或者 exit

2.创建用户连接远程数据库

远程数据库IP地址: 192.168.138.133
# 给具体IP下设置一个账号,用来连接远程数据库
"""
create user 用户名@"192.168.138.1"/"192.168.138.%"/"%" identified by "密码"

用户名@'%'	所有地址
用户名@'10.0.0.5%'	只允许IP地址末尾51~59的连接
用户名@'localhost'	只允许本地连接
"""
# 创建用户
mysql>  create user lianxi@"192.168.138.1" identified by "111"
# 查看所有用户
mysql> select user,host from mysql.user;
# 修改用户
mysql> alter user lianxi@'localhost' identified by '123';
# 删除用户
mysql> drop user zhangkai@'localhost';


# 连接远程数据库
    mysql -u lianxi -p -h 192.168.138.133

# 查询当前用户有什么权限,for 后面怎么创建的怎么查询
    show grants for "lianxi"@"192.168.138.1"

# 在远程数据库给用户添加执行权限
"""
语法:   
    grant 权限 on 数据库名.表名 to "用户名"@"IP地址" identified by "密码"
    如果不更改密码,后面的 [ identified by "密码" ] 可不加
    "用户名"@"IP地址" : 
常用权限:
    select 查询权限
    insert 添加权限
    update 修改权限
    drop 删除权限
    all       所有权限
    *         所有数据库,所有表
"""
# 授予查询,添加权限
    grant select,insert on *.* to "lianxi"@"192.168.138.1";
# 授予所有权限
    grant all on *.* to "lianxi"@"192.168.138.1";

# 移除权限
    revoke select on *.* from "lianxi"@"192.168.138.1";
# 移除所有权限
    revoke all on *.* from "lianxi"@"192.168.138.1";

3.本地管理员用户密码忘记了

解决思路是:

  1. 关闭MySQL服务
  2. mysqld_safe模式启动,即关闭MySQL的用户密码验证模块,也就是不加载授权表,然后禁止远程连接,仅能通过本地socket链接
  3. 无密码登登录到MySQL
  4. 修改密码
  5. 重启MySQL
# 启动mysql:
方式二:sudo service mysql start
# 停止mysql:
方式二:sudo service mysql stop

# 停止mysql - 如果systemctl命令不好使,没有配置,使用上边命令
[root@cs mysql]# systemctl stop mysqld
# 启动安全模式,不加载授权表,然后禁止远程连接,&是后台执行
[root@cs mysql]# mysqld_safe --skip-grant-tables --skip-networking &
# 进入mysql,无用户无密码
[root@cs mysql]# mysql
# 修改密码前,先加载授权表
mysql> flush privileges;
# 修改root用户密码
mysql> alter user root@'localhost' identified by '123';
mysql> exit;

# 杀死安全模式进程
[root@cs mysql]# pkill mysqld
# 启动mysql
[root@cs mysql]# systemctl start mysqld

4.操作数据库(操作文件夹)

MySQL自带的数据库

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

各库解释如下:

  • information_schema,虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息、列信息、权限信息、字符信息等。
  • performance_schema, MySQL 5.5开始新增一个数据库,主要用于收集数据库服务器性能参数,记录处理查询请求时发生的各种事件、锁等现象 。
  • mysql,授权库,主要存储系统用户的权限信息。
  • sys库所有的数据源来自performance_schema,目标是把performance_schema的把复杂度降低,让DBA能更好的阅读这个库里的内容。让DBA更快的了解数据库的运行情况。
  • test,MySQL数据库系统自动创建的测试数据库。test库在MySQL中特殊存在,一般部署完mysql后应当删除该库,并规定不能创建以testtest_字符开头的数据库。因为在MySQL中,test库对任意用户都有管理员权限,
"""
查看新建数据库位置:
Linux:
    sudo find / -name db100  #/var/lib/mysql
    sudo su root  切换到root用户
    cd /var/lib/mysql
Windows:
    D:MySQL5.7mysql-5.7.25-winx64data => 看到数据库文件夹
"""
# create database & create schema -- schema相当于database
# (1) 增 create  ->创建数据库  
	# 编码集一般:utf8,utf8mb4(比utf8多编译了复杂的中文等),gbk
    mysql> show charset;  # 查看字符集
    
    create database 数据库名 charset 编码集; 

    create database lianxi charset utf8;  # 创建名为lianxi 的数据库

# (2) 查 show
    show databases; # 查看所有数据库
    show create database lianxi ; # 查看建库语句

# (3) 改 alter
    alter database lianxi charset gbk ; # 修改数据库编码集

# (4) 删 drop 
    drop database lianxi  # 删除数据库

5.操作数据表(操作文件)

# 1.操作数据表(操作文件)
    use lianxi # 选择数据库
    select database() # 查询当前库
    
# (1) 增 create 
    创建数据表语法 :
        create table 表名(字段1 类型1,字段2 类型2,....)
    #创建t1表
    create table t1(id int , name char(12),sex varchar(10)) 

# (2) 查 
    show tables; # 查看所有数据表
    show cteat table t1 ; #查看建表语句,查看表结构
    show cteat table t1 G; #查看建表语句,查看表结构,垂直显示
    desc t1 # 查看表字段信息

# (3) 改  alter
    # modify 更改字段类型
    alter table t1 modify id char(10); #把id字段改成字符串类型
    # change 更改字段名称+类型
    alter table t1 change name sex int; #把name字段改sex,类型改int型
    # add 添加字段
    alter table t1 add age int ;
    # drop 删除字段(删除表中列) 不能删除主键字段
    alter table t1 drop age;
    # rename 更改表名
    alter table t1 rename t2 # 把表名t1改成t2
   
# (4) 删 drop
    drop table t1 ; #删除t1数据表
    
# 2.复制表相关的操作:
# (1)复制一份一摸一样的表t3,表结构和t1一样,不复制记录
	create table t3 like t1;
# (2)创建一个表,复制另一张表的指定字段和记录
    create table t4(
    name char(10),
    sex char(10),
    primary key(name,sex) --注意,key不会复制: 主键、外键和索引,所以这里需要自己建立主键
    )
    select name,sex from t1;
# (3)创建一个表,复制另一张表的指定字段和记录,但是创建的表字段又不想跟被复制表字段一致
    create table t5(
    user char(10),
    num char(10),
    primary key(user,num) 
    )
    select name as user,sex as num from t1; -- 给字段起别名

6.操作记录(操作表内表格数据)

# (1) 增 insert
    # 一次插入一条数据
    insert into t1 (id,name) values (1,"熊大")
    # 一次插入多条数据
    insert into t1 (id , name) values (2,"熊二"),(3,"光头强"),...
    # 不指定字段插入(按字段顺序插入)
    insert into t1 values (4,"舒畅")
    # 可以具体指定个别字段插入(其他字段自动填充null)
    insert into t1 (name) values ("沈腾")
    
# (2)查 select
    select * from t1; # 查询表中所有数据
    select id,name from t1 ; #查询指定字段数据
    
# (3) 改 update 
语法:
    # update 表名 set 需要修改的字段=值 where 参考字段>=<值
    update t1 set name = "郭麒麟" where id = 1 #id=1那行的name改成郭麒麟
    
# (4) 删除 delete (删除表中行)
语法:
    # delete from 表名 where 条件
    delete from t1 where id = 1 # 删除id = 1 那行
    delete from t1  #删除表中所有数据,但不能重置自增字段
    truncate table t1 #重置表(删除所有数据 + 重置自增字段)

7.数据类型

# (1) 整型
小整型 :tinyint  1个字节 有符号: [-128 ~ 127]  无符号 [0 ~ 255] unsigned
大整型 : int       4个字节 有符号: [-21亿 ~ 21个亿左右] 无符号 [0 ~ 42亿]unsigned

# (2) 浮点型
# float(255,30)  30代表小数保留30个,整数+小数位数总长= 255
float       #单精度  默认保留5位小数
double   # 双精度  默认10多位
decimal  #金钱类型 默认保留整数

# (3) 字符串
char (11)       #定长:固定开辟11个字符长度空间(身份证,手机号,银行卡)
varchar(11)    #变长:动态最多开辟11个字符长度的空间( 评论,个性签名,广告 )
text                #文本类型: (毕业论文,文章,长篇小说)

select concat(id,name) from t1;  # 字段的拼接

# (4) 枚举和集合
enum  枚举 : 从列出来的数据当中选1个   (性别)
set       集合 : 从列出来的数据当中选多个  (爱好) 自动去重
    create table t2(
	sex enum("男性","女性") ,
	hobby set("大保健","吃药","吃大腰子")	
	);
    insert into t2 values ("男性","大保健,大保健,大保健") # 集合自动去重,只能添加一个大保健
    
# (5) 时间类型 
date  YYYY-MM-DD  年月日 (出生日期,结婚日期,春运,项目启动时间)
time  HH:MM:SS    时分秒 (长跑记录,体育竞赛)
year  YYYY        年份   (化石,红酒年份)
datetime YYYY-MM-DD HH:MM:SS 年月日 时分秒 (订单流水,日志时间)
	create table t1(d date , t time , y year , dt datetime); #创建表
    
	insert into t1 values("2021-01-07" , "09:22:40" , "2021" , "2021-01-07 09:22:40");
    insert into t2 values (20200101,152030,2020,20200101153030); 
	insert into t1 values(now(),now(),now(),now()) #自动添加当前时间

timestamp YYYYMMDDHHMMSS (时间戳)  自动更新时间 (系统自动写入,不需要手动更新)  (用来记录修改的时间)
	create table t2(dt datetime , ts timestamp); #创建表
	
	insert into t2 values(null , null); # 插入null时,自动更新时间
    insert into t2 values(20400107092930 , 20300107092930);
	insert into t2 values(20400107092930 , 20400107092930); error 自动更新时间戳超过2038年
原文地址:https://www.cnblogs.com/jia-shu/p/14243699.html