SQL
一、SQL
Structured Query Language:结构化查询语言,缩写为SQL
其实就是定义了操作所有关系型数据库的规则,标准组织指定的规则
每一种数据库操作的方式不一样的地方称之为"方言"
二、SQL通用语法
SQL语句可以单行或者多行书写,以分号结尾
可以使用空格和缩进来增强语句的可读性
MySQL数据库的SQL语句不区分大小写,但是关键字建议大写
注释方式
-- 单行注释('--'之后必须加空格)#单行注释/*多行注释*/
三、SQL的分类
DDL(Data Definition Language):数据定义语言
操作数据库和表
DML(Data Manipulation Language):数据库操作语言
增删改表中的数据
DQL(Data Query Language):数据查询语言
查询表
DCL(Data Control Language):数据库控制语言
授权操作权限
DDL:操作数据库、表
1、操作数据库:CRUD
C(Create):创建
-- 创建数据库mysql> CREATE DATABASE city;-- 首先判断数据库是存在,不存在才创建mysql> CREATE DATABASE IF NOT EXISTS TEST;-- 指定数据库的字符集mysql> CREATE DATABASE TEXT CHARACTER SET GBK;-- 创建名字为school的数据库,先判断是否存在,并且指定使用字符集GBKmysql> CREATE DATABASE IF NOT EXISTS SCHHOL CHARACTER SET GBK;
R(Retrieve):查询
-- 查询数据库的名称SHOW DATABASES;mysql> SHOW DATABASES;+--------------------+| Database |+--------------------+| city || information_schema || mysql || performance_schema || sys |+--------------------+-- 查看某个数据库的字符集:查询某个数据库的创建语句mysql> show create database mysql;+----------+---------------------------------------------------------------------------------------------------------------------------------+| Database | Create Database |+----------+---------------------------------------------------------------------------------------------------------------------------------+| mysql | CREATE DATABASE `mysql` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */ |+----------+---------------------------------------------------------------------------------------------------------------------------------+
U(Update):修改
-- 修改数据库的字符集mysql> ALTER DATABASE SCHOOL CHARACTER SET UTF8;
D(Delete):删除
-- 删除数据库mysql> DROP DATABASE SCHOOL;-- 先判断数据库是否存在,如果存在才删除mysql> DROP DATABASE IF EXISTS SCHOOL;
使用数据库
-- 使用数据库mysql> USE CITY;-- 查询当前正在使用的数据库名称mysql> SELECT DATABASE();+------------+| DATABASE() |+------------+| city |+------------+1 row in set (0.00 sec)
2、操作表
C(Create):创建
基本语法:
CREATE TABLE 表名(列名1,数据类型1,列名2,数据类型2,列名3,数据类型3......列名n,数据类型n);#最后一行不需要加逗号
常用数据类型:
INT 整数DOUBLE 小数(指定一共多少位,小数点后多少位):SCORE DOUBLE(5,2)DATE 日期类型:只包含年月日,yyyy-MM-ddDATETIME 时间类型:年月日时分秒,yyyy-MM-dd HH:mm:ssTIMESTAMP 时间戳类型:年月日时分秒,yyyy-MM-dd HH:mm:ss-- 如果是TIMESAMP类型,不给其赋值或者指定为NULL,将会默认使用系统的当前时间来自动赋值VARCHAR 字符串类型(指定长度):NAME VARCHAR(20)
实例
-- 学生表-- 编号 姓名 年龄 分数 出生日期 添加时间mysql> CREATE TABLE STU_MESSAGE( -> ID INT, -> NAME VARCHAR(32), -> AGE INT, -> SCORE DOUBLE(4,1), -> BIRTHDAY DATE, -> INSERT_TIME TIMESTAMP -> );Query OK, 0 rows affected, 1 warning (0.60 sec)-- 检查表结构mysql> DESC STU_MESSAGE;+-------------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------------+-------------+------+-----+---------+-------+| ID | int(11) | YES | | NULL | || NAME | varchar(32) | YES | | NULL | || AGE | int(11) | YES | | NULL | || SCORE | double(4,1) | YES | | NULL | || BIRTHDAY | date | YES | | NULL | || INSERT_TIME | timestamp | YES | | NULL | |+-------------+-------------+------+-----+---------+-------+6 rows in set (0.00 sec)-- 复制表mysql> CREATE TABLE STU LIKE STU_MESSAGE;
R(Retrieve):查询
-- 查询某个数据库当中的表名称mysql> SHOW TABLES;+----------------+| Tables_in_city |+----------------+| student |+----------------+-- 查询表的创建语句mysql> SHOW CREATE TABLE STUDENT;+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| Table | Create Table |+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| STUDENT | CREATE TABLE `student` ( `ID` int(11) DEFAULT NULL, `NAME` varchar(32) DEFAULT NULL, `AGE` int(11) DEFAULT NULL, `SCORE` double(4,1) DEFAULT NULL, `BIRTHDAY` date DEFAULT NULL, `INSERT_TIME` timestamp NULL DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=gbk |+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-- 查询表结构mysql> DESC USER;+--------------------------+-----------------------------------+------+-----+-----------------------+-------+| Field | Type | Null | Key | Default | Extra |+--------------------------+-----------------------------------+------+-----+-----------------------+-------+| Host | char(255) | NO | PRI | | || User | char(32) | NO | PRI | | || Select_priv | enum('N','Y') | NO | | N | || Insert_priv | enum('N','Y') | NO | | N | || Update_priv | enum('N','Y') | NO | | N | || Delete_priv | enum('N','Y') | NO | | N | || Create_priv | enum('N','Y') | NO | | N | || Drop_priv | enum('N','Y') | NO | | N | || Reload_priv | enum('N','Y') | NO | | N | || Shutdown_priv | enum('N','Y') | NO | | N | || Process_priv | enum('N','Y') | NO | | N | || File_priv | enum('N','Y') | NO | | N | || Grant_priv | enum('N','Y') | NO | | N | || References_priv | enum('N','Y') | NO | | N | || Index_priv | enum('N','Y') | NO | | N | || Alter_priv | enum('N','Y') | NO | | N | || Show_db_priv | enum('N','Y') | NO | | N | || Super_priv | enum('N','Y') | NO | | N | || Create_tmp_table_priv | enum('N','Y') | NO | | N | || Lock_tables_priv | enum('N','Y') | NO | | N | || Execute_priv | enum('N','Y') | NO | | N | || Repl_slave_priv | enum('N','Y') | NO | | N | || Repl_client_priv | enum('N','Y') | NO | | N | || Create_view_priv | enum('N','Y') | NO | | N | || Show_view_priv | enum('N','Y') | NO | | N | || Create_routine_priv | enum('N','Y') | NO | | N | || Alter_routine_priv | enum('N','Y') | NO | | N | || Create_user_priv | enum('N','Y') | NO | | N | || Event_priv | enum('N','Y') | NO | | N | || Trigger_priv | enum('N','Y') | NO | | N | || Create_tablespace_priv | enum('N','Y') | NO | | N | || ssl_type | enum('','ANY','X509','SPECIFIED') | NO | | | || ssl_cipher | blob | NO | | NULL | || x509_issuer | blob | NO | | NULL | || x509_subject | blob | NO | | NULL | || max_questions | int(11) unsigned | NO | | 0 | || max_updates | int(11) unsigned | NO | | 0 | || max_connections | int(11) unsigned | NO | | 0 | || max_user_connections | int(11) unsigned | NO | | 0 | || plugin | char(64) | NO | | caching_sha2_password | || authentication_string | text | YES | | NULL | || password_expired | enum('N','Y') | NO | | N | || password_last_changed | timestamp | YES | | NULL | || password_lifetime | smallint(5) unsigned | YES | | NULL | || account_locked | enum('N','Y') | NO | | N | || Create_role_priv | enum('N','Y') | NO | | N | || Drop_role_priv | enum('N','Y') | NO | | N | || Password_reuse_history | smallint(5) unsigned | YES | | NULL | || Password_reuse_time | smallint(5) unsigned | YES | | NULL | || Password_require_current | enum('N','Y') | YES | | NULL | || User_attributes | json | YES | | NULL | |+--------------------------+-----------------------------------+------+-----+-----------------------+-------+
U(Update):修改
-- 修改表名mysql> ALTER TABLE STU RENAME TO STUDENT;-- 修改表的字符集mysql> ALTER TABLE STUDENT CHARACTER SET UTF8;-- 添加列mysql> ALTER TABLE STUDENT ADD GENDER VARCHAR(10);-- 删除列mysql> ALTER TABLE STUDENT DROP SEX;-- 修改列的名称和数据类型mysql> ALTER TABLE STUDENT CHANGE GENDER SEX VARCHAR(20);-- 修改列的数据类型mysql> ALTER TABLE STUDENT MODIFY SEX VARCHAR(10);
D(Delete):删除
-- 先判断表是否存在,然后删除mysql> DROP TABLE IF EXISTS STUDENT;
DML:增删改表中数据
添加数据
- 语法
INSERT INTO TABLE_NAME(NAME1,NAME2,...,NAMEn)VALUES (VALUE1,VALUE2,...,VALUEn);
注意事项
1、列名和值要一一对应2、如果表名后面不定义列名,则默认给所有列添加值3、除了数字之外的其他类型需要双引号或者是单引号
实例
INSERT INTO STUDENT(ID, NAME, AGE) VALUES (1, '张无忌', 18);INSERT INTO student VALUES(2, '赵敏', 17, 99.9, '20000510', CURRENT_TIMESTAMP());
删除数据
- 语法
DELETE FROM TABLE_NAME WHERE CONDITION;
注意事项
1、如果不加条件,就是删除表中所有数据2、如果要删除全部的数据,最好采用TRUNCATE,因为如果是采用DELETE,有多少的数据就会执行多少次,效率特别低
实例
-- 删除符合条件的数据DELETE FROM STUDENT WHERE ID = 1;-- 删除全部数据(执行两个操作,删除表,然后再创建一个一模一样的空表)TRUNCATE TABLE STUDENT;
修改数据
- 语法
UPDATE TABLE_NAME SET NAME1 = VALUE1, NAME2 = VALUE2,..., NAMEn = VALUEn WHERE CONDITION;
注意事项
1、如果不加任何条件,则将表中的全部数据进行修改
实例
UPDATE STUDENT SET AGE = 117 WHERE NAME = '赵敏';
DQL:查询
SELECT * FROM TABLE_NAME;