2026/3/10 6:04:21
网站建设
项目流程
做网站太累,网站关键词快排名,软件开发外包是什么意思,专业ppt代做一、什么是SQL#xff1f;Structured Query Language:结构化查询语言其实就是定义了操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方#xff0c;称为“方言”。二、SQL通用语法SQL语句可以单行或多行书写#xff0c;以分号结尾。可使用空格和缩进来增强…一、什么是SQLStructured Query Language:结构化查询语言其实就是定义了操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方称为“方言”。二、SQL通用语法SQL语句可以单行或多行书写以分号结尾。可使用空格和缩进来增强语句的可读性。MySQL数据库的SQL语句不区分大小写关键字建议使用大写。3种注释单行注释-- 注释内容 或 # 注释内容mysql特有多行注释 /* 注释 */三、SQL分类1、数据查询语言DQL, Data Query Language核心作用从数据库中查询 / 检索数据仅读取不修改数据是最常用的 SQL 类别。核心关键字SELECT核心、FROM、WHERE、GROUP BY、HAVING、ORDER BY、LIMIT、JOIN等。例如-- 查询年龄大于20的用户姓名和手机号按年龄降序排列 SELECT name, phone FROM users WHERE age 20 ORDER BY age DESC -- LIMIT 10;2、数据操作语言DML, Data Manipulation Language核心作用操作增 / 删 / 改数据库中的数据仅修改数据内容不改变表结构。核心关键字INSERT新增、UPDATE修改、DELETE删除、MERGE合并部分数据库支持。例如-- 新增一条用户记录 INSERT INTO users (name, age, phone) VALUES (张三, 25, 13800138000); -- 修改用户手机号 UPDATE users SET phone 13900139000 WHERE id 1; -- 删除年龄小于18的用户 DELETE FROM users WHERE age 18;3、数据定义语言DDL, Data Definition Language核心作用定义 / 修改 / 删除数据库对象表、索引、视图、触发器、数据库等的结构操作会直接生效无需事务提交。核心关键字CREATE创建、ALTER修改、DROP删除、TRUNCATE清空表属于 DDL 而非 DML、RENAME重命名。执行后通常需要COMMIT提交确认修改或ROLLBACK回滚撤销修改事务控制。例如-- 创建用户表 CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, age INT, phone VARCHAR(20) UNIQUE ); -- 给用户表新增email字段 ALTER TABLE users ADD COLUMN email VARCHAR(100); -- 删除用户表 DROP TABLE users; -- 清空用户表删除所有数据且不可回滚 -- TRUNCATE TABLE users;4、数据控制语言DCL, Data Control Language核心作用管理数据库的权限和事务控制用户对数据库的访问权限、事务提交 / 回滚等。核心关键字GRANT授权、REVOKE撤销权限、COMMIT提交事务、ROLLBACK回滚事务、SAVEPOINT保存点、SET TRANSACTION设置事务属性。例如-- 授予用户test对users表的查询/插入权限 GRANT SELECT, INSERT ON users TO testlocalhost; -- 撤销test用户的插入权限 REVOKE INSERT ON users FROM testlocalhost; -- 提交事务确认DML操作 COMMIT; -- 回滚事务撤销未提交的DML操作 ROLLBACK;5、事务控制语言TCL, Transaction Control Language补充说明部分分类体系中TCL 会从 DCL 中独立出来专门聚焦事务管理本质是 DCL 的子集。核心关键字COMMIT、ROLLBACK、SAVEPOINT。例如-- 开启事务部分数据库需显式声明 START TRANSACTION; UPDATE users SET age 26 WHERE id 1; -- 设置保存点 SAVEPOINT sp1; DELETE FROM users WHERE id 2; -- 回滚到保存点仅撤销删除操作修改操作保留 ROLLBACK TO sp1; -- 提交最终修改 COMMIT;四、SQL重要分类知识1、DDL操作数据库、表1C(Create)创建创建数据库create database 数据库名称;创建数据库判断不存在再创建create database [if not exists] 数据库名称;创建数据库并指定字符集create database 数据库名称 character set 字符集名;练习创建db4数据库判断是否存在并指定字符集为gbkcreate database if not exists db4 character set gbk;2R(Retrieve)查询查询所有数据的名称show databases;查询某个数据库的字符集查询某个数据库的创建语句show create database 数据库名称;查看表信息desc 表名3U(Update)修改修改数据库的字符集alter database db4 character set utf8;4D(Delete)删除删除数据库drop database 数据库名称;判断数据库存在存在再删除drop database if exists 数据库名称;5使用数据库use 数据库名称;6查询当前正在使用的数据库名称select database();2、操作表 CRUD1C(Create)创建-- 语法 create table 表名( 列名1 数据类型1 列名2 数据类型2 ...... 列名3 数据类型n ); --- 注意最后一列不需要加逗号2数据类型int:整数类型age int,double小数类型score double(5,2)date日期只包含年月日yyyy-MM-dddatetime日期包含年月日时分秒 yyyy-MM-dd HH:mm:sstimestamp时间戳类型 包含年月日时分秒 yyyy-MM-dd HH:mm:ssvarchar字符串name varchar(20)姓名最大20字符练习1创建表create table student( id int, name varchar(32), age int, score double(4,1), birthday date, insert_time timestamp );2复制表-- 仅复制表结构 create table if not exists 表名 like 被复制的表名; -- 整体复制 create table if not exists 表名 as select语句3R(Retrieve)查询查询某个数据库中所有的表名称show tables;查询表结构-- 仅查看表结构 desc 表名; -- 生成DDL show create table 表名;4U(Update)修改修改表名alter table 表名 rename to 新表名; rename table 表名 to 新表名修改表的字符集alter table 表名 character set 字符集名称;查看某张表的字符集show create table 表名;添加一列alter table 表名 add 列名 数据类型;修改列名称 类型-- 字段名和数据类型 alter table 表名 change 列名 新列名 新数据类型; -- 只修改数据类型 alter table 表名 modify 列名 新数据类型;删除列alter table 表名 drop 列名; -- drop table/database table_name/database_name5D(Delete)删除drop table 表名; drop table if exists 表名;3、DML:增删改表中数据1添加数据语法insert into 表名(列名1列名2列名3......,列名n) values(值1,值2,......值n);0 | null,值2,......值n # insert select 将select查询出来的数据插入到目标表中 insert into 表名 select statement;注意1.列名和值要一一对应;只需要对应字段数量相同2.如果表名后不定义列名则默认给所有列添加值insert into 表名 values(值1,值2,值3,......值n);3.除了数字类型其他类型需要使用引号单双都可以引起来2删除数据语法delete from 表名 [where条件]注意1.如果不加条件则删除表中所有记录2.如果要删除所有记录delete from 表名; --不推荐使用。有多少条记录就会执行多少次删除操作truncate table 表名; --推荐使用效率高 先删除表然后再创建一张一样的表。3修改数据语法update 表名 set 列名1 值1,列名2 值2,...... [where条件];注意如果不加任何条件则会将表中所有记录全部修改。4、DQL查询表中的记录1语法select 字段列表 from 表名列表 where 条件列表 group by 分组字段 having 分组之后的条件 order by 排序 limit 分页限定2基础查询1.多个字段的查询select 字段名1字段名2... from 表名;注意如果查询所有字段则可以使用*来替代字段列表。2.去除重复distinct3.计算列一般可以使用四则运算计算一些列值。一般只会进行数值型的计算null参与的运算计算结果都为null4.起别名asas也可以省略3条件查询1.where子句后跟条件2.运算符、、、、、、 BETWEEN...AND IN(集合) LIKE模糊查询 _:单个任意字符 %多个任意字符 IS NULL IS NOT NULL 注意 null 和 空字符串 的区别 and or not示例SELECT * FROM student WHERE age 20; SELECT * FROM student WHERE age 20; SELECT * FROM student WHERE age 20; SELECT * FROM student WHERE age ! 20; SELECT * FROM student WHERE age 20; SELECT * FROM student WHERE age 20 age 30; SELECT * FROM student WHERE age 20 AND age 30; SELECT * FROM student WHERE age BETWEEN 20 AND 30; SELECT * FROM student WHERE age22 OR age20 OR age25; SELECT * FROM student WHERE age IN(22,18,55); SELECT * FROM student WHERE english IS NOT NULL; SELECT * FROM student WHERE NAME LIKE 马%; SELECT * FROM student WHERE NAME LIKE _化; SELECT * FROM student WHERE NAME LIKE ___; SELECT * FROM student WHERE NAME LIKE %景% show variables like %char%4排序查询1、语法order by 子句order by 排序字段1 排序方式1排序字段2 排序方式2...2、排序方式ASC升序默认的DESC降序注意如果又多个排序条件则当前边的条件值一样时才会判断第二条件5聚合函数将一列数据作为一个整体进行纵向的计算注意聚合函数的计算排除null值可使用ifnull函数1、count:计算个数一般选择非空的列主键例如SELECT COUNT(NAME) FROM student;2、max:计算最大值例如SELECT MAX(math) FROM student;3、min:计算最小值例如SELECT MIN(math) FROM student;4、sum:计算和例如SELECT SUM(english) FROM student;5、avg:计算平均值例如SELECT AVG(math) FROM student;6分组查询语法group by 分组字段注意1.分组之后查询的字段分组字段、聚合函数2.where和having的区别where在分组之前进行限定如果不满足条件则不参与分组。having在分组之后进行限定如果不满足结果则不会被查询出来where后不可以跟聚合函数having可以进行聚合函数的判断例如1、按照性别分组分别查询男、女同学的平均分SELECT sex,AVG(math) FROM student GROUP BY sex;2、按照性别分组分别查询男、女同学的平均分人数SELECT sex,AVG(math),COUNT(id) FROM student GROUP BY sex;3、按照性别分组分别查询男、女同学的平均分人数 要求分数不低于70分的人不参与分组。SELECT sex,AVG(math),COUNT(id) FROM student WHERE math70 GROUP BY sex;4、按照性别分组分别查询男、女同学的平均分人数 要求分数不低于70分的人不参与分组分组之后人数大于2人。SELECT sex,AVG(math),COUNT(id) FROM student WHERE math70 GROUP BY sex HAVING COUNT(id)2;7分页查询语法limit 开始的索引每页查询的条数公式开始的索引 当前的页码 -1 * 每页显示的条数例每页显示3条记录SELECT * FROM student LIMIT 0,3; 第一页 SELECT * FROM student LIMIT 3,3; 第二页 SELECT * FROM student LIMIT 6,3; 第三页5、DCL:管理用户授权1管理用户1添加用户关闭密码复杂验证set global validate_password_policy0; set global validate_password_length1;语法CREATE USER 用户名主机名 IDENTIFIED BY 密码;例子CREATE USER zhangsanlocalhost IDENTIFIED BY 123; CREATE USER lisi% IDENTIFIED BY 123;2删除用户语法DROP USER 用户名主机名;例子DROP USER base%;3修改用户密码语法-- 老版本的写法 -- UPDATE USER SET PASSWORD PASSWORD(新密码) WHERE USER 用户名; SET PASSWORD FOR 用户名主机名 PASSWORD(新密码);例子set password for lisi% password(234567);4查询用户切换到mysql数据库USE mysql;查询user表select * from user;2权限管理1查询权限语法SHOW GRANTS FOR 用户名主机名; SHOW GRANTS FOR lisi%;2授予权限语法grant 权限列表 on 数据库名.表名 to 用户名主机名 [with grant option];例子-- 将表db3.account的SELECT ,DELETE, UPDATE权限授予用户lisi% GRANT SELECT ,DELETE, UPDATE ON db3.account TO lisi%; -- 给zhangsan用户所有权限 GRANT ALL ON *.* TO zhangsanlocalhost3撤销权限语法revoke 权限列表 on 数据库名.表名 from 用户名主机名;例子-- 将用户lisi%对于表db3.account的更新权限撤销 REVOKE UPDATE ON db3.account FROM lisi%; -- 给lisi用户撤销所有权限 REVOKE ALL ON *.* FROM lisi%;五、多表查询1、准备1准备sql-- 创建部门表 CREATE TABLE dept( id INT PRIMARY KEY auto_increment, NAME VARCHAR(20) ); -- 插入数据 INSERT INTO dept(NAME) VALUES (开发部),(市场部),(财务部); -- 创建员工表 CREATE TABLE emp( id INT PRIMARY KEY auto_increment, NAME VARCHAR(10), gender CHAR(1), -- 性别 salary DOUBLE, -- 工资 join_date DATE, -- 入职日期 dept_id INT, FOREIGN KEY(dept_id) REFERENCES dept(id) -- 外键关联部门表的主键 ); -- 插入数据 INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES (孙悟空,男,7200,2013-02-24,1), (猪八戒,男,3600,2010-12-02,2), (唐僧,男,9000,2008-08-08,2), (白骨精,女,5000,2015-10-07,3), (蜘蛛精,女,4500,2011-03-14,1);2笛卡尔积有两个集合A,B 取这两个集合的所有组成情况。例如A(a,b,c)B(1,2,3)A与B作笛卡尔积--- a,1 a,2 a,3 b,1 b,2 b,3 c,1 c,2 c,32、消除无用数据1内连接查询隐式内连接使用where条件消除无用数据-- 查询所有员工信息和对应的部门信息 SELECT * FROM emp,dept WHERE emp.dept_iddept.id; -- 查询员工表的名称性别。部门表的名称 SELECT emp.NAME ,emp.gender ,dept.NAME FROM emp,dept WHERE emp.dept_iddept.id; -- 或者 SELECT t1.NAME ,t1.gender ,t2.NAME FROM emp as t1,dept as t2 WHERE t1.dept_idt2.id;显式内连接--语法select 字段列表 from 表名1 [inner] join 表名2 on 条件 SELECT * FROM emp INNER JOIN dept ON emp.dept_iddept.id;2外连接查询左外连接语法select 字段列表 from 表1 left [outer] join 表2 on 条件 --查询的是左表所有数据以及其交集部分。右外连接语法select 字段列表 from 表1 right [outer] join 表2 on 条件 --查询的是右表所有数据以及其交集部分。3子查询查询中嵌套查询称嵌套查询为子查询。-- 查询工资最高的员工信息 -- 1.查询最高的工资是多少 9000 SELECT MAX(salary) FROM emp; -- 2.查询员工信息并且工资等于9000的 SELECT * FROM emp WHERE emp.salary9000; -- 一条sql就完成这个操作 SELECT * FROM emp WHERE emp.salary (SELECT MAX(salary) FROM emp);子查询不同情况:子查询的结果是单行单列的--子查询可以作为条件使用运算符去判断。 运算符 --查询员工工资小于平均工资的人 SELECT * FROM emp WHERE emp.salary (SELECT AVG(salary) FROM emp);子查询的结果是多行单列的--子查询可以作为集合使用in、not int --查询财务部和市场部所有员工信息 SELECT id FROM dept WHERE NAME财务部 OR NAME市场部; SELECT * FROM emp WHERE dept_id3 OR dept_id2; --使用子查询 SELECT * FROM emp WHERE dept_id in (SELECT id FROM dept WHERE NAME财务部 OR NAME市场部);子查询的结果是多行多列的--子查询可以作为一张虚拟表参与查询 --查询员工入职日期是2011-11-11日之后的员工信息和部门信息 -- 子查询 select * from dept t1 join (select * from emp where emp.join_date 2011-11-11) t2 where t1.id t2.dept_id; --普通内连接查询 select * from emp t1,dept t2 where t1.dept_id t2.id and t1.join_date 2011-11-114表的拼接拼接时两张表的结构必须完全一致union 对数据进行去重union all六、Linux 导入导出数据不是在mysql中运行 是在Linux中执行 即终端1、导入数据-- 本地导入数据 load data local infile 路径 into table 表名 fields terminated by 分隔符;2、导出数据# 数据库stu 表students 路径 mysqldump -uroot -p stu students /root/data/mydb.sql # 可以加到.bashrc中 alias db_backupmysqldump -uroot -p stu students /root/data/mydb_$(date %Y%m%d).sql # 备份并压缩生成 .sql.gz节省空间 alias db_backupmysqldump -uroot -p --single-transaction stu students | gzip /root/data/mydb_$(date %Y%m%d).sql.gz3、查看DDL 查看当前数据库-- 查看DDL语句 show crete table students; -- 查看当前数据库 select database();4、限制查询limit 关键字select * from students limit 10;