MySQL基础学习笔记之——SQL

(MY)SQL

1、(MY)SQL使用入门

SQL 语句主要分为以下 3 个类别:

  • DDL(Data Definition Languages)语句:数据定义语言这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象的定义。常见的语句关键字有:create、drop、alter等。
  • DML(Data Manipulation Languages)语句:数据操纵语句用于添加、删除、更新和查询数据库记录,并检查数据完整性,常用的语句关键字有:insert、delete、update和select等。
  • DCL(Data Contorl Languages)语句:数据控制语句用于控制不同数据段直接的许可和访问级别的语句这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的语句关键字有:grant、revoke等。

1.1、DDL 语句

是对数据库内部的对象进行创建、删除、修改的操作语句,它与 DML 语句的最大区别在于 DML 语句只是对表的内部数据的操作,而不涉及到表的定义、结构的修改。

1.1.1、创建数据库

CREATE DATABASE 数据库名称;
mysql> create database test1;
Query OK, 1 row affected (0.00 sec)

如果想要知道系统中有哪些数据库,可以使用 show databases 命令查询:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| li                 |
| mysql              |
| performance_schema |
| sys                |
| test1              |
+--------------------+
6 rows in set (0.00 sec)

可以使用下面的命令选择要操作的数据库:

USE 数据库名称;
mysql> use li;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

查看数据库中的表:

mysql> show tables;
+--------------+
| Tables_in_li |
+--------------+
| customers    |
| orderitems   |
| orders       |
| productnotes |
| products     |
| vendors      |
+--------------+
6 rows in set (0.00 sec)

1.1.2、删除数据库

DROP DATABASE 数据库名称;
mysql> drop database test1;
Query OK, 0 rows affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| li                 |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

1.1.3、创建表

CREATE TABLE 表名(列名1 数据类型 列的约束条件,
				 ......
				 );

例如,创建一个名称为 emp 的表。其中包括 3 个字段,ename(姓名),hiredate(雇用日期),sal(薪水),depno(部门编号),字段类型分别为 varchar(10),date,DECIMAL(10,2),int(2):

mysql> CREATE TABLE emp(ename VARCHAR(10),
						hiredate date,
						sal DECIMAL(10,2),
						deptno INT(2));

建表完成后,可使用 desc 命令查看建表的详细信息

mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field    | Type          | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename    | varchar(10)   | YES  |     | NULL    |       |
| hiredate | date          | YES  |     | NULL    |       |
| sal      | decimal(10,2) | YES  |     | NULL    |       |
| deptno   | int(2)        | YES  |     | NULL    |       |
+----------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

为了查看表的更加详细的信息,可以通过创建表的 SQL 语句来查看

mysql> show create table emp;
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                     |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| emp   | CREATE TABLE `emp` (
  `ename` varchar(10) DEFAULT NULL,
  `hiredate` date DEFAULT NULL,
  `sal` decimal(10,2) DEFAULT NULL,
  `deptno` int(2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

除了表的定义以外,还可以看到表的 engine(存储引擎)和 charset(字符集)等信息。

1.1.4、删除表

DROP TABLE 表名;
mysql> drop table emp;
Query OK, 0 rows affected (0.00 sec)

1.1.5、修改表

1.1.5.1、修改表的类型
ALTER TABLE 表名 MODIFY [COLUMN] 列名 约束 [FIRST|AFTER col_name]
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field    | Type          | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename    | varchar(10)   | YES  |     | NULL    |       |
| hiredate | date          | YES  |     | NULL    |       |
| sal      | decimal(10,2) | YES  |     | NULL    |       |
| deptno   | int(2)        | YES  |     | NULL    |       |
+----------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
#修改表 emp 的 ename 字段定义,改为 varchar(20)
mysql> alter table emp modify ename varchar(20);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field    | Type          | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename    | varchar(20)   | YES  |     | NULL    |       |
| hiredate | date          | YES  |     | NULL    |       |
| sal      | decimal(10,2) | YES  |     | NULL    |       |
| deptno   | int(2)        | YES  |     | NULL    |       |
+----------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
1.1.5.2、增加表字段
ALTER TABLE 表名 ADD [COLUMN] 列名 约束 [FIRST|AFTER col_name]
#增加一个 age 字段,数据类型为 int(3)
mysql> alter table emp add column age int(3);
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field    | Type          | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename    | varchar(20)   | YES  |     | NULL    |       |
| hiredate | date          | YES  |     | NULL    |       |
| sal      | decimal(10,2) | YES  |     | NULL    |       |
| deptno   | int(2)        | YES  |     | NULL    |       |
| age      | int(3)        | YES  |     | NULL    |       |
+----------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
1.1.5.3、删除表字段
ALTER TABLE 表名 DROP [COLUMN] 列名 
mysql> alter table emp drop age;
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field    | Type          | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename    | varchar(20)   | YES  |     | NULL    |       |
| hiredate | date          | YES  |     | NULL    |       |
| sal      | decimal(10,2) | YES  |     | NULL    |       |
| deptno   | int(2)        | YES  |     | NULL    |       |
+----------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
1.1.5.4、字段改名
ALTER TABLE 表名 CHANGE [COLUMN] 旧列名 新列名 约束 [FIRST|AFTER col_name]
mysql> alter table emp change deptno deptnumber int(4);
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc emp;
+------------+---------------+------+-----+---------+-------+
| Field      | Type          | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| ename      | varchar(20)   | YES  |     | NULL    |       |
| hiredate   | date          | YES  |     | NULL    |       |
| sal        | decimal(10,2) | YES  |     | NULL    |       |
| deptnumber | int(4)        | YES  |     | NULL    |       |
+------------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
1.1.5.5、修改字段的排列顺序

在前面的语句中有一个选项:[FIRST|AFTER col_name],这个选项可以用来修改字段在表中的位置。

#将新增的字段 dirth date 加在 ename 之后
mysql> alter table emp add birth date after ename;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc emp;
+------------+---------------+------+-----+---------+-------+
| Field      | Type          | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| ename      | varchar(20)   | YES  |     | NULL    |       |
| birth      | date          | YES  |     | NULL    |       |
| hiredate   | date          | YES  |     | NULL    |       |
| sal        | decimal(10,2) | YES  |     | NULL    |       |
| deptnumber | int(4)        | YES  |     | NULL    |       |
+------------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

#修改字段 dirth,将它放在最前面
mysql> alter table emp change birth birthday date first;
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc emp;
+------------+---------------+------+-----+---------+-------+
| Field      | Type          | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| birthday   | date          | YES  |     | NULL    |       |
| ename      | varchar(20)   | YES  |     | NULL    |       |
| hiredate   | date          | YES  |     | NULL    |       |
| sal        | decimal(10,2) | YES  |     | NULL    |       |
| deptnumber | int(4)        | YES  |     | NULL    |       |
+------------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
1.1.5.6、修改表名
ALTER TABLE 旧表名 RENAME [TO] 新表名
mysql> alter table emp rename emp_new;
Query OK, 0 rows affected (0.00 sec)

mysql> desc emp;
ERROR 1146 (42S02): Table 'li.emp' doesn't exist
mysql> desc emp_new;
+------------+---------------+------+-----+---------+-------+
| Field      | Type          | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| birthday   | date          | YES  |     | NULL    |       |
| ename      | varchar(20)   | YES  |     | NULL    |       |
| hiredate   | date          | YES  |     | NULL    |       |
| sal        | decimal(10,2) | YES  |     | NULL    |       |
| deptnumber | int(4)        | YES  |     | NULL    |       |
+------------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

1.2、DML 语句

DML 语句是指对数据库中表的记录的操作,主要包括表记录的插入(insert)、更新(update)、删除(delete)和查询(select)

1.2.1、插入记录

INSERT INTO 表名(列名1,列名2,...,列名n) VALUES(1,2,...,值n)
#先把表名改回来
mysql> alter table emp_new rename emp;
Query OK, 0 rows affected (0.00 sec)
#插入数据
mysql> insert into emp(ename,hiredate,sal,deptnumber) values('zzxl','2000-01-01','2000',1);
Query OK, 1 row affected (0.00 sec)

mysql> alter table emp drop birthday;
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0
#没有赋值的字段,默认为 NULL、默认值、自增的下一个数字
mysql> insert into emp(ename,sal) values('dony',1000);
Query OK, 1 row affected (0.00 sec)
#也可以不指定列名,但 values 后面的顺序应该和字段顺序一致
mysql> insert into emp values('lisa','2003-02-01','3000',2);
Query OK, 1 row affected (0.00 sec)

mysql> select * from emp;
+-------+------------+---------+------------+
| ename | hiredate   | sal     | deptnumber |
+-------+------------+---------+------------+
| zzxl  | 2000-01-01 | 2000.00 |          1 |
| dony  | NULL       | 1000.00 |       NULL |
| lisa  | 2003-02-01 | 3000.00 |          2 |
+-------+------------+---------+------------+
3 rows in set (0.00 sec)

在 Mysql 中,insert 还可以一次性插入多条记录:

INSERT INTO 表名(列名1,列名2,...,列名n) 
VALUES
(1,2,...,值n),
(1,2,...,值n),
...
(1,2,...,值n);
mysql> create table dept(deptno int(4),deptname varchar(10));
Query OK, 0 rows affected (0.00 sec)

mysql> insert into dept values(5,'dept5'),(6,'dept6');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from dept;
+--------+----------+
| deptno | deptname |
+--------+----------+
|      5 | dept5    |
|      6 | dept6    |
+--------+----------+
2 rows in set (0.00 sec)

mysql> insert into dept
    -> values
    -> (1,'tech'),
    -> (2,'sale'),
    -> (5,'fin');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from dept;
+--------+----------+
| deptno | deptname |
+--------+----------+
|      5 | dept5    |
|      6 | dept6    |
|      1 | tech     |
|      2 | sale     |
|      5 | fin      |
+--------+----------+
5 rows in set (0.00 sec)

1.2.2、更新数据

UPDATE [IGNORE] 表名
SET 列名1 =1,
	列名2 =2,
	...
	列名n = 值n
[WHERE 过滤条件];	

IGNORE 关键字:如果用 UPDATE 语句进行更新多行,并且在更新这些行中的一行或多行时出现一个错误,则整个 UPDATE 操作被取消。即使是发生错误,也继续进行更新,可使用 IGNORE 关键字

为了更新表中的数据,可使用 UPDATE 语句。可采用两种方式:

  • 更新表中特定行
  • 更新表中所有行

基本的 UPDATE 语句由 3 部分组成,分别是:(1) 要更新的表;(2) 列名和他们的值;(3) 确定要更新行的过滤条件

#客户 10005 现在有了电子邮件,因此需要更新数据
mysql> update customers
    -> set cust_email = '[email protected]'
    -> where cust_id = 10005;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

为了删除某列的值,可以设置它为 NULL:

mysql> UPDATE customers
    -> SET cust_email = NULL
    -> WHERE cust_id = 10005;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

1.2.3、删除数据

DELETE FROM 表名
[WHERE 过滤条件];

为了删除表中的数据,可使用 DELETE 语句。可采用两种方式:

  • 删除表中特定行
  • 删除表中所有行
mysql> DELETE FROM customers
    -> WHERE cust_id = 10006;
Query OK, 0 rows affected (0.00 sec)

DELETE 删除整行的值,如果想删除指定的列,使用 UPDATE 语句。但是,请注意的是,DELETE 删除的是表的内容,而不是表本身!!!想要从表中删除所有的行,不要使用 DELETE,可使用 TRUNCATE TABLE 语句

1.2.4、查询数据

因 SELECT 语句用法太多,请见《SELECT查询》。

1.3、DCL 语句

1.3.1、访问控制

MySQL 服务器的安全基础是:用户应该对他们需要的数据具有适当的访问权,既不能多也不能少。即你需要给用户提供他们所需的访问权,且仅提供他们所需的访问权。这就是所谓的访问控制,管理访问控制需要创建和管理用户账号。root 用户对整个 MySQL 具有完全的控制。

1.3.2、管理用户

MySQL 用户账号和信息存储在名为 mysql 的数据库中。mysql 数据库中有一个名为 user 的表,它包含所有用户账号。

mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> SELECT user FROM user;
+---------------+
| user          |
+---------------+
| root          |
| mysql.session |
| mysql.sys     |
| root          |
+---------------+
4 rows in set (0.00 sec)

1.3.3、创建用户账号

为了创建一个新的用户账号,使用 CREATE USER 语句:

mysql> CREATE USER ben IDENTIFIED BY 'opfordream';		#使用了一个密码
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE USER li;									#不使用密码
Query OK, 0 rows affected (0.00 sec)

为了重命名一个用户账号,使用 RENAME USER 语句:

mysql> RENAME USER ben TO bforta;
Query OK, 0 rows affected (0.00 sec)

1.3.4、删除用户账号

为了删除一个用户账号(以及相关权限),使用 DROP USER 语句:

mysql> DROP USER bforta;
Query OK, 0 rows affected (0.00 sec)

1.3.5、设置访问权限

在创建用户账号后,必须接着分配访问权限。新创建的用户账号没有访问权限。它们可以登陆 MySQL,但看不到数据,不能执行任何数据库的操作

为了查看用户的权限,使用 SHOW GRANTS FOR

mysql> SHOW GRANTS FOR li;
+--------------------------------+
| Grants for li@%                |
+--------------------------------+
| GRANT USAGE ON *.* TO 'li'@'%' |
+--------------------------------+
1 row in set (0.00 sec)

输出结果显示用户 li 有一个权限 USAGE ON *.*。USAGE 表示根本没有权限

此外,用户定义为 user@host:MySQL 的权限用用户名和主机名结合定义。如果不指定主机名,则使用默认的主机名%(授予用户访问权限而不管主机名)

为设置权限,使用 GRANT,GRANT 要求至少给出以下信息:

  • 要授予的权限;
  • 被授予访问权限的数据库或表;
  • 用户名。
mysql> GRANT SELECT ON crashcource.* TO li;
Query OK, 0 rows affected (0.00 sec)

此 GRANT 允许用户在 crashcourse 数据库的所有表上使用 SELECT。SHOW GRANTS 反映这个更改:

mysql> SHOW GRANTS FOR li;
+---------------------------------------------+
| Grants for li@%                             |
+---------------------------------------------+
| GRANT USAGE ON *.* TO 'li'@'%'              |
| GRANT SELECT ON `crashcource`.* TO 'li'@'%' |
+---------------------------------------------+
2 rows in set (0.00 sec)

GRANT 的反操作为 REVOKE,用它撤销特定的权限

mysql> REVOKE SELECT ON `crashcource`.* FROM li;
Query OK, 0 rows affected (0.00 sec)

GRANT 和 REVOKE 可在几个层次上控制访问权限:

  • 整个服务器,使用 GRANT ALL 和 REVOKE ALL;
  • 整个数据库,使用 ON database.*;
  • 特定的表,使用 ON database.table;
  • 特定的列;
  • 特定的存储过程。

1.3.6、更改密码

为了更改用户密码,可使用 SET PASSWD 语句:

mysql> SET PASSWORD FOR li = Password('opfordream1996');
Query OK, 0 rows affected, 1 warning (0.00 sec)

你可能感兴趣的:(MySQL数据库基础)