SQL语句学习

1)什么是SQL语句:

        SQL 是一种标准化的语言,它允许你在数据库上执行操作,如创建数据库、表等等,查询内容,更新内容,并删除条目等操作。Create, Read, Update, and Delete 通常称为CRUD操作。

SQL语句分类 :

  • DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等。

  • DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据)。

  • DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别。

  • DQL(Data Query Language):数据查询语言,用来查询记录(数据)。

· 

2)常见SQL语句:

·

2.1)查询前10条数据:

MySQL、PostgreSQL使用limit
        select * from 表名 order by id(主键)limit 10
​
sql server使用top
        select top (10) * from表名
        
Oracle使用rownum
        select * from 表名 where rownum <=10

·

2.2)查询第11条到第15条数据

MySQL使用 limit m,n
    select * from 表名 limit 10,5
​
PostgreSQL使用 limit m offset n
    select * from 表名 limit 5 offset 10
​
SQL Server使用top
    select top 5 * from 表名 where 排序字段not in (select top 10 排序字段from 表名)
​
Oracle使用rownum
    select * from (select 字段,rownum rn from 表名where rownum <= 15)where rn >= 10;

·

2.3)查询表中的各个字段信息:

select * from all_tab_columns where table_name='CS_CSSCODEDEF_DICT';

·

3)你常用到的SQL语句:

1)对数据库和数据表的操作:

Show databases
​
Show tables
​
Insert into 表名() values()
​
Update 表名 set 字段=值 where ...
​
Delete from 表名 where ...
​
Select * from 表名 where 条件 order by ...
​
Desc/asc limit ...Group by ... Having ...
​
create database test1222;  #创建数据库
​
show databases;  #显示当前所有的数据库
​
alter database test1222 character set utf8;  #修改当前数据库的字符编码为utf8
​
drop database if exists test122202;  #删除数据库test122202,如果该数据库存在的话
​
# ---------------------------------
​
create table if not exists student(
    id int primary key auto_increment,   #主键约束,自动增长约束
    `name` varchar(30) not null unique, #非空约束,唯一约束
    age int,
    address varchar(40),
    heigh double(5,2),  #这是浮点数类型,最多5位,其中必须有两位小数,即最大值为999.99
    weight decimal(5,2), #这是精确数值类型,我们定义为:能够存储具有五位数和两位小数的任何值,存储范围为-999.99至999.99。 
    jianjie text, #这是大文本字符串类型,适合存储比较大的文本数据
    photo blob, #这是二进制数据类型,适合存储图片、音频、视频等
    birthday date, #日期类型,格式为:yyyy-mm-dd
    ruxuetime datetime #日期时间类型 yyyy-mm-dd hh:mm:ss
)charset=utf8;
​
# ---------------------------------
​
drop table table_name;  #删除某个表;
​
show tables;  #显示当前的库中所有的数据表;
​
desc student;  #查看数据表student中的所有字段;
​
alter table student add company varchar(50); #为student表增加一个字段;
​
​
#一次添加多条数据:
insert into student(id,`name`,age,address) values (4,'曹操',27,'北京海淀'),(5,'周瑜',28,'北京朝阳'),(6,'赵云',30,'北京大兴');
​
update student set age=24,address="河北保定" where id=1;  #更新某条数据
​
update student set age=age+5;  #将所有的年龄都加5岁;
​
# ---------------------------------
​
delete from student where `name`="zhangsan";   #删除表中的某个字段;
 #对比:
drop table table_name;  #删除某个表;

· 

2)其他命令:

进入mysql管理命令行的命令?
​
Mysql -uroot -p 回车 密码
​
showdatabases; 
​
显示当前 mysql 服务器中有哪些数据库
​
show  create database  mysql;  
​
显示创建数据库的 sql 语句
​
show  create table  user; 
​
显示创建表的 sql 语句
​
desc user; 
​
查询 user 表的结构
​
explain select *   from  user;
​
获取 select 相关信息
​
show processlist;
​
显示哪些线程正在运行
​
SHOW VARIABLES;
​
显示系统变量和值
​
SHOW  VARIABLES like  ’ %conn% ’ 
​
显示系统变量名包含 conn 的值
​
LEFT  JOIN
​
SELECT A.id,A.class FROM A LEFT JOIN B ONA.cid=B.id
​·

4)SELECT语句书写顺序:

语法:

select 列名 from 表名 【where --> group by-->having--> order by-->limit】

  select selection_list /*要查询的列名称*/
​
  from table_list /*要查询的表名称*/
​
  where condition /*行条件*/
​
  group by grouping_columns /*对结果分组*/
​
  having condition /*分组后的行条件*/
​
  order by sorting_columns /*对结果排序*/
​
  limit offset_start, row_count /*结果限定*/

·

5)字段控制查询

1)去除重复记录

针对的情况:(两行或两行以上记录中,列的数据都相同),

去除重复记录,需要使用DISTINCT:

SELECT DISTINCT sal FROM emp;

·

2)concat()方法:字符串拼接;

# 注意: 
# 字符串的合并不能使用+,使用concat()方法; 比如:
 
    select *,concat(ename,'______',job) from emp;

·

6) 给列名添加别名

我们给这一列给出一个别名,为total:

SELECT *, sal+IFNULL(comm,0) AS total FROM emp;
​
给列起别名时,是可以省略AS关键字的:
SELECT *,sal+IFNULL(comm,0) total FROM emp;

·

7) 排序

(1) 查询所有学生记录,按年龄升序排序

SELECT *
FROM stu
ORDER BY age ASC;

·

(2) 查询所有学生记录,按年龄降序排序

SELECT *
FROM stu
ORDER BY age DESC;

·

(3) 查询所有雇员,按月薪降序排序,如果月薪相同时,按编号升序排序

SELECT * FROM emp
ORDER BY sal DESC,empno ASC; 

·

8) 聚合函数

  COUNT():统计指定列不为NULL的记录行数;

  MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;

  MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;

  SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;

  AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;

·

(1) COUNT

注意,因为count()函数中给出的是comm列,那么只统计comm列非NULL的行数。

查询emp表中月薪大于2500的人数:

SELECT COUNT(*) FROM emp WHERE sal > 2500;

查询有佣金的人数,以及有领导的人数:

SELECT COUNT(comm), COUNT(mgr) FROM emp;

·

(2) SUM和AVG

查询所有雇员月薪和:

SELECT SUM(sal) FROM emp;

统计所有员工平均工资:

SELECT AVG(sal) FROM emp;

·

(3) MAX和MIN

查询最高工资和最低工资:

SELECT MAX(sal), MIN(sal) FROM emp;

·

9) 分组查询

例如查询每个部门的工资和,这说明要使用部门来进行分组。

分组查询时使用GROUP BY子句

注:凡是和聚合函数同时出现的字段名,则一定要写在group by 之后

·

9.1) 分组查询

查询每个部门的部门编号和每个部门的工资和:

SELECT deptno, SUM(sal) FROM emp GROUP BY deptno;
​
# 注: deptno字段和SUM聚合函数同时出现,所以deptno在group by之后;

查询每个部门的部门编号以及每个部门的人数:

SELECT deptno,COUNT(*) FROM emp GROUP BY deptno;

查询每个部门的部门编号以及每个部门工资大于1500的人数:

SELECT deptno,COUNT(*) FROM emp WHERE sal>1500 GROUP BY deptno;

·

9.2) HAVING子句

    HAVING语句通常与GROUP BY语句联合使用,用来过滤由GROUP BY语句返回的结果集。

eg: 查询 工资总和大于9000 的部门编号以及工资和:

SELECT deptno, SUM(sal) FROM emp GROUP BY deptno HAVING SUM(sal) > 9000;

注:having与where的区别:

   1. having是在分组后对数据进行过滤,
      where是在分组前对数据进行过滤            

    2. having的字句中可以使用聚合函数
       where的字句中不可以使用聚合函数。

    3. where是对分组前记录的条件,如果某行记录没有满足WHERE子句的条件,那么这行记录不会参加分组;        而having是对分组后才对数据进行约束。

·

10) LIMIT限制

LIMIT用来限定查询结果的起始行,以及总行数。

1> 起始行从0开始,查询前5行记录,

SELECT * FROM emp LIMIT 0, 5;

注意,起始行从0开始,即第一行开始!

2> 起始行从3开始,查询10行记录,

SELECT* FROM emp LIMIT 3, 10;

你可能感兴趣的:(数据库以及SQL相关,sql)