SQL基础操作

1.链接服务器
  • 从命令行中连接mysql服务器的简单实例:
[root@host]# mysql -u root -p
#使用root账户直接使用密码password(没错,就是和-p之间无空格),直接登录到tutorial数据库
mysql -u root -ppassword tutorial;

  • 退出 mysql> 命令提示窗口可以使用 exit 命令
mysql> exit 
  • 创建用户,并给用户赋予数据库的权限
//创建用户
CREATE USER 'r&d'@'host' IDENTIFIED BY 'mysql';
//授权
grant all privileges on tutorial.*  to 'r&d'@'localhost' identified by 'xyz';
  • 使用创建的用户帐号登录
mysql -u learnersql -p
2.服务器端mysql服务
  • 启动:
sudo service mysql start

查看状态:

sudo service mysql status

停止服务:

sudo service mysql stop
3.基本操作
  • 创建数据库
CREATE DATABASE 数据库名;
  • 选择数据库
USE 数据库名;
  • 操作数据表
#增加某一列
ALTER TABLE CORPORATION  ADD PROFITS FLOAT;
#删除某一列
ALTER TABLE Persons DROP COLUMN DateOfBirth;
#修改某一列的属性
ALTER TABLE person MODIFY gender ENUM('M','F');
#删除数据表
DROP TABLE table_name ;
#查看数据表中的列信息
DESC Tab_name
  • 操作数据库
DROP DATABASE 数据库名称;
#查看数据库中的表信息
SHOW TABLES
  • 创建数据表
#CREATE TABLE table_name (column_name column_type);
CREATE TABLE Student(
   ID   INT NOT NULL AUTO_INCREMENT,
   NAME VARCHAR(20) NOT NULL,
   AGE  INT NOT NULL,
   //GENDER CHAR(1) CHECK (GENDER IN ('M','F'))
   GENDER ENUM('M','F')//设置约束
   // PRIMARY KEY (ID)
   CONSTRAINT pk_Student PRIMARY KEY(ID);//设置主键
);
  • 创建复合主键数据表
CREATE TABLE favorite_food 
( person_id SMALLINT UNSIGNED AUTO_INCREMENT,
food VARCHAR(20),
CONSTRAINT pk_favorite_food PRIMARY KEY (person_id,food),   
CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id)
REFERENCES person (person_id)
);
  • 增删改查CRUD(Create Delete Read Update)
#增
INSERT INTO Person (NAME,AGE) VALUES ('Liu Xijun',32);
#删
DELETE FROM Person WHERE ID=1;
#改
UPDATE Person SET age=31 WHERE ID=2;
#查
SELECT * FROM Person limit 1;
  • 存储过程

    --- 创建存储过程
    create procedure procedureName()
    begin
    
    end
    --- 调用存储过程
    call procedureName;
    --- 删除存储过程
    drop procedure if exists procedureName;
    
  • 按条件查询:过滤

    • 任意字符匹配
    符号或函数含义
    _正好1个字符
    %任意个,包括0个
    RIGHT(string,3)=‘xyz’判断string后三个字符是否为’xyz’
    LEFT(string,3) LIKE ‘A_B’开头的三个字母是否以A开头B结尾
    col_name REGEXP '^[AB]'支持正则表达式,是否以AB开头
    CONCAT(string1,string2)连接两个字符串
    • NULL值.两点:两个NULL值不相等表达式可以为NULL,但不能=NULL。判断条件:IS NULL,!=6 OR IS NULL查询防止漏查。
  • 连接(Join)
    left join、right join、inner join.

  • 集合操作

    • union:对要合并的查询结果进行去重合并(需一定条件,如列的类型相同等)
    • intersect: 取交集,优先级最高
    • except: A EXCEPT B,取A中除去与B相交的部分。
  • 处理字符串数字或临时数据的生成转换和操作

    SQL本身无相关指令,都是数据库服务器本身内建函数。

    • 字符串类型
    类型描述oracle情况
    CHAR定长字符串,CHAR(30)最大2000字节
    VARCHAR变长字符串4000字节
    TEXT/CLOB大长度的变长字符串128TB的文档

    VARCHAR:超出设置的长度将报错,服务器按需分配,不会因设置最大的字符串长度而浪费资源。

    • 查看SQL服务器工作模式
    SELECT @@session.sql_mode
    
    • 设置mode
    SET sql_mode='ansi'
    
    • 单引号转义
    ‘It's cool!' ---> 'It''s cool'
    
    • 对查询结果进行转义
    quote(column_name)
    
    • 根据ASCII码数值生成字符
    SELECT CHAR(65,66)//A,B
    
    • 连接字符串
    SELECT CONCAT('A',CHAR(66),'c')//ABC
    
    • 根据字符值查ASCII码值
    SELECT ASCII('A')//65
    
    • 查看字符串长度
    SELECT LENGTH('ABCD');//4
    
    • 查看子字符串在原始字符串中的位置
    SELECT POSITION('R'IN'STRING');//3,从1开始计位,Oracle中使用instr()函数
    
    • 在字符串中插入替换字符串
    #insert
    select insert('this is fine.',5,0,' story');//this story is fine.
    select insert('this is fine.',5,1,',story,');//this,story,is fine.
    //四个参数:原始字符串,起始位置,替换长度,要插入的字符串
    # replace,mysql和oracle都支持
    select replace('good world!','good','hello');//hello world!
    select substring('morning',2,3);//orn,string,pos,length
    
  • 数值类型的常用操作

函数名描述支持
Acos(x)反cos
Asin(x)反sin
Atan(x)反tan
Cos(x)
Sin(x)
Tan(x)
Cot(x)正切的倒数
Exp(x)自然数的x次方
Ln(x)以自然数为底x的对数
Sqrt(x)平方根
MOD(4,2)2,求余数Mysql中可对小数取余
POW(2,4)16,x的y次方
—精度控制——精度控制——精度控制—
CEIL(1.2)2,向上取正
FLOOR(1.2)1,向下取正
ROUND(2.5)3,四舍五入
ROUND(2,584,2)2.58,小数后保留2位小数
TRUNCATE(2.1234,2)2.12,保留2位非四舍五入
ROUND和TRUNCATE第2个参数可为负,小数点左侧截几位
SIGN(x)正1零0负-1
ABS(x)绝对值
  • 日期类型数据操作

    • 常用时区设置
    //Mysql查看时区设置
    select @global.time_zone, @@session.time_zone;
    
    • 常用的日期时间格式
    类型默认格式
    DateYYYY-MM-DD
    DatetimeYYYY-MM-DD HH:MI:SS
    TimestampYYYY-MM-DD HH:MI:SS
    TimeHHH:MI:SS
    • 常用函数
    >>SELECT CAST('2019-09-12' AS DATE) date_field, CAST('108:17:57' AS TIME) time_field;//将字符串转换成对应的日期类型Date,Time;
    //Mysql中cast函数对数据分隔符要求宽松,/,-等都OK
    >>>SELECT CAST('123499' AS UNSIGNED INTEGER);//123499
    //将字符串转换为数字
    //str_to_date,根据个是字符串的返回,Date\Time类型
    //cast函数不支持的字符串转换成日期函数
    >>>SELECT STR_TO_DATE('September 17, 2018','%M %d,%Y');
    //系统内建函数返回当前日期或时间的字符串
    mysql> SELECT CURRENT_DATE() date,CURRENT_TIME() time,CURRENT_TIMESTAMP timestamp;
    //date_add,为指定的日期增加一段时间(如年月日),并返回新的日期
    >>>SELECT DATE_ADD(CURRENT_DATE(),INTERVAL 5 DAY);
    //last_day取当月最后一天
    >>>select last_day('2019-10-23')//2019-10-31
    //dayname函数返回日期是星期几
    >>>SELECT DAYNAME('2019-10-27');//Sunday
    //extract从日期字符串中提取感兴趣的时间间隔类型
    >>>SELECT EXTRACT(YEAR FROM '2019-10-28 14:26:54');//2019
    //获取时间间隔
    >>>select datediff('2019-01-21','2019-10-27');279
    
  • 聚合和分组

    • 分组与筛选
    //对查询结果进行分组,因分组还未创建不能使用where进行筛选
    select person_id from favorite_food group by person_id having count(person_id)>3;
    
    • 常用聚合函数
    函数描述
    MAX()返回集合中的最大值
    MIN()返回集合中的最小值
    AVG返回集合中的平均值
    SUM返回集合中所有值的和
    COUNT返回集合中值的个数
    • 隐式分组:包含查询的所有行

    • 显示分组:使用聚集函数时,显示使用GROUP BY 进行分组,在分组上使用聚集函数。

    • 只计数某个列的不同值

    select count(distinct(person_id)) from favorite_food;
    
    • 使用表达式作为聚集函数参数
    select avg(person_id-1) from favorite_food;
    
    • 聚集函数对Null值的处理:COUNT(valaue),MAX等忽视null值,COUNT(*)会加1,因统计的是表格中的行数;
    • group by 多列
    //每年级每班有多少人,班下面还可以有小组
    select grade,class,sum(student_num) from students group by grade,class
    
    • with rollup
    //同时算出每年级每班有多少人 及每年级总共有多少人
    select grade,class,sum(student_num) from students group by grade,class with rollup;
    
    • with cube,可计算每年级总共有多少人,每个班(1,2班各个年级同班名的学生数和,假如他们都在一个班上课)有多少人。
    • <> ALL 不等于值集中的所有值,<ALL小于值集中的所有值
    • ANY与值集中的每个比较,有一个成立就为真
    select * from students
     where student_num > 
     any(
         select
         	student_num
         from students
         where student_num>14);
    
  • 查询

    • 非关联子查询
      子查询独立于包含子句,可以被单独执行,并可检验结果
    • 关联子查询
      关联子查询依附于包含语句并引用其一列或多列,为每一候选行执行一次。
      • EXISTS,where exists检验子查询能否返回至少一行
      • NOT EXISTS,关联子查询返回零行
      • 关联子查询也广泛用于Delete和Update语句中。
  • 子查询总结

    • 返回的结果可以是单列单行,多列多行,单列多行
    • 可以独立于包含子句,(非关联子查询)
    • 可以引用包含语句中的一行或多行,(关联子查询)
    • 可以用于条件中,包括比较运算符及in,not in,exists和not exists等
    • 可以出现在select,update,delete,insert语句中
    • 其结果集可与其他表或子查询结果连接
    • 可以用子查询结果来填充表或查询结果集中的一列
    • 可用于查询中的select\from\where\having\order by 子句
  • 连接join

    • 左外连接(left outer join)仅包含第一个表的所有行,仅仅包含第二个表中那些匹配的行。
    • 使用子查询可减少使用连接的数量
    • 右外连接(RIGHT OUTER JOIN)仅包含第一表中满足条件行第二表中所有行。
    • INNER JOIN,满足条件的第1第2表中的行
    • CROSS JOIN交叉连接,结果MN行 = 第1表M行x第2表N行
    • NATURAL JOIN(不需连接条件不推荐使用),自然连接,依赖多表交叉时的相同列名来推断正确的连接条件。
  • 条件逻辑

    • 随着遇到的数据不同,采取不同的执行方式
    • CASE表达式
      • 查找型
      CASE 
          WHEN C1 THEN E1
          WHEN C2 THEN E2
          [ELSE ED]
      END
      
      • 简单型
      CASE V0
          WHEN V1 THEN E1
          WHEN V2 THEN E2
          [ELSE ED]
      END
      
      只能判断V1V0是否相等的条件,不如查找型强大灵活
    • 逻辑表达式常用场景
      • 结果集变换,列变行
      • 选择性聚合
      • 存在性检查
      • 除零错误
      • 有条件更新
      • NULL值处理
  • 事务

    • MYSQL关闭自动提交模式,关闭后一次会话内对数据库所做的更改如不手动提交,会话结束后不会被保存。
    SET AUTOCOMMIT=0
    
    • ALTER TABLE指令将会将当前事务提交,并启动一个新事务。
    • 查看表使用的存储引擎
    SHOW TABLE STATUS LIKE TABLE_NAME \G;
    
    • 锁,数据库被并发访问时的资源控制策略,表锁页锁行锁。
    • 常用事务操作:
    --- 创建事务
    START TRANSACTION;
    UPDATE TABLE_NAME (COL_NAME) VALUES (VALUE1) WHERE;
    -- 创建保存点
    SAVEPOINT POINT_NAME1;
    DELETE FROM TABLE_NAME WHERE COND;
    ---创建保存点
    SAVEPOINT POINT_NAME2;
    --- 回滚
    ROLLBACK TO SAVEPOINT POINT_NAME1;
    --- 提交本次事务
    COMMIT;
    
  • 索引

    • 如同使用索引在图书馆检索书籍,在书中检索内容一样,数据库中的索引用于定位表中的行,与普通的数据表不同,索引是一种以特定的顺序保存的专用表。不过,索引并不包含实体中的所有数据,索引保存的是用于定位某行的那些列(作为查询条件)及描述这些行的物理信息。因此,索引就是为了便捷化检索表中行和列的子集,而不用检索表中的每行。
    • 查看表中的索引
    SHOW INDEX FROM TABLE_NAME \G;
    
    • 为已存在的表添加索引
    ALTER TABLE TABLE_NAME ADD INDEX INDEX_NAME (COL_NAME);
    
    • 创建唯一索引,之后试图向表中插入该列重复的数据时会报错。
    ALTER TABLE TABLE_NAME ADD UNIQUE INDEX_NAME (COL_NAME);
    
    • 删除已存在的索引
    ALTER TABLE TABLE_NAME DROP INDEX INDEX_NAME;
    
    • 常用索引类型
      • B树索引,保持平衡,不需要查询更多层次
      • 位图索引,低基数(每列只有几个可选值)大量重复数据时适用,类似于独热编码,对应位为1其余位为0
      • 文本索引,数据库在存储文档时,允许用户在文档中查找单词或者短语。
    • 查看索引是如何使用的
    --- 查询优化器如何处理SQL语句
    EXPLAIN SELECT * FROM TABLE_NAME WHERE COOND1 \G;
    
    • 过多过少的使用索引
      • 每个索引事实上都是一个表。每次对表添加或删除数据行时,表中的所有索引都要被修改;当更新行时,受到影响的列的任何索引也必须被修改。所以,索引过多,会拖慢服务器处理任务的速度。
      • 索引占用磁盘空间;需要花费精力去管理;
  • 约束

    • 常用约束类型
      • 主键约束

        标志一列或多列,并保证其值在表中的唯一性

      • 外键约束

        限制一列或多列的值必须包含在另一个表的外键中

      • 唯一约束

        限制一列或多列的值,保证其在表内的唯一性

      • 检查约束

        限制一列的可用值范围

    • 创建主键
    --- 建表时指定
    CONSTRAINT PK_NAME PRIMARY KEY (COL_NAME);
    --- 为已存在的表设置主键
    ALTER TABLE TABLE_NAME ADD CONSTRAINT PK_NAME PRIMARY KEY (COL_NAME);
    --- 删除只需要把ADD改为DROP
    
    • 创建外键
    --- 建表时指定
    CONSTRAINT FK_NAME FOREIGN KEY (COL_NAME)
    REFER ENCES PRIMARY_TABLE_NAME (COL_NAME);
    --- 为已存在的表设置外键
    ALTER TABLE TABLE_NAME ADD 
    CONSTRAINT FK_NAME FOREIGN KEY (COL_NAME)
    REFERENCES PRIMARY_TABLE_NAME (COL_NAME);
    --- ON UPDATE CASCADE 改变主表外键的值,使用此外键的子表的值也会改变
    --- ON DELETE CASCADE 级联删除,删除主表中的外键行,使用此外键的子表中的相应数据也会被删除。
    --- 删除外键
    ALTER TABLE TABLE_NAME
    DROP FOREIGN KEY FK_NAME
    
    • 外键约束MYSQL会生成索引,而Oracle不生产
  • 视图

    • SQL结果集构成的虚拟表
    • 创建视图
    CREATE VIEW VIEW_NAME (
        COL_NAME1,
        COL_NAME2,
        COL_NAME3
        )
    AS 
        SELECT 
        COL_NAME1,
        COL_NAME2,
        COL_NAME3
    FROM
        TABLE_NAME;
    
    • 将已存在的视图转成表:
    CREATE TABLE TABLE_NAME
    AS 
    SELECT * FROM VIEW_NAME;
    
    • 修改已存在的视图
    CREATE OR REPLACE VIEW VIEW_NAME
    (COL_NAME1,
    COL_NAME2)
    AS ...
    
    • 使用视图的好处:
      保护数据隐私,为终端用户屏蔽复杂性,数据聚合,连接拆分分区的数据。
    • 可更新试图的条件(MYSQL)
      • 没有使用聚合函数
      • 没有使用GROUP BY 和 HAVING 子句
      • SELECT或FROM子句中不存在子查询,并且WHERE子句中的任何子查询都不引用FROM中的表;
      • 视图中没有使用UNION,UNION ALL和DISTINCT
      • FROM子句中包括不止一个表或可更新试图 且只使用内联接
      • 包含导出列的视图不能用于插入数据
  • 元数据

    • 除了存储用户插入数据库中的所有数据,数据库服务器也需要创建数据库对象(表、试图、索引等)。
    • 元数据本质是关于数据的数据。
    • MYSQL通过information_schema数据库来提供元数据。
    • Oralcle中通过user_tablesall_constraintsdba_来提供元数据的信息
    • 可通过SQL查询检索模式对象相关的信息
    • 利用元数据中存放的表,列,主键和索引信息生成创建表的语句
    • 部署验证,部署脚本运行后,查询某个数据库模式中每个表的列数索引数及主键约束数。
    • 编程语言通常包括与关系数据库连接的能力,但在语法中不包括SQL语句,SQL语句以字符串形式提交。提交字符串给数据库引擎而不是使用它的SQL接口通常被称为动态SQL执行。
    • MYSQL为执行动态SQL准备的语句
    --- SET设置变量
    SET @QRY = 'SELECT * FROM TABLE_NAME';
    --- 将sql语句提交给数据库引擎,解析安全见和优化
    PREPARE MY_DYN_SQL FROM @QRY;
    --- 执行sql语句
    EXECUTE MY_DYN_SQL;
    --- 关闭语句,释放执行中所使用的数据库资源
    DEALLOCATE PREPARE MY_DYN_SQL;
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值