MySQL 基本操作(SQL)

SQL:

  1. SQL 是用于访问和处理数据库的标准的计算机语言。

SQL语言规范

1 在数据库系统中,SQL语句不区分大小写,建议用大写
2 SQL语句可单行或多行书写,以“;”结尾
3 关键词不能跨多行或简写
4 用空格和缩进来提高语句的可读性
5 子句通常位于独立行,便于编辑,提高可读性

注释:

SQL标准:
    -- 注释内容 单行注释,注意有空格
    /*注释内容*/ 多行注释
MySQL注释:
     注释内容

常用SQL操作指令

DDL: Data Defination Language 数据定义语言
    CREATE,DROP,ALTER
DML: Data Manipulation Language 数据操作语言
    INSERT,DELETE,UPDATE
DQL:Data Query Language 数据查询语言
    SELECT
DCL:Data Control Language 数据控制语言
    GRANT,REVOKE,COMMIT,ROLLBACK

库管理命令

创建数据库
     create database db1;
     create database IF NOT EXISTS db2 CHARACTER SET 'utf8';
修改数据库
     ALTER DATABASE db1 character set utf8;
删除数据库
     drop database db1;
查看数据库
    show databases;
    show create database db1;
切换数据库
    use db2;
显示数据库中的表
    show tables;
数据库命名规则
    ——可以使用数字/字母/下划线,但不能纯数字
    ——区分大小写,具有唯一性,不能重复
    ——不可使用指令关键字、特殊符号

表管理命令 DDL

创建表
    新建指定名称的表
    create table 库名.表名(
    字段名1    字段类型(宽度)    约束条件,
    字段名2    字段类型(宽度)    约束条件,
    .. .. ..
    字段名N 字段类型(宽度)    约束条件
    );

    创建一个存储用户信息的表,表字段为姓名、性别、爱好
mysql> create table user(
    -> name char(10),
    -> gender char(10),
    -> hobby char(50)
    -> );


也可以通过查询现存表创建和复制现存的表的表结构创建
查看表
    查看支持的engine类型
        SHOW ENGINES;
    查看表:
        SHOW TABLES [FROM db_name]
    查看表结构:
        DESC [db_name.]tb_name
        SHOW COLUMNS FROM [db_name.]tb_name
    查看表创建命令:
        show create table student;
    查看表状态:
        SHOW TABLE STATUS LIKE 'tbl_name'
    查看库中所有表状态
        SHOW TABLE STATUS FROM db_name
修改和删除表
删除表
    DROP TABLE [IF EXISTS] 'tbl_name';
修改表
    ALTER TABLE 'tbl_name'
    #字段:
    #添加字段:add
    ADD col1 data_type [FIRST|AFTER col_name] 
    #删除字段:drop
    #修改字段:
    alter(默认值), change(字段名), modify(字段属性)
查看修改表帮助
    Help ALTER TABLE
    RENAME TABLE `cc`.`test` TO `cc`.`test1`;

    将test表修改为test1

记录管理命令DML

insert
    INSERT tbl_name [(col1,...)] VALUES (val1,...), (val21,...)    INSERT INTO `user` (`name`, `gender`, `hobby`) VALUES ('亚瑟', '男', '战士');
update
    UPDATE student_tbl SET s_title='学习 C++' WHERE s_id=3;
    注意:一定要有限制条件,否则将修改所有行的指定字段
    可利用mysql 选项避免此错误:
      mysql -U | --safe-updates| --i-am-a-dummy
      [root@centos8 ~]#vim /etc/my.cnf
      [mysql]
      safe-updates
delete
    DELETE FROM student_tbl WHERE s_id=3;
    删除表中数据,但不会自动缩减数据文件的大小。
  注意:一定要有限制条件,否则将清空表中的所有数据
  如果想清空表,保留表结构,也可以使用下面语句,此语句会自动缩减数据文件的大小。
  TRUNCATE TABLE tbl_name;

数据类型

数据类型

1 数据长什么样
2 数据需要多少空间存放

选择正确的数据类型对于获得高性能至关重要,三大原则

1 更小的通常更好,尽量使用可正确存储数据的最小数据类型
2 简单就好,简单数据类型的操作通常需要更少的CPU周期
3 尽量避免NULL,包含为Null的列,对MySQL更难优化

常见的信息种类:

数值型 字符型 枚举型 日期时间型
体重 姓名 爱好 出生时间
身高 地址 性别 注册时间
。。。 。。。 。。。 。。。

数值类型

数据库__DAY02 - 图2

create table tab2(age tinyint unsigned);
insert into tab2 (age) values (216);
insert into tab2 (age) values (256);

字符类型

数据库__DAY02 - 图3

枚举类型

1 ENUM:从给定值的集合中选择单个值
2     ——定义格式:enum(值1,值2,值N)
3     
4 SET:从给定值集合中选择一个或多个值
5     ——定义格式:set(值1,值2,值N)
1 mysql>create table t3( name varchar(7), gender enum("man","woman"), hobby set("woman","game","movie","chat") );
2 mysql> insert into t3 (gender)values("c");
3 ERROR 1265 (01000): Data truncated for column 'gender' at row 1
4 mysql> insert into t3 (gender)values("man");
5 Query OK, 1 row affected (0.00 sec)

日期时间型

数据库__DAY02 - 图4

mysql> create table date( 
name char(10), 
gender enum("man","woman"),
height float(3.2),
weight tinyint unsigned,bust char(3),
hobby set("man","game","movie","chat"), 
address varchar(100),
years year, 
dates date, 
times time);
Query OK, 0 rows affected (0.01 sec)

MySQL约束条件

约束条件

NULL            允许为空,默认设置
NOT NULL        不允许为空
Key             索引类型
Default         设置默认值,缺省为NULL
PRIMARY KEY 主键,所有记录中此字段的值不能重复,且不能为NULL
UNIQUE KEY 唯一键,所有记录中此字段的值不能重复,但可以为NULL
CHARACTER SET name 指定一个字符集
mysql> create table t1( name char(10) not null, gender enum("man","woman","no") default "no", age tinyintunsigned );
mysql> desc t1;
+--------+--------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------------------+------+-----+---------+-------+
| name | char(10) | NO | | NULL | |
| gender | enum('man','woman','no') | YES | | no | |
| age | tinyint(3) unsigned | YES | | NULL | |
+--------+--------------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
当不给默认字段赋值时,选择默认值
mysql> insert into t1(name) values("lw");
Query OK, 1 row affected (0.00 sec)

mysql> select * from t1;
+------+--------+------+
| name | gender | age  |
+------+--------+------+
| lw   | no     | NULL |
+------+--------+------+
1 row in set (0.00 sec)
直接指定字符集
mysql> create table db1.t1(name varchar(10)) character set utf8;
Query OK, 0 rows affected (0.02 sec)

mysql> desc db1.t1;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name  | varchar(10) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
1 row in set (0.00 sec)

MySQL修改表结构

添加新字段

alter table 表名 add 字段 类型 其它;
mysql> alter table t1 add hobby varchar(10);
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc t1;
+--------+--------------------------+------+-----+---------+-------+
| Field  | Type                     | Null | Key | Default | Extra |
+--------+--------------------------+------+-----+---------+-------+
| name   | char(10)                 | NO   |     | NULL    |       |
| gender | enum('man','woman','no') | YES  |     | no      |       |
| age    | tinyint(3) unsigned      | YES  |     | NULL    |       |
| hobby  | varchar(10)              | YES  |     | NULL    |       |
+--------+--------------------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

添加字段默认是添加到所有字段的结尾,如果要添加在首部需要使用first

mysql> alter table t1 add sex varchar(10) first;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc t1;
+--------+--------------------------+------+-----+---------+-------+
| Field  | Type                     | Null | Key | Default | Extra |
+--------+--------------------------+------+-----+---------+-------+
| sex    | varchar(10)              | YES  |     | NULL    |       |
| name   | char(10)                 | NO   |     | NULL    |       |
| gender | enum('man','woman','no') | YES  |     | no      |       |
| age    | tinyint(3) unsigned      | YES  |     | NULL    |       |
| hobby  | varchar(10)              | YES  |     | NULL    |       |
+--------+--------------------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

也可添加在指定字段后面,比如添加到name后面使用after name

mysql> alter table t1 add info varchar(10) after name;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc t1;
+--------+--------------------------+------+-----+---------+-------+
| Field  | Type                     | Null | Key | Default | Extra |
+--------+--------------------------+------+-----+---------+-------+
| sex    | varchar(10)              | YES  |     | NULL    |       |
| name   | char(10)                 | NO   |     | NULL    |       |
| info   | varchar(10)              | YES  |     | NULL    |       |
| gender | enum('man','woman','no') | YES  |     | no      |       |
| age    | tinyint(3) unsigned      | YES  |     | NULL    |       |
| hobby  | varchar(10)              | YES  |     | NULL    |       |
+--------+--------------------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

修改字段类型

基本用法
    ALTER TABLE 表名
    MODIFY  字段名     类型(宽度)约束条件;
    可加    AFTER    字段名;
    或者    FIRST;

注意事项:
1. 如果表中字段已经有值,修改的字段类型和字段里边的值不匹配,不允许修改
2. 需要修改的地方写新值,不需要修改的原样抄下来
mysql> alter table db1.t1 modify name int(4) unsigned not null;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc db1.t1;
+-------+-----------------+------+-----+---------+-------+
| Field | Type            | Null | Key | Default | Extra |
+-------+-----------------+------+-----+---------+-------+
| name  | int(4) unsigned | NO   |     | NULL    |       |
+-------+-----------------+------+-----+---------+-------+
1 row in set (0.00 sec)

修改字段名

基本用法
ALTER    TABLE     表名
CHANGE     原字段名    新字段名    类型(宽度)     约束条件;

修改字段名时,改变的写新的,不变的原样抄下来

修改字段名时也可修改字段类型和约束条件,但如果类型与约束条件与字段的值发生冲突时不允许修改
mysql> alter table db1.t1 change name age int(4);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> 
mysql> 
mysql> desc db1.t1;
+-------+--------+------+-----+---------+-------+
| Field | Type   | Null | Key | Default | Extra |
+-------+--------+------+-----+---------+-------+
| age   | int(4) | YES  |     | NULL    |       |
+-------+--------+------+-----+---------+-------+
1 row in set (0.00 sec)
修改字段名时也可修改字段类型和约束条件,但如果类型与约束条件与字段的值发生冲突时不允许修改
mysql> select * from db1.t1;
+------+
| age |
+------+
| 20 |
+------+
1 row in set (0.00 sec)

mysql>
mysql>
mysql> alter table db1.t1 change age name varchar(4);
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0

mysql> select * from db1.t1;
+------+
| name |
+------+
| 20 |
+------+
1 row in set (0.00 sec)

mysql> alter table db1.t1 change name date date;
ERROR 1292 (22007): Incorrect date value: '20' for column 'date' at row 1

删除字段

ALTER    TABLE    表名
    DROP    字段名;

当字段中有多条值时,所有此字段的值都会被删除
mysql> desc db1.t1;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| name  | varchar(4) | YES  |     | NULL    |       |
| age   | int(4)     | YES  |     | NULL    |       |
+-------+------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> alter table db1.t1 drop age;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

修改表名

基本用法    
    ALTER    TABLE    表名
    RENAME    新表名;

修改表名后,对应的表文件也会改变
mysql> alter table db1.t1 rename db1.t;
Query OK, 0 rows affected (0.00 sec)