首页 > 数据库 >sql语句

sql语句

时间:2023-07-30 17:11:06浏览次数:31  
标签:语句 sql 查询 select emp 表名 where SELECT

  • SQL通用语法

  1. SQL语句可以单行或多行书写,以分号(“;”)结尾。
  2. SQL语句可以使用空格/缩进来增强语句的可读性。
  3. MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。
  4. 注释:
    • 单行注释:--注释内容 或 # 注释内容(MySQL特有)
    • 多行注释:/*注释内容*/
  • SQL分类

分类 全称 说明
DDL Data Definition Language 数据定义语言,用来定义数据库对象(数据库,表,字段)
DML Data Manipulation Language 数据操作语言,用来对数据库表中的数据进行增删改
DQL Data Query Language 数据查询语言,用来查询数据库中表的记录
DCL Data Control Language 数据控制语言,用来创建数据库用户、控制数据库的访问权限
  • DDL-Data Definition Language-数据定义语言-数据库操作

    • 查询

      查询所有数据库

      SHOW DATABASES;
      

      查询当前数据库

      SELECT DATABASE();
      
    • 创建

      CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARSET 字符集] [COLLATE 排序规则];
      
    • 删除

      DROP DATABASE[IF EXISTS]数据库名;
      
    • 使用

      USE 数据库名;
      
  • DDL-表操作-查询

  • 查询当前数据库所有表

    SHOW TABLES;
    
  • 查询表结构

    DESC 表名;
    
  • 查询指定表的建表语句

    SHOW CREATE TABLE 表名;
    
  • DDL-表操作-创建

  • DDL-表创建-修改

    • 添加字段

      ALTER TABLE 表名 ADD 字段名 类型(长度) [COMMENT 注释] [约束];
      
    • 修改数据类型

      ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);
      
    • 修改字段名和字段类型

      ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度) [COMMENT 注释] [约束];
      
    • 删除字段

      ALTER TABLE 表名 DROP 字段名;
      
    • 修改表名

      ALTER TABLE 表名 RENAME TO 新表名;
      
    • 删除表

      DROP TABLE [IF EXISTS] 表名;
      
    • 删除指定表,并重新创建该表

      TRUNCATE TABLE 表名;
      
  • DML-Data Manipulation Language-数据操作语言

    • 添加数据

    • 给指定字段添加数据

      INSERT INTO 表名(字段名1,字段名2,...) VALUES(值1,值2,...);
      
    • 给全部字段添加数据

      INSERT INTO 表名 VALUES(值1,值2,...);
      
    • 批量添加数据

      INSERT INTO 表名(字段名1,字段名2,...) VALUES (值1,值2,...),(值1,值2,...),(值1,值2,...);
      
      INSERT INTO 表名 VALUES()(值1,值2,...),(值1,值2,...),(值1,值2,...);
      
    • 注意:

      • 插入数据时,指定的字段顺序需要与值得顺序是一一对应得。
      • 字符串和日期型数据应该包含在引号中。
      • 插入得数据大小,应该在字段的规定范围内
  • DML-修改数据

    • 修改数据

      UPDATE 表名 SET 字段名1 = 值1,字段名2 = 值2 , ...[WHERE 条件];
      
    • 注意:

      修改语句得条件可以有,也可以没有,如果没有,则会修改整张表的所有数据。

  • DML-删除数据

    • 删除数据

      DELETE FROM 表名 [WHERE 条件]
      
    • 注意:

      • DELETE 语句的条件可有可无,如果没有条件,则会删除整张表的所有数据。
      • DELETE 语句不能删除某一个字段的值(可以只用UPDATE)。
  • DQL -Data Query Language-数据查询语言

    • DQL-基本查询

    • 查询多个字段

      SELECT 字段1,字段2,字段3... FROM 表名;
      
      SELECT * FROM 表名;
      
    • 设置别名

      SELECT 字段1 [AS 别名1],字段2 [AS 别名2]...FROM 表名;
      
    • 去除重复记录

      SELECT DISTINCT 字段列表 FROM 表名;
      
    • DQL-条件查询

    • 语法

      SELECT 字段列表 FROM 表名 WHERE 条件列表;
      
    • 条件

      image-20230729115711071

    • DQL-聚合函数

    • 将一列数据作为一个整体,进行纵向计算

      SELECT 聚合函数(字段列表) FROM 表名;
      

      image-20230729134348752

    • 注意:NULL值不参与所有聚合函数运算

    • DQL-分组查询

    • 语法

      SELECT 字段列表 FROM 表名 [WHERE 表名] GROUP BY 分组字段名 [HAVING 分组后过滤条件];
      
    • where和having区别

    • 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤

    • 判断条件不同:where不能对聚合函数进行判断,而having可以

    • 注意:

    • 执行顺序:where > 聚合函数 > having

    • 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。

    • DQL-排序查询

    • 语法

      SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1,字段2 排序方式2;
      

      ASC:升序(默认) DESC:降序

    • 注意:

    • 如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。

    • DQL-分页查询

    • 语法

      SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询记录数;
      
    • 注意

    • 起始索引从0开始,起始索引 = (查询页码 - 1)* 每页显示记录数

    • 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT

    • 如果查询的是第一页数据,起始索引可以忽略,直接简写为limit10。

  • 练习

  • 查询年龄为20,21,22,23岁的女性员工信息

    select * from emp where gender = ’女‘ and age in(20,21,22,23);
    
  • 查询性别为 男,并且年龄在 20 - 40 岁(含)以内的姓名为三个字的员工。

    select * from emp where gender = '男' and age between 20 and 40 and name like '___'
    
  • 统计员工表中,年龄小于60岁的,男性员工和女性员工人数

    select gender, count(*) from emp where age < 60 group by gender;
    
  • 查询所有年龄小于等于35岁员工的姓名和年龄,并对查询结果按年龄升序排序,若相同按入职时间倒序排序

    select name,age from emp where age <=35 order by age asc, entrydate desc;
    
  • 查询性别为男,且年龄在20-40岁(含)以内的前5个员工信息,对查询的结果按年龄升序排序,年龄相同按入职时间升序排序。

    select * from emp where gender = '男' and age between 20 and 40 order by age asc,entrydate asc  limit 5;
    
  • DQL-执行顺序

image-20230729165259483

  • DCL-Data Control Language-数据控制语言,用来管理数据库用户、控制数据库的访问权限。

  • DCL-管理用户

    • 1 查询用户

      USE mysql;
      SELECT * FROM user;
      
    • 2 创建用户

      CREATE USER '用户名'@'主机名'  IDENTIFIED BY '密码';
      
    • 3 修改用户密码

      ALTER USER '用户名’@‘主机名' IDENTIFIED WITH mysql_native_pawwword BY '新密码';
      
    • 4 删除用户

      DROP USER '用户名'@’主机名‘;
      
    • 注意:

    • 主机名可以使用%统配。

    • 这类SQL开发人员操作少,主要是DBA(Database Administrator 数据库管理员)使用。

  • DCL-权限控制

image-20230729172512498

  • 1.查询控制

    SHOW GRANTS FOR '用户名'@’主机名‘;
    
  • 2 授权权限

    GRANT 权限列表 ON 数据库名.表名 TO '用户名'@’主机名‘;
    
  • 3 撤销权限

    REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@’主机名‘;
    
  • 注意:

  • 多个权限之间,使用逗号分隔

  • 授权时,数据库名和表名可以用*进行通配,代表所有。

!!!!!!

!!!!!!

!!!!!!

  • 多表查询

  • 连接查询-内连接

  • 内连接查询语法(查询两个表交集)

    • 隐式内连接
    SELECT 字段列表 FROM 表1,表2 WHERE 条件...;
    
    • 显式内连接
    SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 连接条件...;
    
  • 外连接查询语法(查询交集和中间的部分)

    • 左外连接
    SELECT 字段列表 FROM 表1 LERT [OUTER] JOIN 表2 ON 条件...;
    
    • 右外连接
    SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件...;
    
  • 自连接(可以是内连接查询,也可以是外连接查询)

    SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件...;
    
  • 联合查询--union,union all(把多次查询的结果合并起来,形成一个新的查询结果集)

    SELECT 字段列表 FROM 表A...
    UNION [ALL]			#去掉ALL可以去重
    SELECT 字段列表 FROM 表B...;
    
    • 注意:
    • 联合查询的多张表的列数必须保持一致,字段列表也需要保持一致。
    • union all会将全部的数据直接合并在一起,union会对合并后的数据去重。
  • 子查询--SQL语句中嵌套SELECT语句,称为嵌套查询,又称子查询。

    SELECT * FROM T1 WHERE column1 = (SELECT column1 FROM T2);
    

    子查询外部的语句可以是INSERT / UPDATE / DELETE / SELECT 的任何一个。

    • 标量子查询(子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式)

    • 常见的操作符:= <> > >= < <=

    • 列子查询(子查询返回的结果是一列(可以是多行))

    • 常见的操作符:IN 、NOT IN 、 ANY 、 SOME 、 ALL

    • 行子查询(子查询返回的结果是一行(可以是多列))

    • 常见的操作符:=、<> 、 IN 、 NOT IN

    • 表子查询(子查询返回的结果是多行多列)

    • 常见的操作符:IN

!!!!!!

!!!!!!

!!!!!!

  • 练习

  • 1、查询员工的姓名、年龄、职位、部门信息(隐式内连接)(表:emp,dept)

select e.name , e.age , e.job , d.name from emp e , dept d where e.dept_id = d.id;
  • 2、查询年龄小于30岁的员工的姓名、年龄、职位、部门信息(显示内连接)(表:emp,dept)
select e.name , e.age , e.job , d.name from emp e inner join dept d on e.dept_id = d.id age < 30; 
  • 3、查询拥有员工的部门ID、部门名称
select distinct d.id ,d.name from emp e , dept d where e.dept_id = d.id;
  • 4、查询所有年龄大于40岁的员工,及其归属的部门名称;如果员工没有分配部门,也需要展示出来
select e.*, d.name from emp e left join dept d on e.dept_id = d.id where e.age > 40;
  • 5、查询所有员工的工资等级
select e.* ,s.grade from emp e,salgrade s where e.salary >= s.losal and e.salary <= s.hisal;

可用between and替换为

select e.* ,s.grade from emp e,salgrade s where e.salary between s.losal and s.hisal;
  • 6、查询“研发部”所有员工信息及工资等级(表:emp , salgrade , dept)
select e.* , s.grade from emp e , dept d,salgrade s where e.dept_id = d.id and (e.salary between s.losal and s.hisal ) and d.name = '研发部';
  • 7、查询“研发部”员工的平均薪资(表:emp , dept)
select avg(e.salary) from emp e ,dept d where e.dept_id = d.id and d.name = '研发部';
  • 8、查询工资比"灭绝"高的员工信息
select * from emp where salary > (select salary from emp where name = '灭绝');
  • 9、查询比平均薪资高的员工信息
select * from emp where salary > (select avg(salary) from emp);
  • 10、查询低于本部门平均工资的员工信息
select * from emp e2 where e2.salary < (select avg(e1.salary) from emp e1 where e1.dept_id = e2.dept._id); 
  • 11、查询所有的部门信息,并统计部门的员工人数
select d.id , d.name , (select count(*) from emp where dept_id = 1) '人数' from dept d;
  • 12、查询所有学生的选课情况,展示除学生名称,学号,课程名称
select s.name , s.no ,c.name from student s, student_course sc , course c where s.id = sc.studentid and sc.courseid = c.di;

标签:语句,sql,查询,select,emp,表名,where,SELECT
From: https://www.cnblogs.com/itxiaoguoba/p/17591697.html

相关文章

  • MySQL Group Replication 搭建
    目录参考资料环境准备说在前面单服务器部署1windows要求与限制1.1下载并解压mysql5.7.311.2创建数据库文件保存目录data1.3添加配置文件1.4初始化数据1.5依次启动3个实例1.6调整root用户名密码1.7创建复制使用的用户凭证1.8引导组复制1.9验证报错参考资料https......
  • CDP7环境下使用SparkSQL Shell方式
    相信很多在用CDP7的小伙伴都遇到了Spark里面不再支持spark-sql的问题这里给出两种解决方案:spark-submit与spark-shellcloudera官方给的解决方案https://docs.cloudera.com/cdp-private-cloud-base/7.1.5/developing-spark-applications/topics/spark-sql-example.html基于这个方案,......
  • mysql 简单进阶 ———— 多列索引[一]
    前文整理一下mysql的一些简单进阶技巧,来源于高性能mysql,但不是根据书的序列来的。正文有一个问题,那就是我们为什么要创建多列索引呢?这是要思考的一个问题。为什么创建多列索引,而不是创建多个单列索引。需要弄明白这个问题,那么就需要知道索引是如何工作的。为什么有索引这个......
  • 浅谈SQL注入及其防御方法
    昨晚跟学生们在群里讨论到什么是SQL注入的时候,硬挤出来了一个比喻.码字不易,特整理记录如下.  首先,电脑里面的语言分两种,编译型,解析型(脚本型).比如PHP就是解析型,C就是编译型.由于SQL语句可以在这两类语言下执行,所以为了充分明白是什么导致了SQL注入漏洞,我......
  • Mysql数据库中数据量特别大,读取特别慢,已经做了索引,怎么优化
    当MySQL数据库中的数据量特别大,读取操作变得特别慢,即使已经添加了索引,仍然需要进一步优化。下面是一些建议以及示例代码来优化这种情况:使用合适的索引:确保为频繁查询的列添加了合适的索引。可以使用EXPLAIN语句来分析查询的执行计划,检查是否正确使用了索引。示例代码:sqlCopycodeE......
  • Sqli-labs靶场之SQL手注通关详解(Less 1~10)
    Less-1 GET-Errorbased-Singlequotes-String判断注入点,这里的页面中没有可以注入的地方,因此可以判断注入点在url栏。判断注入类型id=1and1=1页面正常id=1and1=2页面正常id=1'and1=1--+页面正常id=1'and1=2--+ 页面正常由此可以判断该注入......
  • 不启动SpringBootApplication 直接测试mybatis 下面xml中的sql
     测试类 privatestaticSqlSessionsqlSession=null;privatestaticRunoobTblMappermapper; @BeforeClasspublicstaticvoidsetUpMybatisDatabase()throwsIOException{InputStreamresourceAsStream=null;try{ClassLoaderclassLoader=R......
  • MySQL学习-DML(Data Manipulation Language)数据--select语句02
    表连接:分为内连接和外连接,常用内连接。当需要同时显示多个表中字段时,就可以用表连接。内连接:仅选出两张表中互相匹配的记录外连接:还会选出其他不匹配的记录外连接包含左连接和右连接左连接: ......
  • 6、Mysql创建用户以及授权
    文件夹就是数据库文件就是表数据行就是行 data下的mysql这个数据库里有张User表,里面保存了用户信息 showdatabases;查看所有数据库 usemysql;使用这个use数据库(进入这个文件夹) showtables;查看这个数据库下所有的表(文件)文件最后有个user,我们登陆mysql服务器......
  • PYTHON mysql形成分割文件
    importrandom,string,re,time,sys,hashlib,pymysql,requestsf=open("aa.txt","w")connect=pymysql.connect(user='root',password='123456',db='new',host......