SQL基础操作语句

SQL数据库基本操作

mysql -uroot -p            # 在终端打开 mysql 
exit;                    #退出MySQL数据库服务器
create database 数据库名;   # 创建数据库
drop database 数据库名;     # 删除数据库
show databases;            # 查看已经创建的数据库
use 数据库名;               # 使用某个数据库

修改密码语句
 alter user 'root'@'localhost' identified by '123456';

显示所有数据库
show databases;
-- 创建数据库
CREATE DATABASE test;
-- 切换数据库
use test;
-- 显示数据库中的所有表
show tables;
-- 创建数据表
CREATE TABLE pet (
    name VARCHAR(20),
    owner VARCHAR(20),
    species VARCHAR(20),
    sex CHAR(1),
    birth DATE,
    death DATE
);
-- 查看数据表结构
-- describe pet;
desc pet;
-- 查询表
SELECT * from pet;
-- 插入数据
INSERT INTO pet VALUES ('puffball', 'Diane', 'hamster', 'f', '1990-03-30', NULL);
-- 修改数据
UPDATE pet SET name = 'squirrel' where owner = 'Diane';
-- 删除数据
DELETE FROM pet where name = 'squirrel';
-- 删除表
DROP TABLE myorder;

 如何查看数据表的架构?   
describe tableName;
 说明:
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
 Field    :    字段的名称
 Type     :    字段的类型,可以有int    char    varchar    
 Key      :    是否是关键字 如可以定义为:  primary key 或者 unique key   ...
Default: :    若是该字段没有主动设置值的时候,该字段的默认值是什么?

如何插入数据?
 INSERT INTO pet VALUES('kk','cc','dog','1','1998-8-2',null);
           +------+-------+---------+------+------------+-------+
           | name | owner | specise | sex  | brith      | death |
           +------+-------+---------+------+------------+-------+
           | kk   | cc    | dog     |      | 1998-08-02 | NULL  |
           +------+-------+---------+------+------------+-------+
       注意:
           NULL:代表的是空,表示该字段还没有数据.千万不要主动填写'NULL',这代表你的字段有一个值叫做'null'.

其实还有一种写法:
                 
INSERT INTO pet(name,owner) VALUES ('xx','cc');
代表我只在name和owner字段上面插入的一条,其他皆为NULL/默认值的数据

mysql建表约束

  • 主键约束
    它能够唯一确定一张表中的一条记录,增加主键约束之后,就可以使得字段不重复而且不为空。

     create table user(
        id int PRIMARY KEY,
        name VARCHAR(20)
     );
     INSERT INTO user VALUES (1,'张三');
     	
     +----+------+
     | id | name |
     +----+------+
     |  1 | 张三 |
     +----+------+
     
     运行DESCRIBE user;
     +-------+-------------+------+-----+---------+-------+
     | Field | Type        | Null | Key | Default | Extra |
     +-------+-------------+------+-----+---------+-------+
     | id    | int(11)     | NO   | PRI | NULL    |       |
     | name  | varchar(20) | YES  |     | NULL    |       |
     +-------+-------------+------+-----+---------+-------+
     发现 id是不可以为null 而且 key的值 也变为:PRI(primary)
    
  • 联合主键(复合主键)
    只要联合起来的主键值加起来不重复就可以。

     CREATE TABLE user2(
         id INT,
         name VARCHAR(20),
         password VARCHAR(20),
         PRIMARY key(id,name)
     );
     
     运行DESCRIBE user2;
     +----------+-------------+------+-----+---------+-------+
     | Field    | Type        | Null | Key | Default | Extra |
     +----------+-------------+------+-----+---------+-------+
     | id       | int(11)     | NO   | PRI | NULL    |       |
     | name     | varchar(20) | NO   | PRI | NULL    |       |
     | password | varchar(20) | YES  |     | NULL    |       |
     +----------+-------------+------+-----+---------+-------+
      select * from user2;
     +----+------+----------+
     | id | name | password |
     +----+------+----------+
     |  1 | zcc  | 345      |
     |  2 | zc2  | 345      |
     +----+------+----------+
      select * from user2;
     +----+------+----------+
     | id | name | password |
     +----+------+----------+
     |  1 | zcc  | 345      |
     |  2 | zc2  | 345      |
     |  2 | zcc  | 345      |
     +----+------+----------+
    
  • 自增约束

       CREATE TABLE user3(
         id INT PRIMARY KEY AUTO_INCREMENT,
         name VARCHAR(20)
     );
     
     运行DESCRIBE user3;
     +-------+-------------+------+-----+---------+----------------+
     | Field | Type        | Null | Key | Default | Extra          |
     +-------+-------------+------+-----+---------+----------------+
     | id    | int(11)     | NO   | PRI | NULL    | auto_increment |
     | name  | varchar(20) | YES  |     | NULL    |                |
     +-------+-------------+------+-----+---------+----------------+
     
     INSERT INTO user3(name) VALUES('zcc');
     INSERT INTO user3(name) VALUES('zc');
     +----+------+
     | id | name |
     +----+------+
     |  1 | zcc |
     |  2 | zc |
     +----+------+
     没有自定义id值 但是自动生成了id
    
    • 如果创建表的时候忘记创建主键约束了?该怎们办?

         CREATE TABLE user4(
         		    id INT ,
         		    name VARCHAR(20)
         		);
         desc user4;
         +-------+-------------+------+-----+---------+-------+
         | Field | Type        | Null | Key | Default | Extra |
         +-------+-------------+------+-----+---------+-------+
         | id    | int         | YES  |     | NULL    |       |
         | name  | varchar(20) | YES  |     | NULL    |       |
         +-------+-------------+------+-----+---------+-------+
         
         alter table user4 add primary key(id);
         desc user4;
         +-------+-------------+------+-----+---------+-------+
         | Field | Type        | Null | Key | Default | Extra |
         +-------+-------------+------+-----+---------+-------+
         | id    | int         | NO   | PRI | NULL    |       |
         | name  | varchar(20) | YES  |     | NULL    |       |
         +-------+-------------+------+-----+---------+-------+
         如何删除主键约束?
         alter table user4 drop primary key;
         使用modify修改字段添加约束。
         alter table user4 modify id int primary key;
      
  • 唯一约束
    约束修饰字段的值不能重复

     CREATE TABLE user5(
         id INT PRIMARY KEY AUTO_INCREMENT,
         name VARCHAR(20)
     );
     运行 DESCRIBE user5;
     +-------+-------------+------+-----+---------+----------------+
     | Field | Type        | Null | Key | Default | Extra          |
     +-------+-------------+------+-----+---------+----------------+
     | id    | int(11)     | NO   | PRI | NULL    | auto_increment |
     | name  | varchar(20) | YES  |     | NULL    |                |
     +-------+-------------+------+-----+---------+----------------+
     
     新增name为唯一约束:
     ALTER TABLE user5 ADD UNIQUE(name);
     运行 DESCRIBE user5;
     +-------+-------------+------+-----+---------+----------------+
     | Field | Type        | Null | Key | Default | Extra          |
     +-------+-------------+------+-----+---------+----------------+
     | id    | int(11)     | NO   | PRI | NULL    | auto_increment |
     | name  | varchar(20) | YES  | UNI | NULL    |                |
     +-------+-------------+------+-----+---------+----------------+
     测试:插入数据
     INSERT INTO user5(name) VALUES ('cc');
     运行 SELECT * FROM user5; 查看结果:
     +----+------+
     | id | name |
     +----+------+
     |  1 | cc   |
     +----+------+
     再次插入INSERT INTO user5(name) VALUES ('cc');
     出现:ERROR 1062 (23000): Duplicate entry 'cc' for key 'name'
     
     换个试试 INSERT INTO user5(name) VALUES ('aa');
     运行 SELECT * FROM user5; 查看结果:
     +----+------+
     | id | name |
     +----+------+
     |  3 | aa   |
     |  1 | cc   |
     +----+------+
     总结一下:
         主键约束(primary key)中包含了唯一约束
     场景:业务需求:设计一张用户注册表,用户姓名必须要用手机号来注册,而且手机号和用户名称都不能为空,那么:
     CREATE TABLE user_test(
         id INT PRIMARY KEY AUTO_INCREMENT COMMENT'主键id',
         name VARCHAR(20) NOT NULL COMMENT'用户姓名,不能为空',
         phone_number VARCHAR(20) UNIQUE NOT NULL COMMENT'用户手机,不能重复且不能为空'
     );
     运行 DESCRIBE user_test;
     +--------------+-------------+------+-----+---------+----------------+
     | Field        | Type        | Null | Key | Default | Extra          |
     +--------------+-------------+------+-----+---------+----------------+
     | id           | int(11)     | NO   | PRI | NULL    | auto_increment |
     | name         | varchar(20) | NO   |     | NULL    |                |
     | phone_number | int(11)     | NO   | UNI | NULL    |                |
     +--------------+-------------+------+-----+---------+----------------+
     这样的话就达到了每一个手机号都只能出现一次,达到了每个手机号只能被注册一次.
     用户姓名可以重复,但是手机号码却不能重复,符合正常的逻辑需求
    
  • 添加约束总结:
    1.建表的时候添加约束;
    2.可以使用alter … add …
    3.alter … modify …
    4.删除: alter … drop …

  • 非空约束
    修饰的字段不能为空

      create table user6(id int, name varchar(20) not null);
      desc user6;
     +-------+-------------+------+-----+---------+-------+
     | Field | Type        | Null | Key | Default | Extra |
     +-------+-------------+------+-----+---------+-------+
     | id    | int         | YES  |     | NULL    |       |
     | name  | varchar(20) | NO   |     | NULL    |       |
     +-------+-------------+------+-----+---------+-------+
     
     insert into user6 values(1,'张三');
      insert into user6 (name) values('三');
     
      select * from user6;
     +------+--------+
     | id   | name   |
     +------+--------+
     |    1 | 张三   |
     | NULL | 三     |
     +------+--------+
    
  • 默认约束
    当我们插入字段值的时候如果没有传值,就会使用默认值;

     create table user7(id int, name varchar(20),age int default 10);
     Query OK, 0 rows affected (0.03 sec)
     
     mysql> desc user7;
     +-------+-------------+------+-----+---------+-------+
     | Field | Type        | Null | Key | Default | Extra |
     +-------+-------------+------+-----+---------+-------+
     | id    | int         | YES  |     | NULL    |       |
     | name  | varchar(20) | YES  |     | NULL    |       |
     | age   | int         | YES  |     | 10      |       |
     +-------+-------------+------+-----+---------+-------+
     
     mysql> insert into user7(id,name) values(1,'dsd');
     Query OK, 1 row affected (0.01 sec)
     
     mysql> insert into user7(id,name,age) values(1,'dsd',20);
     Query OK, 1 row affected (0.01 sec)
     
     mysql> select * from user7;
     +------+------+------+
     | id   | name | age  |
     +------+------+------+
     |    1 | dsd  |   10 |
     |    1 | dsd  |   20 |
     +------+------+------+
     应用场景:
     业务需求:找正常的用户,对这些正常用户进行发放优惠卷或者积分之类的东西,而被禁封的用户我们不让其参加多动.
     我们想要封用户只要将status的值从0改为1就行了,当然我们取用户的时候必须要先判断status是否是0.若是1.说明该用户已经被禁封.
     先封手机号为'1234'的用户:
     UPDATE user6 SET status = 1 WHERE phone_number= '1234';
     SELECT * FROM user6;
     +----+------+--------------+--------+
     | id | name | phone_number | status |
     +----+------+--------------+--------+
     |  1 | aa   | 123          |      0 |
     |  2 | bb   | 1234         |      1 |
     |  3 | cc   | 1263456      |      0 |
     +----+------+--------------+--------+
     status为1,说明用户已经被封,该用户不可以参加活动
     
     我们取用户的时候加上status的判断,如:
     SELECT * FROM user6 WHERE status = 0;
     +----+------+--------------+--------+
     | id | name | phone_number | status |
     +----+------+--------------+--------+
     |  1 | aa   | 123          |      0 |
     |  3 | cc   | 1263456      |      0 |
     +----+------+--------------+--------+
    
  • 外键约束:
    涉及两个表:主表,副表(父表,子表);
    1.主表(父表)classes 中没有的数据值,在副表(子表)中,是不可以使用的。
    2.主表中记录被副表引用,是不可以被删除的。

     mysql> create table classes(id int primary key,name varchar(20));
     Query OK, 0 rows affected (0.04 sec)
     
     mysql> create table students(id int primary key,name varchar(20),class_id int, foreign key(class_id) references classes(id));
     Query OK, 0 rows affected (0.04 sec)
     
     mysql> desc classes;
     +-------+-------------+------+-----+---------+-------+
     | Field | Type        | Null | Key | Default | Extra |
     +-------+-------------+------+-----+---------+-------+
     | id    | int         | NO   | PRI | NULL    |       |
     | name  | varchar(20) | YES  |     | NULL    |       |
     +-------+-------------+------+-----+---------+-------+
     2 rows in set (0.00 sec)
     
     mysql> desc students;
     +----------+-------------+------+-----+---------+-------+
     | Field    | Type        | Null | Key | Default | Extra |
     +----------+-------------+------+-----+---------+-------+
     | id       | int         | NO   | PRI | NULL    |       |
     | name     | varchar(20) | YES  |     | NULL    |       |
     | class_id | int         | YES  | MUL | NULL    |       |
     +----------+-------------+------+-----+---------+-------+
     3 rows in set (0.00 sec)
     
     mysql> insert into classes values(1,'一班');
     Query OK, 1 row affected (0.01 sec)
     
     mysql> insert into classes values(2,'二班');
     Query OK, 1 row affected (0.01 sec)
     
     mysql> insert into classes values(3,'三班');
     Query OK, 1 row affected (0.01 sec)
     
     mysql> insert into classes values(4,'四班');
     Query OK, 1 row affected (0.01 sec)
     
     mysql> select * from classes;
     +----+--------+
     | id | name   |
     +----+--------+
     |  1 | 一班   |
     |  2 | 二班   |
     |  3 | 三班   |
     |  4 | 四班   |
     +----+--------+
     4 rows in set (0.00 sec)
     
     mysql> insert into students values(1001,'张三',1);
     Query OK, 1 row affected (0.01 sec)
     
     mysql> insert into students values(1002,'张三',2);
     Query OK, 1 row affected (0.01 sec)
     
     mysql> insert into students values(1003,'张三',3);
     Query OK, 1 row affected (0.01 sec)
     
     mysql> insert into students values(1004,'张三',4);
     Query OK, 1 row affected (0.01 sec)
     
     
     mysql> select * from students;
     +------+--------+----------+
     | id   | name   | class_id |
     +------+--------+----------+
     | 1001 | 张三   |        1 |
     | 1002 | 张三   |        2 |
     | 1003 | 张三   |        3 |
     | 1004 | 张三   |        4 |
     +------+--------+----------+
     4 rows in set (0.00 sec)
     
     mysql> insert into students values(1005,'张三',5);
     ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`students`, CONSTRAINT `students_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `classes` (`id`))
     mysql> delete from classes where id=4;
     ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test`.`students`, CONSTRAINT `students_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `classes` (`id`))
    

猜你喜欢

转载自blog.csdn.net/weixin_44847326/article/details/111810758